一、嵌套交叉验证算法
嵌套交叉验证是交叉验证的扩展,目的是帮助选择模型并优化模型参数,在数据集很小时也可以避免过拟合的问题。
嵌套交叉验证的核心思想是将数据集划分为K个互斥子集,用其中K-1个子集进行模型训练,剩下的子集用于模型评估。为避免过拟合,这个过程会反复进行多次,最后取平均评估指标。
而嵌套的部分则是在每次交叉验证外层,再次划分数据集为训练集和测试集,用不同的模型评估指标进行模型选择。
二、嵌套交叉验证特征选择
嵌套交叉验证算法中,一个很重要的应用是特征选择。特征选择是为了减少维度,防止出现拟合过程中出现维度灾难,同时也可以提高模型的稳定性。
在交叉验证中实现特征选择有两种方法:1)选择统计显著性的特征;2)根据交叉验证误差进行选择。用统计显著性的特征选择是用统计学方法来检测特征是否不显著,模型评估也可以用ROC曲线、ROC曲线下面积等指标。用交叉验证误差进行特征选择的方法则是将交叉验证的误差作为特征子集的度量标准,看哪个特征子集效果最好。
三、嵌套交叉验证代码
from sklearn.model_selection import GridSearchCV, KFold from sklearn.metrics import make_scorer param_grid = {'C': [0.1, 1, 10], 'gamma': [0.1, 1, 10]} scoring = make_scorer(mean_squared_error, greater_is_better=False) outer_cv = KFold(n_splits=10) inner_cv = KFold(n_splits=5) gscv = GridSearchCV(estimator=SVC(kernel='rbf'), param_grid=param_grid, scoring=scoring, cv=inner_cv) nested_score = cross_val_score(gscv, X=X, y=y, cv=outer_cv, scoring=scoring)
四、嵌套交叉验证最佳模型
嵌套交叉验证最主要的作用是选择最佳的模型,并优化模型参数。模型的评价标准常用的有均方误差,最大似然估计等。
在嵌套交叉验证中,外层循环会分割数据集成训练集和测试集,然后在内层循环中选择最好的参数组合进行模型训练。
最后以嵌套交叉验证的结果为准来比较模型的性能。选择出表现最好的模型,可以得到最适合的模型参数。
五、嵌套交叉验证结果
嵌套交叉验证可以用来评估模型的性能指标,通常情况下会使用预测分数进行评估。如果观察到同一模型的预测分数随着不同的子数据集而变化很大,那么可能是模型对数据集的细微变化过度敏感,需要重新考虑选择其他模型。
可通过绘制箱线图来直观展示多次嵌套交叉验证结果的变化与分布。
六、嵌套交叉验证特征
嵌套交叉验证最重要的作用是模型选择与验证。也可以用于特征选择。在内层交叉验证中我们选择不同特征子集训练模型,并比较它们的性能。在外层交叉验证中对每个特征子集计算平均交叉验证误差,从而选择在此基础上进行训练的最佳特征子集。得到最佳特征子集之后,我们使用完整的训练集重新训练模型并进行预测。
from sklearn.model_selection import cross_val_score from sklearn.linear_model import LassoCV from sklearn.datasets import load_boston boston = load_boston() X, y = boston.data, boston.target elasticnet = LassoCV(cv=inner_cv, normalize=True) outer_scores = cross_val_score(elasticnet, X, y, cv=outer_cv)
七、嵌套交叉验证的优势
嵌套交叉验证相对于其他交叉验证方法有以下几个优势:
1、在保证偏差不变的情况下,降低了方差的预测误差;
2、能够比较模型之间的差异,选择最佳模型并优化参数;
3、通过特征选择能够减少维度,提高模型的稳定性。
八、嵌套交叉验证能不能画混淆矩阵
嵌套交叉验证更多地用于模型的选择与训练,而不是分类或者回归问题的预测。因此不一定需要使用混淆矩阵。
九、嵌套交叉验证和交叉验证区别
嵌套交叉验证其实是交叉验证的扩展,在交叉验证的外层再增加一层循环来选择最佳模型。
交叉验证一般只做一次交叉验证作为评估模型的综合性能,而嵌套交叉验证可以让我们做多次交叉验证,每次交叉验证都可以训练多种不同的模型并进行参数优化,可更准确的选择最佳模型。
from sklearn.model_selection import cross_val_score, KFold kf = KFold(n_splits=10) scores = cross_val_score(clf, X, y, cv=kf)