2013-11-23 88 views
0

我想用Sklearn的GradientBoostingRegressor类预测值的回归问题的目标变量推进。我拥有的功能是混合类型 - 一些是连续数字,一些是布尔型,两种是分类型的,一种是连续数字的向量。我选择渐变增强树,因为数据是混合数据类型。一个特征向量的例子如下:梯度Sklearn

['Category1',41.93655,-87.642079,0,0,< 1x822'''稀疏矩阵类型'',其中4个存储元素以压缩稀疏行格式>,'mobile_app', “NA”]

然而,当我尝试训练相契合的GradientBoostingRegressor(),我得到一个错误说:

ValueError异常:无法将字符串转换为float:组别

此功能的值用枚举实现。我只是有一个方法:

def enum(self, **enums): 
    return type('Enum',(), enums) 

后来,当我创建我的类别,我不喜欢这样写道:

categories = self.enum(Category1='Category1', Category2='Category2', ...) 

我猜问题是,它仍然是返回的实际值作为一个字符串。但是,如果我将值更改为0,1,2等,这会使某些类别与其他类别“距离更近”,因为它们应该与其他所有类别等距。

那么这个对象实际上是混合类型的句柄数据还是这一切都必须做数值?如果必须是全部数字,那么使用此对象处理分类数据的任何人都可以了解表示类别的最佳方式?任何帮助表示赞赏

回答

1

每一个功能必须是数字。由于梯度提升基于决策树,并且决策树基于特征分割而不是距离工作,所以“0,1,2等”只要您正确设置了max_depth参数(网格搜索确定),表示法实际上应该可以正常工作。

0

正如Fred Foo所写 - 每个特征都必须是数字的,因为当搜索最佳分割时,GradientBoosting算法正在为每个属性进行排序。

您可以将分类属性转换为二进制表示或数字。这里有准备好的sklearn实现:sklearn.preprocessing.LabelEncoder和sklearn.preprocessing.LabelBinarizer