【问题标题】:Gradient Boosting with Sklearn使用 Sklearn 进行梯度提升
【发布时间】:2013-12-08 10:42:50
【问题描述】:

我想使用 Sklearn 的 GradientBoostingRegressor 类来预测回归问题中目标变量的值。我拥有的特征是混合类型的——一些是连续数字,一些是布尔值,两个是分类的,一个是连续数字的向量。我之所以选择梯度提升树,是因为数据是混合数据类型。一个特征向量的例子是:

['Category1', 41.93655, -87.642079, 0, 0, , 'mobile_app', 'NA']

但是,当我尝试使用 fit() 训练 GradientBoostingRegressor 时,我收到一条错误消息:

ValueError:无法将字符串转换为浮点数:Category1

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

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

然后当我创建我的类别时,我会这样做:

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

我猜问题是它仍然将实际值作为字符串返回。但是,如果我将值更改为 0、1、2 等,那么当某些类别应该与所有其他类别等距时,这将使某些类别“更接近”其他类别。

那么这个对象实际上是处理混合类型的数据还是必须全部以数字方式完成?如果它必须全是数字,那么有没有人用这个对象处理过分类数据,阐明了表示类别的最佳方式?任何帮助表示赞赏

【问题讨论】:

    标签: python numpy machine-learning scipy regression


    【解决方案1】:

    每个特征都必须是数字的。由于梯度提升基于决策树,而决策树基于特征分割而不是距离,因此“0、1、2 等”只要您适当地设置max_depth 参数,表示实际上应该可以正常工作(确定网格搜索)。

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-08-15
        • 1970-01-01
        • 2014-06-25
        • 2013-02-08
        • 2020-12-21
        • 2020-05-12
        • 2017-11-04
        • 2018-09-05
        相关资源
        最近更新 更多