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