文章目录
source:python machine learning 3rd
高方差和高偏置是机器学习碰到的常见问题,而在高方差及高偏置之间寻找一个平衡点从而对模型进行准确的预测涉及到了我们对模型的评估(找到问题)和对超参数的调整(解决问题),其中最典型的超参数就是正则系数 λ \lambda λ,它的大小直接影响了模型在高方差和高偏置之间的表现。
此外,模型评估和超参数的调整对于解决机器学习的其它问题都是必要的,本文重点介绍几个经典方法来解决这一问题
如果你想尝试这些代码,你可以使用wine数据集
交叉验证
交叉训练集同样通过数字评价来评估模型,使用交叉训练集和使用测试集都能够让我们评估模型预测新数据的能力。但是交叉训练集专门用于模型选择,即帮助我们评价和调整超参数的表现,而测试集则为我们的模型进行总评
实践证明使用测试集完成交叉验证集的工作是错误的方法
保持法(holdout method)

保持法的核心原则是在得到完整的训练模型和各项参数之前,保持测试集不参与模型构建
为了维护这个原则,保持法从训练集中分离出了验证集,来检测不同超参数产生的预测结果
交叉验证原理

- 从原始数据集中分割出交叉训练集
- 将交叉训练集分割为k个数据集,比如k=10
- 放回地选择一个不重复的数据集,使用从训练集获得的模型参数对其它集进行训练,然后使用选择的数据集进行评分,重复知道获得了k组分数
- 对k组分数求平均值,结果为模型评分
拥有了模型评分,我们就拥有了评价和调整模型超参数的依据
选择K
- k = 10一般都能达到最好的评估效果
- 面对小数据集,适当增加k,模型评估效果更好
- 面对大数据集,适当减小k,可以在减少计算量的同时保证模型评估的准确性
python实现分层交叉验证
分层交叉验证相比于交叉验证,能够通过确保验证集中各类比例与原始数据相同来获得更好的评估效果:
import numpy as np
from sklearn.model_selection import StratifiedKFold
from sklearn.model_selection import cross_val_score
# 获得交叉验证集
...
# 获得分割后的k组数据集
kfold = StratifiedKFold(n_splits=10).split(X_train, y_train)
# 完成k次迭代,获得评估模型
for k, (train, test) in enumerate(kfold):
pipe_lr.fit(X_train[train], y_train[train])
# 计算分数
scores = cross_val_score(estimator=pipe_lr, X=X_train, y=y_train, cv=10, n_jobs=1)
# 获得最总评估结果
final_score = np.mean(scores)
模型评估
学习曲线(learning curve)
交叉验证集获得的分数可以作为我们评估模型参数表现的有效依据,但是我们选择的参数到底是对模型产生了高偏置还是高方差的影响呢?这个时候我们需要学习曲线:

简单而言,学习曲线就是训练集和验证集的测试得分随着训练样本(验证集的样本数量没有增多)的增加所得到的曲线
从上图的学习曲线我们可以直观地判断高方差和高偏置:
- 高方差:验证集和训练集的准确度都很低
- 高偏置:训练集准确度高,验证集准确度低
python 实现
# 假设我们已经获得了x_train和y_train
...
import matplotlib.pyplot as plt
# 导入学习曲线
from sklearn.model_selection import learning_curve
pipe_lr = make_pipeline(StandardScaler(), # 需导入
LogisticRegression(penalty='l2', random_state=1,
solver='lbfgs', max_iter=10000))
train_size

本文介绍了交叉验证、模型评估和超参数调试在机器学习中的应用,包括保持法、交叉验证原理、学习曲线、验证曲线、网格搜索和嵌套交叉验证,并提供了Python实现示例。通过这些方法,可以有效地处理模型的高方差和高偏置问题,提高预测准确性。
最低0.47元/天 解锁文章
&spm=1001.2101.3001.5002&articleId=105423198&d=1&t=3&u=890af521257f4dc098fa656a6475b765)

被折叠的 条评论
为什么被折叠?



