【问题标题】:Not enough Folds on CrossValidation from Scikit LearnScikit Learn 的 CrossValidation 折叠次数不足
【发布时间】:2016-01-03 07:07:55
【问题描述】:

我尝试使用 Python 中的 Scikit Learn 创建一个预测模型。我有一个大约 850k 行和 17 列的数据框。最后一列是我的标签,其他列是我的特征。

from sklearn import cross_validation
from sklearn.ensemble import RandomForestClassifier
from sklearn import metrics

predictors = [a list of my predictors columns]

alg = RandomForestClassifier(random_state=1, n_estimators=150, min_samples_split=8, min_samples_leaf=4)

scores = cross_validation.cross_val_score(alg, train[predictors],train["Sales"], cv=5)

print(scores.mean())

但是,当我运行代码时,我收到以下警告:

/Users/.../anaconda/lib/python2.7/site-packages/sklearn/cross_validation.py:417: Warning: The least populated class in y has only 1 members, which is too few. The minimum number of labels for any class cannot be less than n_folds=5.
  % (min_labels, self.n_folds)), Warning)

我不确定我是否理解了警告信息。我以为我只会在小样本上使用它。

【问题讨论】:

  • 问题是目标中的类稀疏。 y 的上课频率是多少?
  • @David 不确定我是否理解得很好,但train["Sales"] 是一个从 0 到 10.000 的整数列,有许多不同的发生。因此,如果您的意思是目标具有重复值。
  • 所以听起来你在预测一个连续变量而不是一个分类变量,对吗?如果是这样,您应该使用回归而不是分类,即:RandomForestRegressor

标签: python machine-learning scikit-learn cross-validation


【解决方案1】:

正如大卫在 cmets 中所建议的那样,听起来您的输出是连续的而不是分类的。如果是这种情况,您几乎肯定不想执行分类,而不是回归。

警告源于这样一个事实,即(至少)您的目标中的一个被视为分类的值的代表性不足。如果您确实想要执行分类,首先要做的一件好事是计算整个训练集中每个类的出现次数。

当您执行 k 折叠交叉验证和 min_labels k 时,保证其中一次交叉验证不会看到 any 类的示例min_labels,在训练或测试时(因为测试集更小,在测试时更频繁地发生)。如果您只有一个特定类的实例,那么进一步,您将保证获得一个看不到该类的任何示例的 training 运行(它位于folds,将作为测试集使用一次)

【讨论】:

    猜你喜欢
    • 2016-12-29
    • 1970-01-01
    • 2013-08-17
    • 2012-01-07
    • 2022-01-10
    • 2021-08-08
    • 2013-02-10
    • 2021-01-25
    • 2019-07-25
    相关资源
    最近更新 更多