我正在训练一个sklearn.tree.DecisionTreeClassifier
。 我从pandas.core.frame.DataFrame
开始. 此数据框的某些列是确实应该是分类的字符串。 例如,"颜色"就是这样一列,具有"黑色"、"白色"、"红色"等值。 所以我将此列转换为类别类型,如下所示:
data['Color'] = data['Color'].astype('category')
这工作得很好。 现在我使用 sklearn.cross_validation.train_test_split
分割数据框,如下所示:
X = data.drop(['OutcomeType'], axis=1)
y = data['OutcomeType']
X_train, X_test, y_train, y_test = train_test_split(X, y)
现在X_train
有类型 numpy.ndarray
. 但是,"颜色"值不再是分类的,它们又回到了字符串。
因此,当我拨打以下电话时:
clf = tree.DecisionTreeClassifier()
clf = clf.fit(X_train, y_train)
我收到以下错误:
值错误: 无法将字符串转换为浮点数: 黑色
我需要做什么才能使其正常工作?
如果要将分类列转换为整数,可以使用data.Color.cat.codes
;这使用data.Color.cat.categories
来执行映射(第i个数组元素映射到整数i
)
正如 ayhan 所说,一种解决方法是从您的"颜色"变量创建虚拟特征(这在决策树/射频中非常常见)。
你可以使用这样的东西:
def feature_to_dummy(df, column, drop=False):
''' take a serie from a dataframe,
convert it to dummy and name it like feature_value
- df is a dataframe
- column is the name of the column to be transformed
- if drop is true, the serie is removed from dataframe'''
tmp = pd.get_dummies(df[column], prefix=column, prefix_sep='_')
df = pd.concat([df, tmp], axis=1, join_axes=[df.index])
if drop:
del df[column]
return df
有关pandas.get_dummies
,请参阅文档
例
df
Out[1]:
color
0 red
1 black
2 green
df_dummy = feature_to_dummy(df, 'color', drop=True)
df_dummy
Out[2]:
color_black color_green color_red
0 0 0 1
1 1 0 0
2 0 1 0