【问题标题】:Python RandomForest - Unknown label ErrorPython RandomForest - 未知标签错误
【发布时间】: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?

标签: python python-3.x scikit-learn random-forest


【解决方案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 次,因为它无法支持微积分...
猜你喜欢
  • 2019-09-01
  • 2017-07-16
  • 2014-01-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多