Python 具有分类输入的回归树或随机森林回归器

Python 具有分类输入的回归树或随机森林回归器,python,regression,scikit-learn,Python,Regression,Scikit Learn,我一直试图在回归树(或随机森林回归器)中使用分类输入,但sklearn不断返回错误并要求数字输入 import sklearn as sk MODEL = sk.ensemble.RandomForestRegressor(n_estimators=100) MODEL.fit([('a',1,2),('b',2,3),('a',3,2),('b',1,3)], [1,2.5,3,4]) # does not work MODEL.fit([(1,1,2),(2,2,3),(1,3,2),(2,

我一直试图在回归树(或随机森林回归器)中使用分类输入,但sklearn不断返回错误并要求数字输入

import sklearn as sk
MODEL = sk.ensemble.RandomForestRegressor(n_estimators=100)
MODEL.fit([('a',1,2),('b',2,3),('a',3,2),('b',1,3)], [1,2.5,3,4]) # does not work
MODEL.fit([(1,1,2),(2,2,3),(1,3,2),(2,1,3)], [1,2.5,3,4]) #works

MODEL = sk.tree.DecisionTreeRegressor()
MODEL.fit([('a',1,2),('b',2,3),('a',3,2),('b',1,3)], [1,2.5,3,4]) # does not work
MODEL.fit([(1,1,2),(2,2,3),(1,3,2),(2,1,3)], [1,2.5,3,4]) #works
据我理解,在这些方法中,分类输入应该是可能的,而不需要任何转换(例如,WOE替换)

还有其他人有过这种困难吗


谢谢

scikit learn
没有分类变量的专用表示法(即R中的a因子),一种可能的解决方案是使用
LabelEncoder
将字符串编码为
int

import numpy as np
from sklearn.preprocessing import LabelEncoder  
from sklearn.ensemble import RandomForestRegressor

X = np.asarray([('a',1,2),('b',2,3),('a',3,2),('c',1,3)]) 
y = np.asarray([1,2.5,3,4])

# transform 1st column to numbers
X[:, 0] = LabelEncoder().fit_transform(X[:,0]) 

regressor = RandomForestRegressor(n_estimators=150, min_samples_split=2)
regressor.fit(X, y)
print(X)
print(regressor.predict(X))
输出:

[[ 0.  1.  2.]
 [ 1.  2.  3.]
 [ 0.  3.  2.]
 [ 2.  1.  3.]]
[ 1.61333333  2.13666667  2.53333333  2.95333333]
但是请记住,如果
a
b
是独立的类别,并且它只适用于基于树的估计器,那么这是一个轻微的攻击。为什么?因为
b
实际上并不比
a
大。正确的方法是在
LabelEncoder
pd之后使用
onehotcoder

import numpy as np
from sklearn.preprocessing import LabelEncoder, OneHotEncoder
from sklearn.ensemble import RandomForestRegressor

X = np.asarray([('a',1,2),('b',2,3),('a',3,2),('c',1,3)]) 
y = np.asarray([1,2.5,3,4])

# transform 1st column to numbers
import pandas as pd
X_0 = pd.get_dummies(X[:, 0]).values
X = np.column_stack([X_0, X[:, 1:]])

regressor = RandomForestRegressor(n_estimators=150, min_samples_split=2)
regressor.fit(X, y)
print(X)
print(regressor.predict(X))

您必须用python手工编写伪代码。我建议使用一个热编码。对于增强树,我已经成功地使用它来实现顺序编码

这类事情也有一整套解决方案


有关更详细的解释,请参阅数据科学堆栈交换帖子。

谢谢。但我认为这并不能解决问题;“数字标签”创建了一个线性进展的假设,该假设很可能与您试图预测的不真实。想象一个决策树节点,当使用例如“=2”来决定下一个分界点时,与“if in('a','c')的含义不同。我误解了你的问题。我刚才看到你想把一切都一目了然。我将相应地更新这个示例……这很有帮助,我也尝试过(应该说代码不够优雅),但问题是这使得变量中包含的信息不太可能在回归树中被选择。我想这是因为预测能力现在被分成了多个变量。尽管如此,您的代码对于如何更有效地执行此操作非常有用。非常感谢。