我一直试图在回归树(或随机森林回归器)中使用分类的inpust,但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替代) .
有没有其他人有这个困难?
谢谢!
2 回答
scikit-learn
没有分类变量的专用表示(在R中是a.k.a因子),一种可能的解决方案是使用LabelEncoder
将字符串编码为int
:输出:
但请记住,如果
a
和b
是独立的类别,这只是一个轻微的黑客,它只适用于基于树的估算器 . 为什么?因为b
并不比a
大 . 正确的方法是在LabelEncoder
或pd.get_dummies
之后使用OneHotEncoder
,为X[:, 0]
产生两个单独的,一个热的编码列 .你必须在python中手动编写代码 . 我建议使用pandas.get_dummies()进行一次热编码 . 对于Boosted树,我使用factorize()成功实现了Ordinal编码 .
对于这种事情,还有一整套包装here .
有关更详细的说明,请参阅this Data Science Stack Exchange帖子 .