A--Scikit-Learn 实现决策树

 

选择模型类

在Scikit-Learn中分类树算法都保存在tree模块中,具体算法所属类为DecisionTreeClassifier

In [1]:
from sklearn.tree import DecisionTreeClassifier
In [2]:
DecisionTreeClassifier? #查看方法参数和输出属性
部分算法参数说明:
 

参数 | 解释

criterion:切分指数选择,即不纯度的衡量标准,除了默认的'gini'指数外还可输入信息熵‘entropy’用以计算信息增益

splitter :切分策略,默认是以不纯度衡量指标下降最快作为切分依据进行切分,即‘best’

max_depth:选择树的最大深度,如果对其进行设置,实际上相当于强行设置收敛条件(即树伸展几层),默认为None,即伸展至所有叶节点只 含有min_samples_split个数为止

min_samples_split:叶节点进行进一步切分时所需最少样本量,默认值为2,低于该值则不会再进行切分

min_samples_leaf: 叶节点最小样本量,默认值为1,若小于该数量,则会进行剪枝

 

部分属性说明:

 

属性 解释

classes_ :数据集标签列列名称

feature importances :特征重要性排名

features :特征个数

 

选择模型超参数

可考虑强化收敛条件、修改不纯度衡量方法等,当然也可使⽤用默认超参数设置,直接进行实 例化操作

In [3]:
clf = DecisionTreeClassifier()
Scikit-Learn本身也提供了一个保存数据集的模块,在sklearn.datasets中也可调用sklearn内置的鸢尾花数据集
In [4]:
from sklearn.datasets import load_iris
iris = load_iris()
In [5]:
iris.data#查看数据特征列
 . .
In [6]:
iris.target#查看数据标签列
Out[6]:
array([0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
       0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
       0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
       1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
       1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
       2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
       2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2])
 

数据集切割

sk-learn的切分数据集函数在model_selection类中。同时需要注意的 是,由于模型需要数组,因此训练集和测试集的特征数据和标签数据仍然需要分开存放

In [7]:
from sklearn.model_selection import train_test_split
xtrain, xtest, ytrain, ytest = train_test_split(iris.data, iris.target,
random_state=42)
同时 random_state=42 用于设置随机数种⼦子,可考虑输入 test_size 等参数用于设置数据集

切分比例,若不对其进行设置,则默认进行3:1的训练集和测试集的比例划分。更多参数设置参 见train_test_split函数相关⽅方法说明

 

训练模型

In [8]:
clf.fit(xtrain, ytrain)
score = clf.score(xtest, ytest)#返回预测准确度
score
Out[8]:
1.0
 

我们可以使利利用 Graphviz 模块导出决策树模型,第⼀次使用 Graphviz 之前需要对其

进行安装,若是使用conda进行的Python包管理,则可直接在命令行界面中利用下述指令进行安 装 conda install python-graphviz

In [9]:
from sklearn import tree
import graphviz

将模型利用export_graphviz生成为DOT类型对象,该对象是专门用于绘制图形绘制的对

象,在其中可对图形进行⼀系列的设置,包括标签格式、决策树着色等,更多方法可在帮助文档 中进行查看,然后将其进一步转化为可生成图形的对象graph,该对象可直接用于展示图形

In [11]:
dot_data = tree.export_graphviz(clf, out_file=None)
graphviz.Source(dot_data)

最终利用render方法生成图形,该方法中要求输入文件路路径、地址等参数,然后将图形对象保存

为制定路路径、名称的PDF格式⽂文件

In [24]:
graph = graphviz.Source(dot_data)
graph.render("iris")
Out[24]:
'iris.pdf'
In [12]:
#美化图形
dot_data = tree.export_graphviz(clf, out_file=None,
feature_names=['sepal length', 'sepalwidth', 'petal length', 'petal width'],#各变量名称
class_names=['setosa', 'versicolor','virginica'],#类别名称
filled=True,#让树的每一块有颜色,颜色越浅,表示不纯度越高
rounded=True,#树的块的形状
special_characters=True)
graphviz.Source(dot_data)

 
分类过程为二分类,且以基尼指数为切分标准,同时特征当中的petal width对分类作用明显
In [13]:
clf.feature_importances_#各个特征列的重要程度
Out[13]:
array([0.        , 0.01787567, 0.89974604, 0.08237829])
In [14]:
[*zip(['sepal length', 'sepalwidth', 'petal length', 'petal width'],clf.feature_importances_)]
Out[14]:
[('sepal length', 0.0),
 ('sepalwidth', 0.017875668342510573),
 ('petal length', 0.8997460415815836),
 ('petal width', 0.08237829007590591)]
In [15]:
classes_ :数据集标签列列名称
​
feature _ importances _:特征重要性排名

n _ features _:特征个数

In [ ]:

clf.classes_

Out[8]:

array([0, 1, 2])
 

模型预测

In [16]:
y_clf = clf.predict(xtest)
In [17]:
y_clf
Out[17]:
array([1, 0, 2, 1, 1, 0, 1, 2, 1, 1, 2, 0, 0, 0, 0, 1, 2, 1, 1, 2, 0, 2,
       0, 2, 2, 2, 2, 2, 0, 0, 0, 0, 1, 0, 0, 2, 1, 0])
 

模型评估

In [51]:
#准确率评估
from sklearn.metrics import accuracy_score
accuracy_score(ytest, y_clf)
Out[51]:
1.0
 

所有函数显示

In [53]:
from sklearn.tree import DecisionTreeClassifier#导入模型
clf = DecisionTreeClassifier(criterion="entropy",random_state=30)#进行便利,注意这次我们调整了参数
from sklearn.model_selection import train_test_split
xtrain, xtest, ytrain, ytest = train_test_split(iris.data, iris.target,random_state=42)#训练集与测试集合分割
clf.fit(xtrain, ytrain)#训练模型
score = clf.score(xtest, ytest)#返回预测准确度
score
Out[53]:
0.9736842105263158
In [54]:
#美化图形
dot_data = tree.export_graphviz(clf, out_file=None,
feature_names=['sepal length', 'sepalwidth', 'petal length', 'petal width'],#各变量名称
class_names=['setosa', 'versicolor','virginica'],#类别名称
filled=True,#让树的每一块有颜色,颜色越浅,表示不纯度越高
rounded=True,#树的块的形状
special_characters=True)
graphviz.Source(dot_data)
#保存决策树图像
graph = graphviz.Source(dot_data)
graph.render("iris")
In [55]:
c
lf.feature_importances_#各个特征列的重要程度
[*zip(['sepal length', 'sepalwidth', 'petal length', 'petal width'],clf.feature_importances_)]

Out[55]:

[('sepal length', 0.0),
 ('sepalwidth', 0.04843665046047095),
 ('petal length', 0.3254214588163632),
 ('petal width', 0.6261418907231658)]
In [56]:
y_clf = clf.predict(xtest)#模型预测
In [57]:
#准确率评估
from sklearn.metrics import accuracy_score
accuracy_score(ytest, y_clf)
Out[57]:
0.9736842105263158
 
原文地址:https://www.cnblogs.com/Koi504330/p/11911153.html