【发布时间】: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