机器学习算法22 决策树到集成学习思想(06 决策树算法实列:决策树分类鸢尾花数据集,特征权重、决策树深度探索 )

目录

1. 概述

2.graphviz对决策树模型进行可视化 

2.1  通过gini算法 训练鸢尾花分类决策树 将训练好的模型保存成.dot文件

2.2 采用graphviz将dot文件转化为png图片

2.3 查看图片

2.4 虚拟环境中安装graphviz 直接调用api查看决策树模型

2.4.1 虚拟环境中安装graphviz 

2.4.2  直接调用api查看决策树模型

3. 特征的权重

3.1 鸢尾花数据集介绍iris = load_iris()

3.2 决策树模型中鸢尾花数据集各特征的权重

3.3 L1正则化特征选择的理解

4 决策树深度探索



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的时候,错误率随着深度的增加不再下降

  • 2
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值