sklearn 树在拆分期间将分类变量视为浮点数,我应该如何解决这个问题?

Posted

技术标签:

【中文标题】sklearn 树在拆分期间将分类变量视为浮点数,我应该如何解决这个问题?【英文标题】:sklearn tree treats categorical variable as float during splits, how should I solve this? 【发布时间】:2019-09-14 00:12:20 【问题描述】:

我在使用 sklearn 包的回归树时遇到了问题。这是关于书籍数据集的,其中回归树可以在下面看到:

问题出在STORY_LANGUAGE 变量中。这是一个分类变量,其值为 0、1、2 和 3,它们都对应于本书的不同语言。在运行模型之前,我已确保 STORY_LANGUAGE 是一个分类变量,但树仍然将其拆分并将其视为浮点数 (1.5)。

我应该如何解决这个问题?任何帮助表示赞赏!

【问题讨论】:

【参考方案1】:

通过将整数列表作为特征传递给 scikit-learn,您就是在告诉它特征之间存在某种排序依赖性。那例如01 的关系比与 2 的关系更密切。为了解决这个问题,您需要使用内置的OneHotEncoder 进行一次热编码。如果您有三个类别,012,则0 将转换为[1,0,0],而1 将转换为[0,1,0]。基本上你的一个特征被替换为等于1的向量,其位置对应于它是哪个类,否则0

import numpy as np
from sklearn.preprocessing import OneHotEncoder

# Generate random integers between 0 and 2
x = np.random.randint(0,3, size=(100,1))
# Create the one-hot encoder object, specifying not to use sparse arrays.
m = OneHotEncoder(sparse=False)
# Transform your features
x_one_hot = m.fit_transform(x)

【讨论】:

【参考方案2】:

如果您使用的是 sklearn 的 DecisionTreeRegressor,您的标签编码特征将被简单地视为数字特征。如果您希望它们被视为类别,您可以执行 one-hot-encoding(例如使用 OneHotEncoder)或使用支持开箱即用的类别特征的算法(例如 lightGBM)。

【讨论】:

以上是关于sklearn 树在拆分期间将分类变量视为浮点数,我应该如何解决这个问题?的主要内容,如果未能解决你的问题,请参考以下文章

逻辑回归 SKLEARN 无法将字符串转换为浮点数:“DailyReturns”

sklearn 决策树 - 无法将字符串转换为浮点数

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

使用 sklearn 时出现错误:ValueError:无法将字符串转换为浮点数:

详解决策树-决策树的优缺点 & 分类树在合成数集上的表现菜菜的sklearn课堂笔记

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