? 今日目標
- 掌握建模前常見準備步驟
- 學會使用
train_test_split()
將數據劃分為訓練集和測試集 - 理解特征(X)與標簽(y)的區分
- 學習常見建模流程的輸入要求(格式、維度)
📘 一、建模前準備流程概覽
- 數據清洗(缺失值、異常值處理)?
- 特征工程(編碼、標準化、派生)?
- 數據集劃分(訓練 / 測試)?
- 模型選擇與訓練(下一階段)
- 模型評估與調參
📚 二、提取特征列與標簽列
import pandas as pddf = pd.read_csv("data/processed/students_featured.csv")# 特征列(可以自定義選擇)
X = df[["成績_標準化", "性別_女", "性別_男", "是否及格_數值"]]# 標簽列(以是否及格為預測目標)
y = df["是否及格_數值"]
📘 三、劃分訓練集與測試集
from sklearn.model_selection import train_test_split# 按 80% 訓練 / 20% 測試,隨機種子保持一致性
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42
)print("訓練集樣本數:", len(X_train))
print("測試集樣本數:", len(X_test))
📘 四、保存拆分結果(供建模使用)
X_train.to_csv("data/model/X_train.csv", index=False)
X_test.to_csv("data/model/X_test.csv", index=False)
y_train.to_csv("data/model/y_train.csv", index=False)
y_test.to_csv("data/model/y_test.csv", index=False)
📊 可選探索:類別平衡性檢查
print("訓練集是否及格分布:")
print(y_train.value_counts(normalize=True))print("測試集是否及格分布:")
print(y_test.value_counts(normalize=True))
🧪 今日練習建議
-
從增強后的數據中提取合適的特征列(X)和目標列(y)
-
使用
train_test_split
按比例劃分訓練 / 測試集 -
將結果分別保存到 CSV 文件
-
檢查樣本比例是否合理、是否存在類別不平衡問題(特別是分類任務)
import pandas as pd from sklearn.model_selection import train_test_split import os# 1. 加載數據 input_path = "data/processed/students_featured.csv" if not os.path.exists(input_path):raise FileNotFoundError("? 請先運行 feature_engineering.py 生成 students_featured.csv")df = pd.read_csv(input_path) print("? 已加載數據:", input_path) print(df)# 2. 提取特征列和標簽列 feature_cols = ["成績_標準化", "性別_女", "性別_男", "是否及格_數值"] label_col = "是否及格_數值"X = df[feature_cols] y = df[label_col]print("\n🔍 特征維度:", X.shape) print("🔍 標簽維度:", y.shape)# 3. 劃分訓練集和測試集(80% / 20%) X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42 )print(f"\n📦 拆分完成:訓練集 {len(X_train)} 條,測試集 {len(X_test)} 條")# 4. 可選:檢查類別平衡性 print("\n📊 訓練集類別分布:") print(y_train.value_counts(normalize=True))print("\n📊 測試集類別分布:") print(y_test.value_counts(normalize=True))# 5. 保存拆分結果 os.makedirs("data/model", exist_ok=True) X_train.to_csv("data/model/X_train.csv", index=False) X_test.to_csv("data/model/X_test.csv", index=False) y_train.to_csv("data/model/y_train.csv", index=False) y_test.to_csv("data/model/y_test.csv", index=False)print("\n? 拆分后的數據已保存至 data/model/ 文件夾")
運行輸出:
? 已加載數據: data/processed/students_featured.csv姓名 成績 是否及格 性別編碼 性別_女 性別_男 成績_標準化 成績_歸一化 是否及格_數值 成績等級 考試時間 考試月 考試周 考試星期
0 張三 88.0 True 1 False True 1.166997 1.000000 1 優 2024-06-01 6 22 Saturday
1 李四 78.0 True 0 True False 0.214346 0.655172 1 良 2024-06-01 6 22 Saturday
2 王五 59.0 False 1 False True -1.595690 0.000000 0 不及格 2024-06-01 6 22 Saturday
3 田七 78.0 True 0 True False 0.214346 0.655172 1 良 2024-06-01 6 22 Saturday🔍 特征維度: (4, 4)
🔍 標簽維度: (4,)📦 拆分完成:訓練集 3 條,測試集 1 條📊 訓練集類別分布:
是否及格_數值
1 0.666667
0 0.333333
📊 測試集類別分布:
是否及格_數值
1 1.0
? 拆分后的數據已保存至 data/model/ 文件夾
x測試集:
x訓練集:
y測試集:
y訓練集:
🧾 今日總結
步驟 | 工具 | 說明 |
---|---|---|
特征提取 | Pandas DataFrame | 自定義特征列 |
數據拆分 | train_test_split | 來自 sklearn |
保存格式 | CSV | 便于后續建模使用 |
類別分析 | value_counts() | 檢查是否嚴重偏斜 |