机器学习实战:如何准确判断2组数据的过拟合问题

1次阅读
没有评论

共计 2143 个字符,预计需要花费 6 分钟才能阅读完成。

image.webp

什么是过拟合?为什么需要警惕它

过拟合就像学生死记硬背考试题却不会举一反三。具体表现为:

机器学习实战:如何准确判断 2 组数据的过拟合问题

  • 训练集上表现优异(比如准确率 95%)
  • 验证集上大幅下滑(比如只剩 60%)
  • 模型记住了数据噪声而非真实规律

这种情况会导致模型在实际应用中完全失效,比如医疗诊断错误、金融预测失误等严重后果。

三招识别过拟合

1. 训练集 vs 验证集成绩对比

最直接的判断方法:

  1. 划分 20-30% 数据作为验证集(使用 sklearn 的 train_test_split)
  2. 分别计算两个集合的评估指标(准确率、F1 值等)
  3. 典型过拟合特征:
  4. 训练集指标持续上升
  5. 验证集指标先升后降

2. 学习曲线可视化

更直观的方法是通过 matplotlib 绘图:

from sklearn.model_selection import learning_curve
import matplotlib.pyplot as plt

train_sizes, train_scores, val_scores = learning_curve(
    estimator=model,
    X=X_train,
    y=y_train,
    cv=5,  # 交叉验证折数
    scoring='accuracy'  # 评估指标
)

# 绘制均值曲线
plt.plot(train_sizes, train_scores.mean(axis=1), label='训练集')
plt.plot(train_sizes, val_scores.mean(axis=1), label='验证集')
plt.legend()

健康曲线:两条线最终接近
过拟合曲线:验证集线明显低于训练线

3. 交叉验证验证稳定性

使用 5 折或 10 折交叉验证:

from sklearn.model_selection import cross_val_score
scores = cross_val_score(model, X, y, cv=5)
print(f"各折成绩差异:{scores.std():.2f}")

如果各折成绩波动很大(标准差 >0.1),很可能存在过拟合

Python 实战诊断示例

完整流程包含数据准备到可视化:

# 数据准备
from sklearn.datasets import make_classification
X, y = make_classification(n_samples=1000, n_features=20, random_state=42)

# 划分数据集
from sklearn.model_selection import train_test_split
X_train, X_val, y_train, y_val = train_test_split(X, y, test_size=0.3)

# 使用复杂模型人为制造过拟合
from sklearn.tree import DecisionTreeClassifier
model = DecisionTreeClassifier(max_depth=10)  # 故意设置过大深度
model.fit(X_train, y_train)

# 评估差异
print(f"训练集准确率:{model.score(X_train, y_train):.2f}")
print(f"验证集准确率:{model.score(X_val, y_val):.2f}")

# 输出典型过拟合结果示例:# 训练集准确率:1.00
# 验证集准确率:0.78

新手常见踩坑点

数据泄露

错误做法:

# 错误!先归一化再划分数据集
from sklearn.preprocessing import MinMaxScaler
scaler = MinMaxScaler()
X_scaled = scaler.fit_transform(X)  # 泄露了验证集信息
X_train, X_val = train_test_split(X_scaled)  # 这样划分无效 

正确做法:

X_train, X_val = train_test_split(X)
scaler.fit(X_train)  # 仅用训练集拟合
X_train_scaled = scaler.transform(X_train)
X_val_scaled = scaler.transform(X_val)  # 验证集用相同参数转换 

指标选择陷阱

分类问题中:
– 类别不平衡时不要用 accuracy
– 推荐使用 roc_auc 或 f1_score

小数据集处理

当数据量 <1000 时:
– 优先使用交叉验证而非单次划分
– 考虑分层抽样(stratify 参数)
– 可用学习曲线判断是否需要更多数据

改善过拟合的三大法宝

  1. 正则化
  2. L1/L2 正则化(逻辑回归的 C 参数、神经网络的 weight_decay)
  3. 决策树的 max_depth 参数

  4. 早停 (Early Stopping)

    from sklearn.neural_network import MLPClassifier
    model = MLPClassifier(early_stopping=True)  # 自动停止训练 

  5. 数据增强

  6. 图像:旋转 / 裁剪
  7. 文本:同义词替换

动手练习建议

  1. 在鸢尾花数据集上尝试:
  2. 调整决策树 max_depth 观察过拟合变化
  3. 对比有 / 无数据标准化的影响

  4. 进阶挑战:

  5. 用 Pytorch 实现带早停机制的神经网络
  6. 在房价预测任务中测试 L2 正则化效果

记住:过拟合诊断是模型调优的起点,建议保存每次实验的验证结果,逐步积累调参经验。

正文完
 0
评论(没有评论)