項目目標:
??????基于房屋特征(如房間數、地理位置等)預測加州地區的房價中位數。
????? 使用 Python 實現機器學習的 房價預測回歸項目(使用 California Housing 數據集)
環境準備
# 安裝必要庫(若未安裝)
# pip install numpy pandas matplotlib scikit-learn seaborn
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
from sklearn.datasets import fetch_california_housing
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.linear_model import LinearRegression
from sklearn.tree import DecisionTreeRegressor
from sklearn.metrics import mean_squared_error, r2_score
完整代碼實現
步驟 1: 加載數據集
# 加載加州房價數據集
california = fetch_california_housing()
X = california.data # 特征數據
y = california.target # 目標變量(房價中位數,單位:萬美元)
feature_names = california.feature_namesprint("特征名稱:", feature_names)
print("樣本數量:", X.shape[0])
print("特征數量:", X.shape[1])
步驟 2: 數據探索
# 轉換為DataFrame
df = pd.DataFrame(X, columns=feature_names)
df['MedHouseVal'] = y# 查看數據概覽
print("\n數據前5行:")
print(df.head())# 統計信息
print("\n數據描述:")
print(df.describe())# 繪制房價分布圖
plt.figure(figsize=(8,5))
sns.histplot(df['MedHouseVal'], bins=50, kde=True)
plt.title("房價中位數分布")
plt.xlabel("房價(萬美元)")
plt.show()# 特征相關性熱力圖
plt.figure(figsize=(10,8))
corr_matrix = df.corr()
sns.heatmap(corr_matrix, annot=True, cmap='coolwarm')
plt.title("特征相關性矩陣")
plt.show()
步驟 3: 數據預處理
# 劃分訓練集和測試集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42
)# 特征標準化
scaler = StandardScaler()
X_train_scaled = scaler.fit_transform(X_train)
X_test_scaled = scaler.transform(X_test)
步驟 4: 模型訓練與比較
# 初始化模型
models = {"Linear Regression": LinearRegression(),"Decision Tree": DecisionTreeRegressor(max_depth=5)
}# 訓練與評估
results = {}
for name, model in models.items():model.fit(X_train_scaled, y_train)y_pred = model.predict(X_test_scaled)# 計算指標mse = mean_squared_error(y_test, y_pred)r2 = r2_score(y_test, y_pred)results[name] = {"MSE": round(mse, 2),"R2": round(r2, 3)}# 展示結果
print("\n模型性能對比:")
for model_name, metrics in results.items():print(f"{model_name}:")print(f" MSE: {metrics['MSE']}")print(f" R2分數: {metrics['R2']}\n")
步驟 5: 結果可視化
# 獲取最佳模型預測結果
best_model = LinearRegression()
best_model.fit(X_train_scaled, y_train)
y_pred = best_model.predict(X_test_scaled)# 繪制實際值與預測值對比
plt.figure(figsize=(8,6))
plt.scatter(y_test, y_pred, alpha=0.5)
plt.plot([0, 5], [0, 5], 'r--') # 理想對角線
plt.xlabel("實際房價")
plt.ylabel("預測房價")
plt.title("實際值 vs 預測值")
plt.show()# 繪制殘差圖
residuals = y_test - y_pred
plt.figure(figsize=(8,6))
sns.histplot(residuals, kde=True)
plt.title("殘差分布")
plt.xlabel("預測誤差")
plt.show()
步驟 6: 特征重要性分析(決策樹)
# 獲取決策樹特征重要性
dt_model = DecisionTreeRegressor(max_depth=5).fit(X_train_scaled, y_train)
importances = dt_model.feature_importances_# 可視化特征重要性
plt.figure(figsize=(10,6))
sns.barplot(x=importances, y=feature_names, palette="viridis")
plt.title("特征重要性排序(決策樹模型)")
plt.xlabel("重要性分數")
plt.show()
輸出示例
特征名稱: ['MedInc', 'HouseAge', 'AveRooms', 'AveBedrms', 'Population', 'AveOccup', 'Latitude', 'Longitude']
樣本數量: 20640
特征數量: 8模型性能對比:
Linear Regression:MSE: 0.56R2分數: 0.602Decision Tree:MSE: 0.68R2分數: 0.517
關鍵分析點
數據特征:
MedInc
(收入中位數)與房價正相關最強模型對比:線性回歸表現優于決策樹(R2分數更高)
殘差分析:誤差大致呈正態分布,但存在高價房低估現象
地理因素:經度(
Longitude
)在決策樹中顯示較高重要性
擴展建議
嘗試其他回歸模型(隨機森林、梯度提升樹)
添加特征交互項(如收入×房間數)
使用網格搜索優化超參數
將經緯度轉換為地理位置聚類特征
部署為API服務(使用Flask/FastAPI)
?