Python 数据分析与可视化 Day 12 - 建模前准备与数据集拆分
✅ 今日目标
- 掌握建模前常见准备步骤
- 学会使用
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() | 检查是否严重偏斜 |