【问题标题】:How to Cross Validate Properly如何正确交叉验证
【发布时间】:2015-03-15 11:08:42
【问题描述】:

我一直在尝试使用 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),这里的准确度等于平均值​​(分数)。

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

  • 例如,有没有办法将其拆分并实现尽可能高的准确度(例如 0.79166667),如果可以,我该怎么做?
  • 我想这是因为我的数据集中存在一个分裂,即使用这些数据训练的模型可以产生更接近的预测,对吧?
  • 有没有办法降低比较高的标准差?

感谢您的宝贵时间。

【问题讨论】:

  • 尝试优化数据拆分的方式以提高交叉验证分数并没有多大意义。交叉验证的重点是看看你的模型在它不知道的数据上的表现如何;以自定义方式拆分它只是为了提高你的分数只是在自欺欺人。您应该以某种先验方式确定拆分(例如,纯随机抽样、跨类分层等),并尝试通过改进模型本身来最大化分数。

标签: python scikit-learn cross-validation


【解决方案1】:

有没有办法将其拆分并实现尽可能高的准确度(例如 0.79166667),如果可以,我该怎么做?

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

我想这是因为我的数据集中有一个拆分 使用这些数据训练的模型可以产生更接近的预测

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

有没有办法降低比较高的标准差?

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

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

如果您担心数据集中的变化无法让您有意义地比较您的模型,那么您可以考虑使用不同数量的拆分并在拆分前打乱数据。

【讨论】:

  • 感谢朋友的回答!真的为我澄清了,正是我想知道的。干杯..
猜你喜欢
  • 2023-02-05
  • 2023-03-22
  • 2013-09-22
  • 2016-12-07
  • 2015-04-21
  • 2021-01-22
  • 2022-01-16
  • 2020-08-29
  • 2015-12-22
相关资源
最近更新 更多