Python RandomForest - 未知标签错误

Posted

技术标签:

【中文标题】Python RandomForest - 未知标签错误【英文标题】:Python RandomForest - Unknown label Error 【发布时间】:2016-03-18 17:05:21 【问题描述】:

我在使用 RandomForest 拟合函数时遇到问题

这是我的训练集

         P1      Tp1           IrrPOA     Gz          Drz2
0        0.0     7.7           0.0       -1.4        -0.3
1        0.0     7.7           0.0       -1.4        -0.3
2        ...     ...           ...        ...         ...
3        49.4    7.5           0.0       -1.4        -0.3
4        47.4    7.5           0.0       -1.4        -0.3
... (10k rows)

由于使用 sklearn.ensemble RandomForest 的所有其他变量,我想预测 P1

colsRes = ['P1']
X_train = train.drop(colsRes, axis = 1)
Y_train = pd.DataFrame(train[colsRes])
rf = RandomForestClassifier(n_estimators=100)
rf.fit(X_train, Y_train)

这是我得到的错误:

ValueError: Unknown label type: array([[  0. ],
       [  0. ],
       [  0. ],
       ..., 
       [ 49.4],
       [ 47.4],

我没有发现任何关于此标签错误的信息,我使用的是 Python 3.5。 任何建议都会有很大帮助!

【问题讨论】:

您使用的是哪个版本的 sklearn? 【参考方案1】:

参加聚会可能有点晚了,但我刚刚收到此错误并通过使用

确保我的 y 变量是 type(int) 来解决它
 y = df['y_variable'].astype(int) 

在进行火车测试拆分之前,也像其他人所说的那样,您的问题似乎更适合 RFReg 而不是 RF

【讨论】:

'y_variable' 拼写【参考方案2】:

根据this SO post,分类器需要整数或字符串标签

您可以考虑改用回归模型(可能更适合您的数据,因为每个数据看起来都是浮点数),如下所示:

X_train = train.drop('P1', axis=1)
Y_train = train['P1']
rf = RandomForestRegressor(n_estimators=100)
rf.fit(X_train.as_matrix(), Y_train.as_matrix())

【讨论】:

谢谢,但没有区别 根据我对完整错误报告的了解,从我调用“fit”函数的行 报告中:rf.fit(X_train, Y_train) File "C:\Anaconda3\lib\site -packages\sklearn\ensemble\forest.py",第 235 行,适合 y,expanded_class_weight = self._validate_y_class_weight(y) ... @Dragonfly,非常抱歉花了这么长时间,但我希望这能回答你的问题。 查看问题,因为训练集中的所有字段都是浮点数。所以,我认为回归比分类器更有用。 回归工作正常!非常感谢 !我使用了 RandomForestRegressor 而不是 ExtraTreesRegressor。我将尝试找出这两者之间的区别【参考方案3】:

当您将标签 (y) 数据传递给 rf.fit(X,y) 时,它期望 y 是一维列表。对 Panda 框架进行切片总是会产生一个 2D 列表。因此,在您的用例中引发了冲突。您需要将 pandas DataFrame 提供的二维列表转换为 fit 函数所期望的一维列表。

先尝试使用一维列表:

Y_train = list(train.P1.values)

如果这不能解决问题,您可以尝试MultinomialNB error: "Unknown Label Type"中提到的解决方案:

Y_train = np.asarray(train['P1'], dtype="|S6")

所以你的代码变成了,

colsRes = ['P1']
X_train = train.drop(colsRes, axis = 1)
Y_train = np.asarray(train['P1'], dtype="|S6")
rf = RandomForestClassifier(n_estimators=100)
rf.fit(X_train, Y_train)

【讨论】:

我现在明白了这个问题,但是你的代码不能工作。我正在寻找其他方法来进行转换 你可以试试Y_train = list(train.P1.values)吗?如果有任何错误信息,请告诉我 错误信息没有改变。 Y_train 形状看起来不错,虽然 print(Y_train) [ 0. 0. 0. ..., 49.4 47.4 45.4] Y 形状给出了 (34208,) - #34208 是行数 感谢您的错误信息。你可以试试这个:Y_train = np.asarray(train['P1'], dtype="|S6") 成功了,非常感谢!我的电脑崩溃了 3 次,因为它无法支持微积分...

以上是关于Python RandomForest - 未知标签错误的主要内容,如果未能解决你的问题,请参考以下文章

如何对 RandomForest 进行二值化以在 python 中绘制 ROC?

如何将randomforest分类器应用于所有数据集,一次在python中使用一小部分

在 scikit-learn 中运行 Randomforest 的 MemoryError

随机森林算法(Random Forest)Python实现

R中RandomForest包中的RandomForest函数中的参数'classwt'代表啥?

Python实现随机森林(Random Forest)