sklearn 树在拆分期间将分类变量视为浮点数,我应该如何解决这个问题?
sklearn tree treats categorical variable as float during splits, how should I solve this?
我在使用 sklearn 包处理回归树时遇到了问题。这是关于一个书籍数据集,其中的回归树如下所示:
问题出在 STORY_LANGUAGE
变量中。这是一个具有值 0、1、2 和 3 的分类变量,它们都对应于本书的不同语言。在 运行 模型之前,我已经确保 STORY_LANGUAGE
是一个分类变量,但树仍然将它拆分并将其视为浮点数 (1.5)。
我该如何解决?任何帮助表示赞赏!
通过将整数列表作为特征传递给 scikit-learn,您是在告诉它特征之间存在某种依赖关系。那例如0
与 1
的关系比与 2
的关系更密切。要解决这个问题,您需要使用内置 OneHotEncoder 进行一次性编码。如果您有三个类别,0
、1
和 2
,一个 0
将被转换为 [1,0,0]
,而一个 1
将被转换至 [0,1,0]
。基本上你的一个特征被一个等于1
的向量替换,在对应于class的位置,否则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)
如果您使用的是 sklearn 的 DecisionTreeRegressor,您的标签编码特征将被简单地视为数字特征。如果您希望它们被视为类别,您可以执行单热编码(例如使用 OneHotEncoder)或使用支持开箱即用的分类特征的算法(例如 lightGBM)。
我在使用 sklearn 包处理回归树时遇到了问题。这是关于一个书籍数据集,其中的回归树如下所示:
问题出在 STORY_LANGUAGE
变量中。这是一个具有值 0、1、2 和 3 的分类变量,它们都对应于本书的不同语言。在 运行 模型之前,我已经确保 STORY_LANGUAGE
是一个分类变量,但树仍然将它拆分并将其视为浮点数 (1.5)。
我该如何解决?任何帮助表示赞赏!
通过将整数列表作为特征传递给 scikit-learn,您是在告诉它特征之间存在某种依赖关系。那例如0
与 1
的关系比与 2
的关系更密切。要解决这个问题,您需要使用内置 OneHotEncoder 进行一次性编码。如果您有三个类别,0
、1
和 2
,一个 0
将被转换为 [1,0,0]
,而一个 1
将被转换至 [0,1,0]
。基本上你的一个特征被一个等于1
的向量替换,在对应于class的位置,否则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)
如果您使用的是 sklearn 的 DecisionTreeRegressor,您的标签编码特征将被简单地视为数字特征。如果您希望它们被视为类别,您可以执行单热编码(例如使用 OneHotEncoder)或使用支持开箱即用的分类特征的算法(例如 lightGBM)。