今天,我們將結合前幾天學習的資料分析與機器學習知識,完成一個小型專案:利用回歸模型預測房價。這是機器學習中的一個經典案例,適合初學者了解數據處理、特徵選擇與模型訓練的完整流程。
課程目標
- 熟悉機器學習專案的基本流程:數據處理、建模、評估。
- 使用 Scikit-learn 實作回歸模型(線性迴歸與隨機森林)。
- 進一步強化對數據分析與機器學習模型的理解。
課程內容
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()
|
課後作業
特徵重要性分析:
使用隨機森林模型的 feature_importances_
屬性,找出對房價預測最重要的特徵。
超參數調整:
嘗試調整隨機森林的超參數(如 n_estimators
, max_depth
),觀察模型性能的變化。
思考與回答:
- 線性迴歸與隨機森林的優劣勢各是什麼?
- 如何進一步改進房價預測模型?