适用练习: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% 已经很好了 |
调试三板斧:
-
打印形状:
print(data.shape)– 看看还有多少行。 -
打印列名:
print(data.columns)– 确认名字没写错。 -
打印前几行:
print(data.head())– 肉眼检查数据是否合理。
🎉 结语
恭喜你!你已经掌握了 2.1 系列数据清洗 和 2.2 系列模型训练 的所有填空套路。 记住:数据预处理 → 切分数据 → 创建模型 → 训练模型 → 预测 → 评估 → 保存模型。 这个流程就像做饭:洗菜切菜 → 分盘 → 开火 → 翻炒 → 尝味 → 装盘。🍳
通关咒语:
读看删转筛,存盘记心间; 切分创训预,评估保存全; 不平衡用 SMOTE,管道一步完! 🧙♂️
祝你顺利通过人工智能训练师考试! 🚀