現在知道每一種訓練模型他的應用場景以及優缺點後,就回到我們的目的了,因為我們是要做房價的預測,看起來「線性回歸、隨機森林、梯度提升樹」都是可以試試看的模型,我們就以這三個來測試看看效果吧!
import numpy as np
from sklearn.model_selection import train_test_split, cross_val_score
from sklearn.linear_model import LinearRegression
from sklearn.ensemble import RandomForestRegressor
from xgboost import XGBRegressor
from sklearn.metrics import mean_squared_error, r2_score
# 分割數據
X_train, X_test, y_train, y_test = train_test_split(X_processed, y, test_size=0.2, random_state=42)
# 定義評估函數
def evaluate_model(model, X, y):
predictions = model.predict(X)
mse = mean_squared_error(y, predictions)
rmse = np.sqrt(mse)
r2 = r2_score(y, predictions)
return rmse, r2
# 1. 線性回歸
lr_model = LinearRegression()
lr_model.fit(X_train, y_train)
lr_rmse, lr_r2 = evaluate_model(lr_model, X_test, y_test)
# 2. 隨機森林
rf_model = RandomForestRegressor(n_estimators=100, random_state=42)
rf_model.fit(X_train, y_train)
rf_rmse, rf_r2 = evaluate_model(rf_model, X_test, y_test)
# 3. XGBoost
xgb_model = XGBRegressor(n_estimators=100, learning_rate=0.1, random_state=42)
xgb_model.fit(X_train, y_train)
xgb_rmse, xgb_r2 = evaluate_model(xgb_model, X_test, y_test)
# 打印結果
print("線性回歸 - RMSE: {:.4f}, R2: {:.4f}".format(lr_rmse, lr_r2))
print("隨機森林 - RMSE: {:.4f}, R2: {:.4f}".format(rf_rmse, rf_r2))
print("XGBoost - RMSE: {:.4f}, R2: {:.4f}".format(xgb_rmse, xgb_r2))
# 使用交叉驗證進行更穩健的評估
models = [
("線性回歸", LinearRegression()),
("隨機森林", RandomForestRegressor(n_estimators=100, random_state=42)),
("XGBoost", XGBRegressor(n_estimators=100, learning_rate=0.1, random_state=42))
]
for name, model in models:
scores = cross_val_score(model, X_processed, y, cv=5, scoring='neg_mean_squared_error')
rmse_scores = np.sqrt(-scores)
print(f"{name} 交叉驗證 RMSE: {rmse_scores.mean():.4f} (+/- {rmse_scores.std() * 2:.4f})")
同時測試多個模型的好處是可以判斷「那個模型的表現比較好」,這樣也可以幫助我們找到合適的模型來進行訓練。
主要判斷的方式是透過 RMSE 和 R2:
實際執行的結果是
因此透過我們實測的結果就可以發現「線性回歸」就不是一個適合我們的模型,反而是隨機森林和 XGBoost 這兩個看起來不相上下,但為了更好的訓練,看起來 XGBoost 會是更好的選擇!這樣我們就選擇到最適合我們的模型了,接下來就是調整參數了!
我們當然要盡可能地讓測試的結果更好,這樣才可以讓模型的效果達到最大化,因此接下來就會需要來優化我們的模型啦!