scikit_learn 和 xgboost 是否需要将字符串中的标签转换为整数?

数据挖掘 机器学习 scikit-学习 决策树 xgboost
2022-02-19 16:20:24

我有一个带有字符串标签的表格数据。我会将数据提供给 scikit_learn 和 XGBoost 分类器中的决策树。

对于这些算法,是否有必要将字符串中的标签转换为整数?当标签不是数字格式时,算法的工作效率会降低吗?

我正在使用 python v3.7

1个回答

TL;博士

如果您的标签是特征矩阵的一部分,则需要使用OneHotEncoding( docs ) 将它们转换为数字。但是,如果您的标签只是您的目标,您可以保持原样。

1)是否有必要将字符串转换为整数?

您没有指定您的字符串标签是否是特征矩阵中的特征之一X,或者它们是否是您的目标y因此,这里有一些数据可以涵盖这两种情况:

X = [
    ['sunny'],
    ['rainy'],
    ['rainy'],
    ['cloudy'],
    ['very rainy'],
    ['sunny'],
    ['partially cloudy']
]

y = [
    'no umbrella',
    'umbrella',
    'umbrella',
    'no umbrella',
    'umbrella',
    'no umbrella',
    'no umbrella'
]

如果您尝试DecisionTreeClassifier与此匹配,如下所示:

from sklearn.tree import DecisionTreeClassifier
clf = DecisionTreeClassifier()
clf.fit(X, y)

你得到一个错误:

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

所以当然,您需要将它们转换为整数,例如:

from sklearn.preprocessing import OrdinalEncoder
encoder = OrdinalEncoder()
encoder.fit(X)
X_encoded = encoder.transform(X)

>> [[3.]   # sunny
>>  [2.]   # rainy
>>  [2.]   # rainy
>>  [0.]   # cloudy
>>  [4.]   # very rainy
>>  [3.]   # sunny
>>  [1.]]  # partially cloudy

这会将您的标签转换为整数。现在您可以使用.fit()您的模型了。

这意味着必须将特征X转换为整数,但是,目标标签y可以保留为字符串

2)算法的工作效率会降低吗?

如果您不将目标y转换为整数,则算法性能不会降低。

现在,鉴于您需要将字符串特征X转换为数字,您转换的方式将影响算法

在 Sklearn 中,您可以使用OrdinalEncoder( docs ) 或OneHotEncoder( docs )。它们编码的X方式不同,请注意:

OrdinalEncoder

from sklearn.preprocessing import OrdinalEncoder
encoder = OrdinalEncoder()
encoder.fit(X)
X_encoded = encoder.transform(X)

>> [[3.]   # sunny
>>  [2.]   # rainy
>>  [2.]   # rainy
>>  [0.]   # cloudy
>>  [4.]   # very rainy
>>  [3.]   # sunny
>>  [1.]]  # partially cloudy

OneHotEncoder

from sklearn.preprocessing import OneHotEncoder
encoder = OneHotEncoder()
encoder.fit(X)
X_encoded = encoder.transform(X)

[[0. 0. 0. 1. 0.]  # sunny
 [0. 0. 1. 0. 0.]  # rainy
 [0. 0. 1. 0. 0.]  # rainy
 [1. 0. 0. 0. 0.]  # cloudy
 [0. 0. 0. 0. 1.]  # very rainy
 [0. 0. 0. 1. 0.]  # sunny
 [0. 1. 0. 0. 0.]] # partially cloudy

对于像DecisionTreeClassifiers 这样的算法,第二种选择,即OneHotEncoder更好,因为找到边界线的维度更多。因此,您可以拥有较浅的树木。其中,如果您使用简单的 编码LabelEncoder,您将需要更深的树。

看看给定两种类型的输入生成的树:

LabelEncoder,注意如何需要 3 个决策节点。

在此处输入图像描述

OneHotEncoder,请注意只需要 2 个决策节点。 在此处输入图像描述