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

2024-03-29 15:31:00 发布

您现在位置:Python中文网/ 问答频道 /正文

我一直在尝试在回归树(或随机林回归器)中使用分类输入,但是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替换)。

还有人遇到过这种困难吗?

谢谢!


Tags: importmodelas错误分类notsklearnfit
2条回答

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

这类东西还有一个完整的包here

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

scikit-learn没有分类变量(R中的a.k.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]

但是请记住,如果ab是独立的类别,并且它只适用于基于树的估计器,那么这是一个小技巧。为什么?因为b实际上并不大于a。正确的方法是在LabelEncoderpd.get_dummies之后使用OneHotEncoder,从而生成两个独立的、一个热编码的X[:, 0]列。

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))

相关问题 更多 >