目录
2.1 通过gini算法 训练鸢尾花分类决策树 将训练好的模型保存成.dot文件
2.4 虚拟环境中安装graphviz 直接调用api查看决策树模型
3.1 鸢尾花数据集介绍iris = load_iris()
1. 概述
结合sklearn官网 了解决策树的使用流程:
通过本节能够了解:
(1)怎样使用graphviz对决策树模型进行可视化。
(2)了解特征权重的含义
官网地址:
1.10. Decision Trees — scikit-learn 1.0.2 documentation
2.graphviz对决策树模型进行可视化
2.1 通过gini算法 训练鸢尾花分类决策树 将训练好的模型保存成.dot文件
import pandas as pd
import numpy as np
from sklearn.datasets import load_iris
from sklearn.tree import DecisionTreeClassifier
from sklearn.tree import export_graphviz #可以生成.dot文件
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score
import matplotlib.pyplot as plt
import matplotlib as mpl
iris = load_iris()
data = pd.DataFrame(iris.data)
data.columns = iris.feature_names
data['Species'] = load_iris().target
print(data)
x = data.iloc[:, 0:4] #花萼长度 宽度 花瓣的长度 宽度
y = data.iloc[:, -1] #
x_train, x_test, y_train, y_test = train_test_split(x, y, test_size=0.25, random_state=42)
tree_clf = DecisionTreeClassifier(max_depth=8, criterion='gini')
tree_clf.fit(x_train, y_train)
# 输出.dot文件
export_graphviz(
tree_clf, #训练好的模型
out_file="./iris_tree.dot", #输入的文件
feature_names=iris.feature_names[:], #指定特征名称
class_names=iris.target_names, #指定类别
rounded=True, # 画出的图是否圆弧边角
filled=True # 填充颜色
)
# dot -Tpng D:\worke\pycode\PCA\20190921\iris_tree.dot -o D:\worke\pycode\PCA\20190921\iris_tree.png
# 模型预测
y_test_hat = tree_clf.predict(x_test)
# 输出预测的精度
print("acc score:", accuracy_score(y_test, y_test_hat))
# 特征的重要程度 [0.03575134 0. 0.88187037 0.08237829]
print(tree_clf.feature_importances_)
2.2 采用graphviz将dot文件转化为png图片
cmd
# dot -Tpng D:\worke\pycode\PCA\20190921\iris_tree.dot -o D:\worke\pycode\PCA\20190921\iris_tree.png
2.3 查看图片
2.4 虚拟环境中安装graphviz 直接调用api查看决策树模型
2.4.1 虚拟环境中安装graphviz
conda install python-graphviz
2.4.2 直接调用api查看决策树模型
from sklearn.datasets import load_iris
from sklearn import tree
tree_clf = tree.DecisionTreeClassifier(random_state=0)
iris = load_iris()
tree_clf = tree_clf.fit(iris.data, iris.target)
import graphviz
dot_data = tree.export_graphviz(tree_clf, out_file=None)
graph = graphviz.Source(dot_data)
graph.render("iris")
生成的文件
3. 特征的权重
3.1 鸢尾花数据集介绍
iris = load_iris()
feature_names = ['sepal length (cm)', 'sepal width (cm)',
'petal length (cm)', 'petal width (cm)']
鸢尾花数据集:
数据集名称的准确名称为 Iris Data Set,总共包含 150 行数据。每一行数据由 4 个特征值及一个目标值组成。
其中 4 个特征值分别为:萼片长度、萼片宽度、花瓣长度、花瓣宽度。
而目标值为三种不同类别的鸢尾花,分别为:Iris Setosa,Iris Versicolour,Iris Virginica。
3.2 决策树模型中鸢尾花数据集各特征的权重
# 特征的重要程度 [0.03575134 0. 0.88187037 0.08237829]
print(tree_clf.feature_importances_)
# 特征的重要程度 [0.03575134 0. 0.88187037 0.08237829]
从特征程度可以看出:鸢尾花数据集种花瓣的的长度、宽度相比花萼的长度、宽度特征权重较大,模型训练时多选用花瓣的的长度来进行划分。特别是第一次会选用特征权重大的进行区分。
3.3 L1正则化特征选择的理解
L1 正则化可以做特征选择,w0 w1 ......wn 那个特征比较大 也就意味着那个越重要。
但是必须进行归一化
4 决策树深度探索
import pandas as pd
import numpy as np
from sklearn.datasets import load_iris
from sklearn.tree import DecisionTreeClassifier
from sklearn.tree import export_graphviz
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score
import matplotlib.pyplot as plt
import matplotlib as mpl
iris = load_iris()
data = pd.DataFrame(iris.data)
data.columns = iris.feature_names
data['Species'] = load_iris().target
# print(data)
x = data.iloc[:, 0:4]
y = data.iloc[:, -1]
# y = pd.Categorical(data[4]).codes
# print(x)
# print(y)
x_train, x_test, y_train, y_test = train_test_split(x, y, test_size=0.25, random_state=42)
tree_clf = DecisionTreeClassifier(max_depth=8, criterion='gini')
tree_clf.fit(x_train, y_train)
print(x_train.shape)
export_graphviz(
tree_clf,
out_file="./iris_tree.dot",
feature_names=iris.feature_names[:],
class_names=iris.target_names,
rounded=True,
filled=True
)
# .\dot -Tpng D:\PythonProject\AI_Study\decision_tree\iris_tree.dot
# -o D:\PythonProject\AI_Study\decision_tree\iris_tree.png
y_test_hat = tree_clf.predict(x_test)
print("acc score:", accuracy_score(y_test, y_test_hat))
print(tree_clf.feature_importances_)
# 输出的是概率值 [[0. 0. 1.]]
print(tree_clf.predict_proba([[1,2,5, 1.5]]))
# 输出的是分类号[2]
print(tree_clf.predict([[1,2,5, 1.5]]))
# 对比不同深度所对应的决策树错误lv是多少
depth = np.arange(1, 15)
err_list = []
for d in depth:
print(d)
clf = DecisionTreeClassifier(criterion='gini', max_depth=d)
clf.fit(x_train, y_train)
y_test_hat = clf.predict(x_test)
result = (y_test_hat == y_test) #返回m行1列的boole值
if d == 1:
print(result)
err = 1 - np.mean(result) #1-正确率=错误率
print(100 * err)
err_list.append(err)
print(d, ' 错误率:%.2f%%' % (100 * err))
mpl.rcParams['font.sans-serif'] = ['SimHei']
plt.figure(facecolor='w')
plt.plot(depth, err_list, 'ro-', lw=2)
plt.xlabel('决策树深度', fontsize=15)
plt.ylabel('错误率', fontsize=15)
plt.title('决策树深度和过拟合', fontsize=18)
plt.grid(True)
plt.show()
可以看出深度为3的时候,错误率随着深度的增加不再下降