我有一个带有字符串标签的表格数据。我会将数据提供给 scikit_learn 和 XGBoost 分类器中的决策树。
对于这些算法,是否有必要将字符串中的标签转换为整数?当标签不是数字格式时,算法的工作效率会降低吗?
我正在使用 python v3.7
我有一个带有字符串标签的表格数据。我会将数据提供给 scikit_learn 和 XGBoost 分类器中的决策树。
对于这些算法,是否有必要将字符串中的标签转换为整数?当标签不是数字格式时,算法的工作效率会降低吗?
我正在使用 python v3.7
如果您的标签是特征矩阵的一部分,则需要使用OneHotEncoding( docs ) 将它们转换为数字。但是,如果您的标签只是您的目标,您可以保持原样。
您没有指定您的字符串标签是否是特征矩阵中的特征之一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可以保留为字符串。
如果您不将目标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 个决策节点。