簡介
這是該系列的第一個迷你項目。目標不是優化到最佳水平,而是讓您從頭到尾經歷整個過程:了解資料、選擇特徵、分割訓練/測試、建立基準、訓練模型、評估並得出結論。
問題背景
您擁有一個城市的住房數據,其中包含以下資訊:
- 面積
- 臥室數量
- 廁所號碼
- 區
- 房屋年齡
- 售價
目標是預測新房的房價。
迷你專案目標
- 進行基本的 EDA 來理解數據
- 建立第一個基線
- 訓練至少一個迴歸模型
- 使用指標給出明確的結論
1. 業務問題
房地產經紀人或清單系統想要估算新房子的公平售價。
對應的機器學習問題:
輸入房屋資訊後,預計售價是多少?
2. 最低 EDA 要求
import pandas as pd
df = pd.read_csv('data/raw/houses.csv')
print(df.head())
print(df.shape)
print(df.info())
print(df.isnull().sum())
print(df.describe())
您至少需要回答以下問題:
1.有多少行數據? 2. 是否有任何欄位缺少資料? 3. 目標列是什麼? 4. 模型中是否存在沒有意義的列?
3.選擇第一個特徵
在第一輪中,不要選擇太多列。只是幾個明顯的特徵:
features = ['dien_tich', 'so_phong', 'so_toilet', 'tuoi_nha']
X = df[features]
y = df['gia']
第一輪選擇少數特徵的原因:
- 易於調試
- 易於理解每個變數的影響
- 減少複雜資料處理中的錯誤
4. 基線
from sklearn.model_selection import train_test_split
from sklearn.metrics import mean_absolute_error
X_train, X_test, y_train, y_test = train_test_split(
X, y, test_size=0.2, random_state=42
)
baseline_pred = [y_train.mean()] * len(y_test)
baseline_mae = mean_absolute_error(y_test, baseline_pred)
print('Baseline MAE:', baseline_mae)
5.第一個模型
from sklearn.linear_model import LinearRegression
model = LinearRegression()
model.fit(X_train, y_train)
pred = model.predict(X_test)
model_mae = mean_absolute_error(y_test, pred)
print('Model MAE:', model_mae)
6. 讀取結果
例如:
- 基線 MAE:8.5 億
- 模型MAE:4.2億
初步結論:
- 此模型明顯優於基線
- 初步工作流程已步入正軌
- 可以透過特徵工程或更強大的模型進一步改進
7. 進一步擴展
嘗試新增一個分類變量,例如 quan:
X = pd.get_dummies(df[['dien_tich', 'so_phong', 'so_toilet', 'tuoi_nha', 'quan']], drop_first=True)
y = df['gia']
然後再次訓練並比較指標。這是測試新增位置資訊是否確實對模型有幫助的簡單方法。
8. 小型專案後的簡短報告樣本
你應該寫一個像這樣的總結:
我使用 4 個基本數值特徵來預測房價。透過平均價格進行基線預測得出 MAE = X,而線性迴歸得出 MAE = Y。這表明模型已經了解了特徵與售價之間的關係。但該模型目前沒有使用詳細的位置特徵,也沒有處理異常值。
這是一個非常重要的習慣,因為機器學習不僅涉及編碼,還涉及傳達結果。
額外挑戰
- 比較線性迴歸和隨機森林迴歸。
- 嘗試刪除某個功能以查看指標如何變化。
- 創建特徵
gia_m2並檢查使用不當是否有洩漏。
常見錯誤
- 在不理解其含義的情況下使用每一列。
- 在評估之前忘記分開訓練/測試。
- 看到指標優於基線,然後在沒有檢查數據的情況下過早下結論。
完成標準
- 完成了小專案從頭到尾的運行
- 有一個基線和至少 1 個機器學習模型
- 可以寫出關於結果的簡短、易於理解的結論