我正在使用cross_val_score函数和LeaveOneOut函数,因为我的数据有60个样本。
我对cross_val_score在“留一法”交叉验证(LOOCV)中如何计算每个估计结果感到困惑。
在LOOCV中,对于一个实例,它会使用59个样本进行训练,让我们假设使用决策树分类器(DTC)模型,并预测剩下的一个样本。
那么主要的问题是:它在每个实例中是否都拟合了一个新的模型(即60次不同的拟合)在cross_val_score内部?
如果是这样,事情就变得令人困惑了。
然后我可以得到一个平均准确率(60个中的平均值)来评估性能。但我需要找到一个普遍适用的最佳DTC模型,而不仅仅是基于我自己的数据,尽管它是基于我的数据的。
如果我使用全部数据,它会完美拟合,但那个模型显然是过拟合了。
我希望得到一个基于我的数据普遍适用的最佳DTC模型。
如果有帮助,这里是我的代码:
model = DecisionTreeClassifier(random_state=27, criterion='gini', max_depth=4, max_features='auto' ) loocv = LeaveOneOut() results = cross_val_score(model, X, y, cv=loocv)
回答:
我不完全明白你想了解什么。
它在每个实例中是否都拟合了一个新的模型(即60次不同的拟合)在cross_val_score内部?
是的,在你的情况下它确实是这样做的。在这种情况下,你有何进一步的问题来帮助澄清你的困惑?
交叉验证的理念是获取你所选择的模型构建过程的性能估计。最终的模型可以(也应该为了最大限度地利用数据)在完整的数据集上构建。然后你可以用它来预测测试数据,并且可以使用你的cross_val_score
结果来估计这个模型的性能。请查看我在之前的回答中提供的更详细的回答以及非常有用的链接。
我的回答适用于较大的数据集。可能有与小数据集处理相关的细微差别是我不知道的,但我看不出为什么这种逻辑不适用于这种情况。