文章

AI 第14天:小型專案:預測房價

今天,我們將結合前幾天學習的資料分析與機器學習知識,完成一個小型專案:利用回歸模型預測房價。這是機器學習中的一個經典案例,適合初學者了解數據處理、特徵選擇與模型訓練的完整流程。


課程目標

  1. 熟悉機器學習專案的基本流程:數據處理、建模、評估。
  2. 使用 Scikit-learn 實作回歸模型(線性迴歸與隨機森林)。
  3. 進一步強化對數據分析與機器學習模型的理解。

課程內容

1. 專案背景

本專案使用 波士頓房價數據集(Boston Housing Dataset)。目標是根據房屋相關的特徵(如房間數量、地區犯罪率等)預測房價。


2. 數據集介紹

特徵說明

  • CRIM: 每人平均犯罪率
  • ZN: 住宅用地超過 25000 平方英尺的比例
  • RM: 每棟住宅的平均房間數
  • AGE: 自住單位建造年數的比例
  • LSTAT: 低收入人群比例
  • MEDV: 房價中位數(目標變數)

3. 數據處理

3.1 載入數據與探索分析

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
from sklearn.datasets import load_boston
import pandas as pd
import numpy as np

# 載入波士頓房價數據集
boston = load_boston()
df = pd.DataFrame(data=boston.data, columns=boston.feature_names)
df['PRICE'] = boston.target

# 瀏覽數據集資訊
print(df.head())
print(df.info())

# 繪製房價的基本統計數據
import matplotlib.pyplot as plt
plt.hist(df['PRICE'], bins=30, edgecolor='k')
plt.title('房價分布')
plt.xlabel('房價 (千美元)')
plt.ylabel('頻率')
plt.show()

3.2 處理缺失值與標準化

1
2
3
4
5
6
7
8
9
10
11
12
13
from sklearn.preprocessing import StandardScaler

# 檢查是否有缺失值
print("缺失值檢查:")
print(df.isnull().sum())

# 特徵標準化
scaler = StandardScaler()
scaled_features = scaler.fit_transform(df.drop(columns=['PRICE']))

# 更新數據框架
scaled_df = pd.DataFrame(data=scaled_features, columns=boston.feature_names)
scaled_df['PRICE'] = df['PRICE']

4. 機器學習建模

4.1 資料分割

1
2
3
4
5
6
7
8
from sklearn.model_selection import train_test_split

# 定義特徵與目標變數
X = scaled_df.drop(columns=['PRICE'])
y = scaled_df['PRICE']

# 分割訓練集與測試集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)

4.2 建立線性迴歸模型

1
2
3
4
5
6
7
8
9
10
11
from sklearn.linear_model import LinearRegression
from sklearn.metrics import mean_squared_error

# 建立線性迴歸模型
lr = LinearRegression()
lr.fit(X_train, y_train)

# 預測與評估
y_pred = lr.predict(X_test)
mse = mean_squared_error(y_test, y_pred)
print(f"線性迴歸模型的 MSE: {mse:.2f}")

4.3 建立隨機森林模型

1
2
3
4
5
6
7
8
9
10
from sklearn.ensemble import RandomForestRegressor

# 建立隨機森林模型
rf = RandomForestRegressor(n_estimators=100, random_state=42)
rf.fit(X_train, y_train)

# 預測與評估
y_pred_rf = rf.predict(X_test)
mse_rf = mean_squared_error(y_test, y_pred_rf)
print(f"隨機森林模型的 MSE: {mse_rf:.2f}")

4.4 比較模型性能

1
2
3
4
5
6
7
print(f"線性迴歸模型的 MSE: {mse:.2f}")
print(f"隨機森林模型的 MSE: {mse_rf:.2f}")

if mse < mse_rf:
    print("線性迴歸表現更佳!")
else:
    print("隨機森林表現更佳!")

5. 可視化預測結果

1
2
3
4
5
6
7
8
plt.scatter(y_test, y_pred_rf, alpha=0.7, color='blue', label='隨機森林')
plt.scatter(y_test, y_pred, alpha=0.7, color='red', label='線性迴歸')
plt.plot([min(y_test), max(y_test)], [min(y_test), max(y_test)], color='black', linestyle='--')
plt.title('實際值 vs 預測值')
plt.xlabel('實際值')
plt.ylabel('預測值')
plt.legend()
plt.show()

課後作業

  1. 特徵重要性分析
    使用隨機森林模型的 feature_importances_ 屬性,找出對房價預測最重要的特徵。

  2. 超參數調整
    嘗試調整隨機森林的超參數(如 n_estimators, max_depth),觀察模型性能的變化。

  3. 思考與回答:

    • 線性迴歸與隨機森林的優劣勢各是什麼?
    • 如何進一步改進房價預測模型?
本文章以 CC BY 4.0 授權