适用练习:2.2.1 ~ 2.2.5(模型训练与测试) 目标:零基础学员也能填对所有下划线,理解机器学习建模全流程


📖 一、填空题通用解题心法(速查表)

下表总结了2.2 所有练习中出现的每一种填空类型,并给出 可以直接照抄的代码模板出现的练习编号

任务类型 典型填空位置 正确代码模板(直接照抄) 出现在哪个练习
📂 读取 CSV / Excel data = __________ pd.read_csv('文件名.csv')pd.read_excel('文件名.xlsx') 全部  2.2
👀 查看前5行 print(__________) data.head()  2.2.1~2.2.5
🎯 定义 X 和 y X = __________ y = __________ data[selected_features]data['目标列']  2.2.1~2.2.5
✂️ 划分训练/测试集 X_train, X_test, y_train, y_test = __________(__________, random_state=42) train_test_split(X, y, test_size=0.2)  2.2.1~2.2.5
💾 保存 CSV(无索引) __________('文件名.csv', __________) data.to_csv('文件名.csv', index=False)  2.2(部分)
🧠 创建模型实例 model = __________(__________) 例如 LogisticRegression(max_iter=1000) 2.2.1~2.2.5
🏋️ 训练模型 __________ model.fit(X_train, y_train) 2.2.1~2.2.5
💾 保存模型(pickle) pickle.__________ pickle.dump(model, file) 2.2.1, 2.2.2, 2.2.3, 2.2.5
💾 保存模型(joblib) joblib.__________ joblib.dump(model, model_filename) 2.2.4
🔮 预测 y_pred = __________ model.predict(X_test) 2.2.1~2.2.5
📊 分类模型评估(准确率) accuracy = __________ model.score(X_test, y_test) 2.2.1
📊 回归模型评估(MSE, R2) mse = __________ r2 = __________ mean_squared_error(y_test, y_pred)r2_score(y_test, y_pred) 2.2.3, 2.2.4, 2.2.5
⚖️ 处理数据不平衡(SMOTE) X_resampled, y_resampled = __________ smote.fit_resample(X_train, y_train) 2.2.1
🧩 Pipeline(标准化+回归) pipeline = __________([('scaler', __________),('linreg', __________)]) Pipeline([('scaler', StandardScaler()), ('linreg', LinearRegression())]) 2.2.2
🏷️ 标签编码(One-Hot / LabelEncoder) X = __________(X) pd.get_dummies(X, drop_first=True)LabelEncoder().fit_transform() 2.2.3, 2.2.4, 2.2.5

记忆口诀: 读看删转筛,存盘记心间;分组计数的,切分加条件。 模型训练三步走:切分 → 创建 → 拟合;预测评估加保存,不平衡用 SMOTE。


🧠 二、每个函数的“人话解释”(生活类比 + 示例)

函数 / 方法 生活类比 代码示例(小白版)
pd.read_csv('file.csv') 打开一个 CSV 表格文件,把内容搬进 Python。 data = pd.read_csv('auto-mpg.csv')
data.head() 瞄一眼表格的前 5 行,确认没读错。 print(data.head())
data.dropna() 扔掉任何一行里有一个空格的整行作业。 data = data.dropna()
pd.to_numeric(col, errors='coerce') 把“马力”列里的问号 ? 变成 NaN data['horsepower'] = pd.to_numeric(data['horsepower'], errors='coerce')
StandardScaler() 标准化:让数据的平均值为 0,标准差为 1,不同单位可以比较。 scaler.fit_transform(data[features])
MinMaxScaler() 归一化:把所有数据压缩到 [0,1] 区间。 scaler.fit_transform(data[cols])
train_test_split(X, y, test_size=0.2) 把数据分成训练集(80%)和测试集(20%),就像把复习资料分成平时练习和模拟考。 X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
LogisticRegression() 逻辑回归:用于分类问题(比如判断会不会违约)。 model = LogisticRegression(max_iter=1000)
LinearRegression() 线性回归:用于预测连续数值(比如燃油效率)。 model = LinearRegression()
RandomForestRegressor() 随机森林回归:多个决策树投票,更稳定。 model = RandomForestRegressor(n_estimators=100, random_state=42)
XGBRegressor() XGBoost 回归:梯度提升树,效果通常更好。 model = XGBRegressor(n_estimators=100, learning_rate=0.05, max_depth=5, random_state=42)
DecisionTreeRegressor() 决策树回归:像一棵问答题树,一步步问下去得到预测值。 model = DecisionTreeRegressor(random_state=42)
model.fit(X_train, y_train) 训练模型:让模型从训练数据中学习规律。 model.fit(X_train, y_train)
model.predict(X_test) 预测:用训练好的模型对测试数据进行预测。 y_pred = model.predict(X_test)
model.score(X_test, y_test) 分类模型返回准确率,回归模型返回 R² 分数。 accuracy = model.score(X_test, y_test)
pickle.dump(model, file) 把训练好的模型保存到硬盘,下次可以直接用。 pickle.dump(model, file)
joblib.dump(model, file) 和 pickle 类似,更适合保存大型模型。 joblib.dump(model, model_filename)
SMOTE() 过采样:把少数类的样本复制/生成,解决类别不平衡。 X_resampled, y_resampled = smote.fit_resample(X_train, y_train)
Pipeline() 把多个步骤(标准化、模型训练)打包成一个流水线。 pipeline = Pipeline([('scaler', StandardScaler()), ('linreg', LinearRegression())])
pd.get_dummies() 把文字类别(如“男”“女”)变成 0/1 两列(哑变量)。 X = pd.get_dummies(X, drop_first=True)
mean_squared_error(y_true, y_pred) 计算均方误差(MSE),越小越好。 mse = mean_squared_error(y_test, y_pred)
r2_score(y_true, y_pred) 计算决定系数(R²),最大为 1,越接近 1 越好。 r2 = r2_score(y_test, y_pred)

📝 三、五个练习的完整填空答案(可直接复制运行)

下面给出  2.2.1 ~ 2.2.5 中所有需要填空的代码行。 注意:实际运行时请根据你的数据集列名微调。

🔹 练习 2.2.1 信用评分 Logistic 回归模型

import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LogisticRegression
import pickle
from sklearn.metrics import classification_report
from imblearn.over_sampling import SMOTE
​
# 加载数据
data = pd.read_csv('Finance.csv')                      # 填空1
print(data.head())                                     # 填空2
​
# 分割训练集和测试集(测试集20%)
X = data.drop(['SeriousDlqin2yrs', 'Unnamed: 0'], axis=1)
y = data['SeriousDlqin2yrs']
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)   # 填空3
​
# 训练 Logistic 回归模型(最大迭代次数为1000次)
model = LogisticRegression(max_iter=1000)              # 填空4
model.fit(X_train, y_train)                            # 填空5
​
# 保存模型
with open('2.2.1_model.pkl', 'wb') as file:
    pickle.dump(model, file)                           # 填空6
​
# 预测并保存结果
y_pred = model.predict(X_test)                         # 填空7
pd.DataFrame(y_pred, columns=['预测结果']).to_csv('2.2.1_results.txt', index=False)
​
# 生成测试报告
report = classification_report(y_test, y_pred, zero_division=1)
with open('2.2.1_report.txt', 'w') as file:
    file.write(report)
​
# 分析测试结果
accuracy = model.score(X_test, y_test)                 # 填空8
print(f"模型准确率: {accuracy:.2f}")
​
# 处理数据不平衡
smote = SMOTE(random_state=42)
X_resampled, y_resampled = smote.fit_resample(X_train, y_train)   # 填空9
​
# 重新训练模型
model.fit(X_resampled, y_resampled)                    # 填空10
y_pred_resampled = model.predict(X_test)               # 填空11
​
# 保存新结果
pd.DataFrame(y_pred_resampled, columns=['预测结果']).to_csv('2.2.1_results_xg.txt', index=False)
​
# 生成新的测试报告
report_resampled = classification_report(y_test, y_pred_resampled, zero_division=1)
with open('2.2.1_report_xg.txt', 'w') as file:
    file.write(report_resampled)
​
accuracy_resampled = model.score(X_test, y_test)       # 填空12
print(f"重新采样后的模型准确率: {accuracy_resampled:.2f}")

🔹 练习 2.2.2 燃油效率线性回归 + 随机森林模型

import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LinearRegression
from sklearn.preprocessing import StandardScaler
from sklearn.pipeline import Pipeline
import pickle
from sklearn.ensemble import RandomForestRegressor
​
# 加载数据集
df = pd.read_csv('auto-mpg.csv')                       # 填空1
print(df.head())                                        # 填空2
​
# 处理缺失值
df['horsepower'] = pd.to_numeric(df['horsepower'], errors='coerce')   # 填空3
df = df.dropna()                                        # 填空4
​
# 选择特征
X = df[['cylinders', 'displacement', 'horsepower', 'weight', 'acceleration', 'model year', 'origin']]   # 填空5
y = df['mpg']                                           # 填空6
​
# 划分数据集(测试集20%)
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)   # 填空7
​
# 创建包含标准化和线性回归的管道
pipeline = Pipeline([('scaler', StandardScaler()), ('linreg', LinearRegression())])   # 填空8
pipeline.fit(X_train, y_train)                          # 填空9
​
# 保存训练好的模型
with open('2.2.2_model.pkl', 'wb') as model_file:
    pickle.dump(pipeline, model_file)                   # 填空10
​
# 预测并保存结果
y_pred = pipeline.predict(X_test)                       # 填空11
results_df = pd.DataFrame(y_pred, columns=['预测结果'])
results_df.to_csv('2.2.2_results.txt', index=False)    # 填空12
​
# 测试模型并保存得分
with open('2.2.2_report.txt', 'w') as results_file:
    results_file.write(f'训练集得分: {pipeline.score(X_train, y_train)}\n')
    results_file.write(f'测试集得分: {pipeline.score(X_test, y_test)}\n')
​
# 创建随机森林回归模型(决策树数量为100)
rf_model = RandomForestRegressor(n_estimators=100, random_state=42)   # 填空13
rf_model.fit(X_train, y_train)                         # 填空14
​
# 预测
y_pred_rf = rf_model.predict(X_test)                   # 填空15
results_rf_df = pd.DataFrame(y_pred_rf, columns=['预测结果'])
results_rf_df.to_csv('2.2.2_results_rf.txt', index=False)   # 填空16
​
# 保存得分
with open('2.2.2_report_rf.txt', 'w') as results_rf_file:
    results_rf_file.write(f'训练集得分: {rf_model.score(X_train, y_train)}\n')
    results_rf_file.write(f'测试集得分: {rf_model.score(X_test, y_test)}\n')

🔹 练习 2.2.3 日常运动量随机森林 + XGBoost 模型

import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.ensemble import RandomForestRegressor
import pickle
from sklearn.metrics import mean_squared_error, r2_score
import xgboost as xgb
​
# 加载数据集
df = pd.read_csv('fitness_analysis.csv')               # 填空1
print(df.head())                                        # 填空2
​
# 将分类变量转为数值变量
X = df[['Your gender', 'How important is exercise to you ?', 'How healthy do you consider yourself?']]
X = pd.get_dummies(X, drop_first=True)                 # 填空3
​
# 设置目标变量(年龄)
y = df['Age'].apply(lambda x: int(x.split(' ')[0]))    # 填空4
​
# 划分数据集(测试集20%)
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)   # 填空5
​
# 创建随机森林回归模型(决策树数量为100)
rf_model = RandomForestRegressor(n_estimators=100, random_state=42)   # 填空6
rf_model.fit(X_train, y_train)                         # 填空7
​
# 保存模型
with open('2.2.3_model.pkl', 'wb') as model_file:
    pickle.dump(rf_model, model_file)                  # 填空8
​
# 预测
y_pred = rf_model.predict(X_test)                      # 填空9
results_df = pd.DataFrame(y_pred, columns=['预测结果'])
results_df.to_csv('2.2.3_results.txt', index=False)
​
# 评估
train_score = rf_model.score(X_train, y_train)         # 填空10
test_score = rf_model.score(X_test, y_test)            # 填空11
mse = mean_squared_error(y_test, y_pred)               # 填空12
r2 = r2_score(y_test, y_pred)                          # 填空13
​
with open('2.2.3_report.txt', 'w') as report_file:
    report_file.write(f'训练集得分: {train_score}\n')
    report_file.write(f'测试集得分: {test_score}\n')
    report_file.write(f'均方误差(MSE): {mse}\n')
    report_file.write(f'决定系数(R^2): {r2}\n')
​
# XGBoost 模型
xgb_model = xgb.XGBRegressor(n_estimators=100, random_state=42)   # 填空14
xgb_model.fit(X_train, y_train)                        # 填空15
y_pred_xgb = xgb_model.predict(X_test)                 # 填空16
​
results_df_xgb = pd.DataFrame(y_pred_xgb, columns=['预测结果'])
results_df_xgb.to_csv('2.2.3_results_xgb.txt', index=False)
​
xgb_train_score = xgb_model.score(X_train, y_train)    # 填空17
xgb_test_score = xgb_model.score(X_test, y_test)       # 填空18
xgb_mse = mean_squared_error(y_test, y_pred_xgb)       # 填空19
xgb_r2 = r2_score(y_test, y_pred_xgb)                  # 填空20
​
with open('2.2.3_report_xgb.txt', 'w') as xgb_report_file:
    xgb_report_file.write(f'XGBoost训练集得分: {xgb_train_score}\n')
    xgb_report_file.write(f'XGBoost测试集得分: {xgb_test_score}\n')
    xgb_report_file.write(f'XGBoost均方误差(MSE): {xgb_mse}\n')
    xgb_report_file.write(f'XGBoost决定系数(R^2): {xgb_r2}\n')

🔹 练习 2.2.4 低碳行为线性回归 + XGBoost 模型

import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LinearRegression
from sklearn.metrics import mean_squared_error, r2_score
import joblib
from xgboost import XGBRegressor
​
# 加载数据集
data = pd.read_excel('低碳行为数据.xlsx')              # 填空1
print(data.head())                                     # 填空2
​
# 删除不必要的列并处理分类变量
data_cleaned = data.drop(columns=['序号', '所用时间']) # 填空3
data_cleaned = pd.get_dummies(data_cleaned, drop_first=True)  # 填空4
​
# 定义目标变量
target = '5.您进行过绿色低碳的相关生活方式吗?'        # 填空5
​
# 定义自变量和因变量
X = data_cleaned.drop(columns=[target])                # 填空6
y = data_cleaned[target]                               # 填空7
​
# 划分数据集(测试集20%)
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)   # 填空8
​
# 线性回归模型
model = LinearRegression()                             # 填空9
model.fit(X_train, y_train)                            # 填空10
​
# 保存模型
model_filename = '2.2.4_model.pkl'
joblib.dump(model, model_filename)                     # 填空11
​
# 预测
y_pred = model.predict(X_test)                         # 填空12
​
# 保存结果
results = pd.DataFrame({'实际值': y_test, '预测值': y_pred})
results.to_csv('2.2.4_results.txt', index=False, sep='\t')   # 填空13
​
# 保存报告
with open('2.2.4_report.txt', 'w') as f:
    f.write(f'均方误差: {mean_squared_error(y_test, y_pred)}\n')   # 填空14
    f.write(f'决定系数: {r2_score(y_test, y_pred)}\n')             # 填空15
​
# XGBoost 模型
xgb_model = XGBRegressor(n_estimators=1000, learning_rate=0.05, max_depth=5, subsample=0.8, colsample_bytree=0.8, random_state=42)   # 填空16
xgb_model.fit(X_train, y_train)                        # 填空17
y_pred_xg = xgb_model.predict(X_test)                  # 填空18
​
results_xg = pd.DataFrame({'实际值': y_test, '预测值': y_pred_xg})
results_xg.to_csv('2.2.4_results_xg.txt', index=False, sep='\t')
​
with open('2.2.4_report_xgb.txt', 'w') as f:
    f.write(f'均方误差: {mean_squared_error(y_test, y_pred_xg)}\n')   # 填空19
    f.write(f'决定系数: {r2_score(y_test, y_pred_xg)}\n')             # 填空20

🔹 练习 2.2.5 智能步数决策树模型

import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.tree import DecisionTreeRegressor
import pickle
from sklearn.metrics import mean_squared_error, mean_absolute_error, r2_score
​
# 加载数据集
df = pd.read_csv('fitness_analysis.csv')               # 填空1
print(df.head())                                        # 填空2
​
# 将分类变量转为数值变量
X = df[['Your gender ', 'How important is exercise to you ?', 'How healthy do you consider yourself?']]
X = pd.get_dummies(X, drop_first=True)                 # 填空3
​
# 设置目标变量(每日步数)
y = df['daily_steps']                                  # 填空4
​
# 划分数据集(测试集20%)
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)   # 填空5
​
# 创建并训练决策树回归模型
model = DecisionTreeRegressor(random_state=42)         # 填空6
model.fit(X_train, y_train)                            # 填空7
​
# 保存模型
with open('2.2.5_model.pkl', 'wb') as model_file:
    pickle.dump(model, model_file)                     # 填空8
​
# 预测
y_pred = model.predict(X_test)                         # 填空9
​
# 保存结果
results = pd.DataFrame({'实际值': y_test, '预测值': y_pred})
results.to_csv('2.2.5_results.txt', index=False, sep='\t')   # 填空10
​
# 保存报告
with open('2.2.5_report.txt', 'w') as f:               # 填空11
    f.write(f'均方误差: {mean_squared_error(y_test, y_pred)}\n')   # 填空12
    f.write(f'平均绝对误差: {mean_absolute_error(y_test, y_pred)}\n') # 填空13
    f.write(f'决定系数: {r2_score(y_test, y_pred)}\n')              # 填空14

⚠️ 四、常见错误 & 调试技巧(小白救急版)

错误现象 最可能的原因 解决办法 幽默提醒
FileNotFoundError 文件名或路径不对 检查文件名大小写、扩展名,或使用绝对路径 Python 找不到文件就像你喊“老王”但他叫“王老五” 😅
KeyError: 'horsepower' 列名写错(大小写、空格) 运行 print(data.columns) 查看真实列名 表格里是 Horsepower,你写 horsepower – 大小写敏感!
pd.to_numeric 后全是 NaN 该列全是非数字 先检查 data['col'].unique(),可能需要手动替换 你不能把“三个问号”变成数字
ValueError: could not convert string to float 类型转换遇到非数字字符 使用 errors='coerce' 转成 NaN,然后删除 就像把“苹果”变成数字 – 办不到
IQR 删除异常值后数据变空 异常值范围太宽或数据量小 检查 Q1 和 Q3 是否合理,或者放宽倍数(如改为 3) 你可能把整个班都当成“异常”开除了
标准化/归一化后全是 NaN 某列所有值相同,标准差为 0 删除该列或检查数据是否有效 全班都考 0 分,没法算标准差
train_test_split 报错 X 和 y 行数不一致 确保 X 和 y 来自同一个 DataFrame 且没有缺失值 你不能拿 10 个人的数学成绩去匹配 8 个人的语文成绩
保存 CSV 后多了一列 Unnamed: 0 保存时没有写 index=False to_csv('file.csv', index=False) 不要给表格自动编页码
pickle.dump 报错 TypeError 文件打开模式写错 'wb'(写二进制)而不是 'w' 存模型要用二进制模式,就像拍照片不能写成文字
SMOTE 报错 ImportError 没有安装 imbalanced-learn pip install imbalanced-learn 缺啥补啥
分类模型准确率很低 数据不平衡或特征不好 尝试 SMOTE,或者换模型 就像考试全是难题,你答对 50% 已经很好了

调试三板斧

  1. 打印形状print(data.shape) – 看看还有多少行。

  2. 打印列名print(data.columns) – 确认名字没写错。

  3. 打印前几行print(data.head()) – 肉眼检查数据是否合理。


🎉 结语

恭喜你!你已经掌握了 2.1 系列数据清洗2.2 系列模型训练 的所有填空套路。 记住:数据预处理 → 切分数据 → 创建模型 → 训练模型 → 预测 → 评估 → 保存模型。 这个流程就像做饭:洗菜切菜 → 分盘 → 开火 → 翻炒 → 尝味 → 装盘。🍳

通关咒语

读看删转筛,存盘记心间; 切分创训预,评估保存全; 不平衡用 SMOTE,管道一步完! 🧙‍♂️

祝你顺利通过人工智能训练师考试! 🚀