共计 1898 个字符,预计需要花费 5 分钟才能阅读完成。
什么是欠拟合与过拟合
在机器学习中,欠拟合 (Underfitting) 和过拟合 (Overfitting) 是模型训练过程中最常见的两类问题。它们反映了模型在训练数据和新数据上的表现差异。

-
欠拟合:模型无法很好地学习训练数据中的规律,表现为在训练集和验证集上表现都较差。数学上可以表示为训练误差和验证误差都较高:
$$ J_{train}(θ) \approx J_{val}(θ) \gg 0 $$ -
过拟合:模型过度学习了训练数据中的细节和噪声,导致在新数据上泛化能力差。表现为训练误差低但验证误差高:
$$ J_{train}(θ) \ll J_{val}(θ) $$
问题表现与诊断
欠拟合的典型表现
- 训练集准确率 / 评分显著低于预期
- 验证集表现与训练集相近但都不理想
- 学习曲线显示训练和验证误差都处于高位且趋于稳定
过拟合的典型表现
- 训练集准确率异常高(接近 100%)
- 验证集表现明显差于训练集
- 学习曲线显示训练误差持续下降而验证误差在某个点后开始上升
解决方案
解决欠拟合的两种方法
- 增加模型复杂度
- 使用更复杂的模型架构(如增加神经网络层数)
- 在决策树中增加最大深度
-
在 SVM 中使用更高阶的核函数
-
改进特征工程
- 添加更有意义的特征
- 进行特征组合或交叉
- 尝试不同的特征变换方法
解决过拟合的两种方法
- L2 正则化(权重衰减)
- 在损失函数中加入权重平方和作为惩罚项
-
数学表达式:
$$ J(θ) = \frac{1}{m}\sum_{i=1}^m L(y^{(i)}, f(x^{(i)})) + \frac{λ}{2m}\sum_{j=1}^n θ_j^2 $$ -
Dropout(随机失活)
- 在神经网络训练过程中随机 ” 关闭 ” 部分神经元
- 防止神经元过度依赖特定的输入特征
- 测试时需要将权重乘以保留概率(scale)
完整代码示例
import numpy as np
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import accuracy_score
from sklearn.datasets import make_classification
# 1. 数据准备
X, y = make_classification(n_samples=1000, n_features=20, n_informative=15, random_state=42)
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
# 2. 数据标准化
scaler = StandardScaler()
X_train_scaled = scaler.fit_transform(X_train)
X_test_scaled = scaler.transform(X_test)
# 3. 模型训练(带 L2 正则化)
# C 是正则化强度的倒数,越小表示正则化越强
model = LogisticRegression(penalty='l2', C=0.1, solver='liblinear', random_state=42)
model.fit(X_train_scaled, y_train)
# 4. 模型评估
train_acc = accuracy_score(y_train, model.predict(X_train_scaled))
test_acc = accuracy_score(y_test, model.predict(X_test_scaled))
print(f"训练集准确率: {train_acc:.4f}")
print(f"测试集准确率: {test_acc:.4f}")
避坑指南
- 正则化系数选择
- 使用网格搜索或随机搜索在验证集上寻找最优值
- 从较大范围开始(如 0.0001 到 100)
-
观察模型在验证集上的表现
-
交叉验证最佳实践
- 使用分层 K 折交叉验证 (StratifiedKFold) 处理不平衡数据
- 确保每折数据分布与整体一致
-
多次重复减少随机性影响
-
早停法注意事项
- 监控验证集指标而非训练集
- 设置合理的 patience 参数
- 保存最佳模型而非最后模型
总结与建议
在实践中,模型调优是一个迭代过程。建议从简单模型开始,逐步增加复杂度,同时使用学习曲线监控模型表现。对于自己的项目,可以尝试:
- 绘制学习曲线诊断问题类型
- 针对性地应用不同的解决方案
- 记录每次调整的效果,建立调优日志
记住,没有放之四海而皆准的解决方案,最佳方法往往需要通过实验来确定。
正文完
发表至: 未分类
近两天内
