如何正确交叉验证

How to Cross Validate Properly

我一直在尝试使用 Python 和 scikit-learn 工具包训练 ML 分类器。

首先,我在拆分数据集时应用了自己的阈值(例如 int(len(X)*0.75)),并在打印指标时得到了这个结果:

         precision    recall  f1-score   support

      1       0.63      0.96      0.76        23
      2       0.96      0.64      0.77        36

avg / total   0.83      0.76      0.76        59

然后我使用交叉验证来更详细地了解模型的准确性:scores = cross_validation.cross_val_score(X, y, cv=10) 并得到以下分数:

Cross_val_scores= [ 0.66666667 0.79166667 0.45833333 0.70833333 0.52173913
0.52173913 0.47826087 0.47826087 0.52173913 0.47826087]

准确度:0.56(标准偏差:+/- 0.22),此处的准确度等于平均值​​(分数)。

有人可以告诉我如何正确解释这些分数吗?我了解在使用交叉验证时如何拆分数据集以观察模型在整个数据集范围内的准确性,但我想了解更多。

感谢您的宝贵时间。

is there a way to split it and achieve the highest accuracy possible (e.g. 0.79166667) and if so how I could do that?

可能,但这仅意味着您通过拟合理想分割的训练部分获得的模型在理想分割的验证部分具有很高的准确性。这称为过度拟合,即您得到的模型仅针对特定数据进行了优化,但不能很好地概括新数据。

I imagine that happens because there is a split within my dataset that a model when trained using those data can produce a closer prediction

是的,更接近的预测在该特定拆分的验证部分。

Is there a way to reduce the relatively high standard deviation?

是的,通过选择方差较小的模型(例如参数较少的线性模型)。但请注意,在这种情况下您可能会失去预测准确性,这就是所谓的偏差方差权衡。

一般来说,您只想寻找具有良好平均交叉验证分数 (mCVS) 的模型。但是,如果您的模型都具有相同的 mCVS,那么您会选择标准偏差最小的模型。例如,在金融领域,波动性和不确定性是不受欢迎的,根据夏普比率选择模型,类似于 mean/std。但是在以 mCVS 为获胜标准的 Kaggle 竞赛中,您显然会希望最大化 mCVS 而忽略 std。

如果您担心数据集的变化不允许您对模型进行有意义的比较,那么您可以考虑使用不同数量的拆分并在拆分前打乱数据。