在机器学习中,模型的性能不仅仅取决于算法本身,还与 数据集的划分方式 和 验证方法 密切相关。如果验证方式选择不当,可能会导致模型出现 过拟合 或 欠拟合,从而在真实应用中表现不佳。因此,掌握常见的验证方法和调参技巧,是每一个机器学习入门者必须具备的基本能力。
本文将系统介绍机器学习中的验证方式,包括过拟合与欠拟合问题、交叉验证的基本原理与变体方法,以及超参数调优中的网格搜索与随机搜索。
过拟合(Overfitting) 指的是模型在训练集上表现极好,但在测试集或新数据上表现较差的现象。
其本质原因在于:模型过于“记住”训练数据的细节和噪声,从而丧失了对新数据的泛化能力。
产生过拟合的常见原因包括:
1)模型复杂度过高(例如深度神经网络层数过多、决策树深度过大);
2)训练数据量不足;
3)训练集噪声较多;
4)缺乏正则化手段。
常见的解决方法有:
1)增加数据量:更多的数据可以帮助模型学习到更稳健的规律;
2)正则化:在损失函数中加入正则项(如 L1、L2)限制模型复杂度;
3)剪枝(针对决策树):限制最大深度或最小样本数;
4)Dropout(针对神经网络):在训练过程中随机丢弃部分神经元,避免过度依赖;
5)交叉验证:合理选择模型参数,避免模型在训练集上“过度拟合”。
欠拟合(Underfitting) 指的是模型在训练集和测试集上都表现很差,说明模型没有学到数据的有效模式。
原因通常是:
1)模型复杂度太低(例如用线性模型拟合非线性数据);
2)特征工程不足,没有提取有效特征;
3)训练时间不足,模型未收敛。
1)增加模型复杂度(例如用更复杂的模型);
2)增加特征维度,进行更好的特征提取;
3)训练更多轮次,直到损失收敛;
4)减少正则化强度,允许模型更充分地学习。
交叉验证(Cross Validation, CV) 是一种评估模型泛化能力的方法。其基本思想是:将数据集划分为多个子集,反复进行训练与验证,从而更客观地评估模型性能。
作用包括:
1)避免过拟合和欠拟合;
2)更合理地利用有限数据集;
3)在调参时帮助选择最优超参数。
1)留出法(Hold-Out)
将数据集随机分为训练集和测试集,例如 7:3 或 8:2。
缺点:结果依赖于划分方式,可能不稳定。
2)留一法(LOO-CV, Leave-One-Out)
每次留下一个样本作为验证,其余作为训练,重复 m 次(m 为样本数)。
优点:利用数据最充分;缺点:计算开销大。
3)K 折交叉验证(K-Fold CV)
将数据分为 K 份,每次用其中一份作为验证,其余作为训练,重复 K 次。
这是最常用的方法。
4)重复 K 折交叉验证
在 K 折交叉验证的基础上,重复多次随机划分,得到更稳健的结果。
K 折交叉验证(K-Fold CV) 是最常见的一种交叉验证方法。具体步骤:
1)将数据集划分为 K 个大小相近的子集;
2)每次选取其中 1 个子集作为验证集,其余 K-1 个子集作为训练集;
3)重复 K 次,计算平均性能指标。
例如,若 K=5,那么我们会得到 5 个模型,最终结果是这 5 次验证的平均值。
优点:结果较稳定,充分利用了数据。
缺点:计算成本比留出法高。
常见取值:K=5 或 K=10;
K 值大:偏差更小,但计算成本更高;
K 值小:计算更快,但结果可能波动较大。
通常情况下,K=5 或 10 被认为是折中选择。
在实际应用中,很多算法有超参数(例如 SVM 的 C、γ;随机森林的树数等)。为了找到最优超参数组合,我们可以使用 网格搜索(Grid Search)。
其基本思想是:枚举所有超参数组合,在交叉验证中逐一尝试,选择性能最好的参数。
缺点:计算开销大,尤其是参数组合较多时。
Python 示例:
from sklearn.model_selection import GridSearchCV
from sklearn.svm import SVC
param_grid = {'C':[0.1,1,10], 'kernel':['linear','rbf']}
grid = GridSearchCV(SVC(), param_grid, cv=5)
grid.fit(X_train, y_train)
print("最佳参数:", grid.best_params_)
print("最佳得分:", grid.best_score_)
10 随机搜索(RandomizedSearchCV)
与网格搜索不同,随机搜索(Random Search) 并不遍历所有参数组合,而是随机选择一部分组合进行搜索。
优点:
对于参数空间很大的情况,效率更高;
有时随机搜索的效果甚至优于网格搜索。
from sklearn.model_selection import RandomizedSearchCV
from sklearn.ensemble import RandomForestClassifier
from scipy.stats import randint
param_dist = {'n_estimators': randint(50,200), 'max_depth': randint(3,10)}
random_search = RandomizedSearchCV(RandomForestClassifier(),
param_dist, cv=5, n_iter=10)
random_search.fit(X_train, y_train)
print("最佳参数:", random_search.best_params_)
验证方式是机器学习中至关重要的一环。
过拟合:训练效果好但泛化能力差,可以通过正则化、交叉验证等方式避免;
欠拟合:模型过于简单,表现不佳,可以通过增加复杂度解决;
交叉验证:是评估和调优的核心方法,尤其是 K 折交叉验证;
网格搜索和随机搜索:是常用的超参数调优手段。
掌握这些验证方法,能够帮助我们更科学地选择模型、调参,并提高泛化能力。
https://www.cnblogs.com/chuqianyu/p/17684614.html
https://blog.csdn.net/WHYbeHERE/article/details/108192957
https://blog.csdn.net/weixin_41882890/article/details/107008400
https://blog.csdn.net/weixin_41960890/article/details/104891561
点击“阅读原文”可查看详情