scikit决策树和分类变量的分裂

时间:2016-09-19 14:56:26

标签: authentication scikit-learn decision-tree ordinal

这是我的代码:

from sklearn.tree import DecisionTreeClassifier, export_graphviz
from sklearn import preprocessing
import os
import subprocess

def categorical_split():
    colors = ['blue', 'green', 'yellow', 'green', 'red']
    sizes = ['small', 'large', 'medium', 'large', 'small']

    size_encoder = preprocessing.LabelEncoder()
    sizes = size_encoder.fit_transform(sizes).reshape(-1, 1)

    color_encoder = preprocessing.LabelEncoder()
    colors = size_encoder.fit_transform(colors).reshape(-1, 1)

    dt = DecisionTreeClassifier( random_state=99)
    dt.fit(colors, sizes)

    with open("dt.dot", 'w') as f:
        export_graphviz(dt, out_file=f,
                        feature_names='colors')

    command = ["dot", "-Tpng", "dt.dot", "-o", "dt.png"]
    subprocess.check_call(command)

categorical_split()

它生成以下决策树:enter image description here

由于scikit-learn中的决策树不能直接处理分类变量,我不得不使用LabelEncoder。在图表上,我们看到像c<=1.5这样的分割。这种分割表明分类变量被视为序数变量,分裂是保持顺序。如果我的数据没有订单,这种方法是有害的。周围有路吗?如果您打算建议使用单热编码,请提供一个示例(代码)以获得帮助。

1 个答案:

答案 0 :(得分:1)

这实际上是一种非常有效的方法,不应该对您的模型性能有害。它确实使模型有点难以阅读。一个不错的方法是使用pd.get_dummies,因为这将为您处理模型名称:

import pandas as pd
df = pd.DataFrame({'colors':colors})
df_encoded = pd.get_dummies(df)
dt.fit(df_encoded, sizes)

with open("dt.dot", 'w') as f:
    export_graphviz(dt, out_file=f,
                    feature_names=df_encoded.columns)

command = ["dot", "-Tpng", "dt.dot", "-o", "dt.png"]
subprocess.check_call(command)

enter image description here