我想使用Sklearn的GradientBoostingRegressor类来预测回归问题中目标变量的值。我拥有的功能是混合类型 - 一些是连续数字,一些是布尔值,两个是分类,一个是连续数字的向量。我特别选择梯度增强树,因为数据是混合数据类型。特征向量的一个例子是:
['Category1',41.93655,-87.642079,0,0,< 1x822类型为''的稀疏矩阵,其中4个存储元素采用压缩稀疏行格式>,'mobile_app','NA']
但是,当我尝试使用fit()训练GradientBoostingRegressor时,我收到错误消息:
ValueError:无法将字符串转换为float:Category1
此功能的值通过枚举实现。我只是有一个方法:
def enum(self, **enums):
return type('Enum', (), enums)
然后当我创建我的类别时,我这样做:
categories = self.enum(Category1='Category1', Category2='Category2', ...)
我想问题是它仍然将实际值作为字符串返回。但是,如果我将值更改为0,1,2等,这将使某些类别与其他类别“更接近”,因为它们应与所有其他类别等距。
这个对象实际上处理混合类型的数据还是必须以数字方式完成?如果必须全部为数字,那么使用此对象处理分类数据的人是否能够阐明表示类别的最佳方式?任何帮助表示赞赏
答案 0 :(得分:1)
每个要素必须是数字。由于梯度增强基于决策树,并且决策树基于特征分裂而不是距离工作,因此“0,1,2等”只要您正确设置max_depth
参数(网格搜索以确定),表示实际上应该可以正常工作。
答案 1 :(得分:0)
正如Fred Foo写的那样 - 每个特征都必须是数字的,因为GradientBoosting算法在搜索最佳分割时对每个属性进行排序。
您可以将分类属性转换为二进制表示形式或数字形式。有一些现成的sklearn实现:sklearn.preprocessing.LabelEncoder和sklearn.preprocessing.LabelBinarizer