sklearn DecisionTreeClassifier 使用应被视为分类的字符串



我正在训练一个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

相关内容

  • 没有找到相关文章

最新更新