这是一个.csv文件的链接。这是一个经典的数据集,可用于练习决策树!
import pandas as pd
import numpy as np
import scipy as sc
import scipy.stats
from math import log
import operator
df = pd.read_csv('tennis.csv')
target = df['play']
target.columns = ['play']
features_dataframe = df.loc[:, df.columns != 'play']
这就是我头痛开始的地方
features_dataframe = pd.get_dummies(features_dataframe)
features_dataframe.columns
我正在对存储在features_dataframe
中的特征(数据)列执行一个热编码,这些列都是分类的并打印它,返回
Index(['windy', 'outlook_overcast', 'outlook_rainy', 'outlook_sunny',
'temp_cool', 'temp_hot', 'temp_mild', 'humidity_high',
'humidity_normal'],
dtype='object')
我明白为什么需要执行独热编码! sklearn 不适用于分类列。
from sklearn import preprocessing
le = preprocessing.LabelEncoder()
le.fit(target.values)
k = le.transform(target.values)
上面的代码将我存储在target
中的目标列转换为整数,该列本质上具有二进制类标签("是"和"否"),因为 sklearn 不适用于类别(YAY!
现在,最后,适合决策树分类器,criterion = "entropy"
是我假设使用 ID3 概念的!
from sklearn import tree
from os import system
dtree = tree.DecisionTreeClassifier(criterion = "entropy")
dtree = dtree.fit(features_dataframe, k)
dotfile = open("id3.dot", 'w')
tree.export_graphviz(dtree, out_file = dotfile, feature_names = features_dataframe.columns)
dotfile.close()
该文件id3.dot
具有必要的代码,可以粘贴到此站点上,以将二合代码转换为适当的可理解可视化!
为了您有效轻松地帮助我,我将在此处发布id3.dot
代码!
digraph Tree {
node [shape=box] ;
0 [label="outlook_overcast <= 0.5nentropy = 0.94nsamples = 14nvalue = [5, 9]"] ;
1 [label="humidity_high <= 0.5nentropy = 1.0nsamples = 10nvalue = [5, 5]"] ;
0 -> 1 [labeldistance=2.5, labelangle=45, headlabel="True"] ;
2 [label="windy <= 0.5nentropy = 0.722nsamples = 5nvalue = [1, 4]"] ;
1 -> 2 ;
3 [label="entropy = 0.0nsamples = 3nvalue = [0, 3]"] ;
2 -> 3 ;
4 [label="outlook_rainy <= 0.5nentropy = 1.0nsamples = 2nvalue = [1, 1]"] ;
2 -> 4 ;
5 [label="entropy = 0.0nsamples = 1nvalue = [0, 1]"] ;
4 -> 5 ;
6 [label="entropy = 0.0nsamples = 1nvalue = [1, 0]"] ;
4 -> 6 ;
7 [label="outlook_sunny <= 0.5nentropy = 0.722nsamples = 5nvalue = [4, 1]"] ;
1 -> 7 ;
8 [label="windy <= 0.5nentropy = 1.0nsamples = 2nvalue = [1, 1]"] ;
7 -> 8 ;
9 [label="entropy = 0.0nsamples = 1nvalue = [0, 1]"] ;
8 -> 9 ;
10 [label="entropy = 0.0nsamples = 1nvalue = [1, 0]"] ;
8 -> 10 ;
11 [label="entropy = 0.0nsamples = 3nvalue = [3, 0]"] ;
7 -> 11 ;
12 [label="entropy = 0.0nsamples = 4nvalue = [0, 4]"] ;
0 -> 12 [labeldistance=2.5, labelangle=-45, headlabel="False"] ;
}
转到此处,粘贴上面的二合代码,以获得所创建决策树的正确可视化!这里的问题是,对于较大的树和较大的数据集,由于一个热编码特征显示为代表节点拆分的特征名称,因此很难解释!
决策树可视化将显示合并的特征名称以表示与单热编码特征的节点拆分,是否有解决方法?
我的意思是,有没有办法创建这样的决策树可视化
不使用 One-Hot 编码,而是对特定功能的类别使用一些任意整数代码可能更简单。
可以使用pandas.factorize
对整数代码分类变量。