【问题标题】:Random Forest with categorical Data is predicting only Data within one Category具有分类数据的随机森林仅预测一个类别中的数据
【发布时间】:2020-04-05 20:48:44
【问题描述】:

我正在使用 scikit learn 的 RandomForrestRegressor,但我无法让它工作,或者至少看起来是这样。 我使用的数据有分类数据,我用 LabelBinarizer 编码,所以我的数据看起来像这样:

Id     Cat1 Cat2 Cat3 .... Cat50 
123    0    1    0         0 
...

每一行只能有一个给定的类别。 现在,我使用每个项目的给定评级来训练我的模型,这是使用 scikit-learns RandomForrestRegressor 的数值。
我的 y 是评级。
我的 X 是包含类别的项目的特征。
所以我的 y 和 X 看起来像这样:

y = [0,1,1,4,,3,7,8,1,9]

X = [[0, 1, 0, ..., 0],
     [0, 0, 1, 0...,0]
    ...]

我想根据 X 中的项目数据数组预测新项目的评分 y。为此,我使用 RandomForrestRegressor,如下所示:

regressor = RandomForestRegressor(n_estimators=60000, random_state=0, max_depth=100)
        regressor.fit(X_train, y_train)
        theta[user_id] = regressor.feature_importances_  

我选择 max-depth=106 因为有 100 个项目特征,而 n_estimator=60000 因为我有大约 30000 个项目。但我不太确定是否明智地选择了 n_estimator,即使我选择的 n_estimator 非常低,结果仍然相同。
我将每个项目特征与存储特征重要性的用户的 theta 条目相乘。
最适合用户的项目的结果如下所示:

Id Name    Category  
12 example Cat1
34 example Cat1
56 example Cat1
..

因此,每个预测都有相同的类别,尽管有 50 个不同的类别,而且训练数据确实包含比 cat1 样本多得多的内容。事实上 Cat1 只是样本的一小部分。

我的问题是如何确定我的错误在哪里?我是否应该认为这是一个错误,因为这个结果在我的情况下是不合理的。我应该采取哪些下一步来确定错误所在?

【问题讨论】:

  • 可能是您的数据高度不平衡(被预测的类别是您数据的最大部分,因此模型仅预测该类别的标签)。至于估算器,我认为您不需要那么多,如果它的模型不适用于约 100 个估算器,那么增加它们的数量可能不会带来更好的结果
  • 感谢您的快速回复,@Ach113。然后我将更改我的 n_estimators。类可能稍微不平衡。使用随机福雷斯特处理它的最佳方法是什么?
  • 有些事情我不清楚:您有 50 个类别,每个用户可以拥有 1 个类别。您说模型总是返回“类别 1”。所以你确实想为每个例子预测它是哪个类别?如果是这样,基于您想要执行的哪些功能?它不能是您要预测的类别。也许给出一个清晰的例子来说明特征是什么,你想要预测什么值,以及为什么它可以是“cat1”。似乎有些混乱。 ;)
  • @ElmarMacek 感谢您的回复!我想为用户 u 预测未见项目的评分。每个项目只能有一个类别。我不想预测项目的类别。我会用更多信息更新我的问题。

标签: python scikit-learn regression


【解决方案1】:

如果不平衡数据是您的问题,我建议您查看imblearn 库,它具有一些允许平衡数据的功能,例如合成少数过采样技术 (SMOTE) 允许通过创建额外的“上采样”数据用于训练的少数类实例及其超级简单易用。

from imblearn.over_sampling import SMOTE
sm = SMOTE()
X_train, y_train = sm.fit_resample(X_train, y_train)

然后您可以在原始数据上验证您的模型。

【讨论】:

    【解决方案2】:

    您的输入功能是什么?

    您应该检查它是否是一个不平衡数据集: df['Cat1'].sum 987654324 @ 可能是:

    Cat1   Cat2 ... Cat50
    10000   4        3
    

    这意味着您的数据是不平衡的。然后,你真的需要检查你可以使用的技术,有些名字是:under-and maxmmpling,或隔离森林。

    你确定要使用回归吗?而不是分类?检查此包装:https://scikit-learn.org/stable/modules/generated/sklearn.ensemble.RandomForestClassifier.html

    ,这应该告诉你想要解决什么问题:https://en.wikipedia.org/wiki/Supervised_learning

    【讨论】:

    • 谢谢@PV8,我会再次检查我的数据并证明我是否可以使用一些工具来消除数据中的不平衡。我的输入功能是类别。我确定我想使用回归,因为我的假设不是一个类,而是一个数值。如果输出是数值,则对分类器没有意义,右图?提前感谢任何帮助:) span>
    • 是的,但不知何故我不明白你想要预测的内容
    猜你喜欢
    • 2020-04-27
    • 2020-10-20
    • 1970-01-01
    • 2017-01-04
    • 2018-10-04
    • 2020-10-02
    • 2014-08-17
    • 2019-10-06
    • 2013-12-02
    相关资源
    最近更新 更多