决策树——中文可视化

决策树

回归

数据来自kaggle竞赛的house price

import numpy as np
import pandas as pd
from sklearn.tree import DecisionTreeRegressor
import matplotlib.pyplot as plt

#load  dataset
train = pd.read_csv('train.csv')
test = pd.read_csv('test.csv')
train_x = np.arange(1460).reshape((-1,1))
train_y = train.iloc[:,-1]
test = np.arange(1459).reshape((-1,1))
#reshape很重要

#fit
regr_1 = DecisionTreeRegressor(max_depth=2)
regr_2 = DecisionTreeRegressor(max_depth=5)
regr_3 = DecisionTreeRegressor(max_depth=10)

regr_1.fit(train_x,train_y)
regr_2.fit(train_x,train_y)
regr_3.fit(train_x,train_y)

#predict
y1 = regr_1.predict(test)
y2 = regr_2.predict(test)
y3 = regr_3.predict(test)

# Plot the results
plt.figure()
plt.scatter(np.arange(100), train['SalePrice'][:100], s=20, edgecolor="black",
            c="darkorange", label="data")
plt.plot(np.arange(100), y1[:100], color="cornflowerblue", label="max_depth=2", linewidth=2)
plt.plot(np.arange(100), y2[:100], color="yellowgreen", label="max_depth=5", linewidth=2)
plt.plot(np.arange(100), y3[:100], color="red", label="max_depth=10", linewidth=2)
plt.xlabel("data")
plt.ylabel("target")
plt.title("Decision Tree Regression")
plt.legend()
plt.show()

在这里插入图片描述
随着max_depth的增加,拟合的越来越好,但容易出现过拟合现象。

分类

这里我们采用sklearn的内置数据试验

from sklearn import tree
import graphviz
from sklearn import datasets

#加载内置数据集
iris = datasets.load_iris()

#实例化,采用哪种方法
clf = tree.DecisionTreeClassifier()

#训练
clf.fit(iris.data,iris.target)

#画出决策树
dot_data = tree.export_graphviz(clf,out_file = None)
grap = graphviz.Source(dot_data)
grap.render('iris')

在这里插入图片描述

可能遇到的报错:
graphviz.backend.ExecutableNotFound: failed to execute [‘dot’, ‘-Tpdf’, ‘-O’, ‘iris’], make sure the Graphviz executables are on your systems’ PATH
解决方案:Graphviz
好吧。貌似官网上download的exe文件不能用,这里贴出可以用的版本graphviz-2.38.msi
链接:网盘链接
提取码:ei92
也可以设置dot_data里的参数,使决策树更接地气。

#为决策树加上数据内置的feature_names
dot_data = tree.export_graphviz(clf,out_file = None,feature_names = iris.feature_names)

在这里插入图片描述
如何自定义决策树的特征名称显示中文

feature_names = ['花萼的长度 (cm)',
  '花萼的宽度 (cm)',
  '花瓣的长度 (cm)',
  '花瓣的宽度 (cm)']
  
#画出决策树
dot_data = tree.export_graphviz(clf,out_file = None,feature_names = feature_names)
# grap = graphviz.Source(dot_data)
# grap.render('iris2')

中文乱码了。。。,下面给出解决方案:
在这里插入图片描述
在原py文件中,生成txt文件

file_path = "\决策树iris.text"
with open(file_path,'w',encoding = 'utf-8') as f:
  f.writelines(dot_data)

打开生成的text文档,将[shape = box]扩充为[[shape=box fontname=“Microsoft YaHei”]]
创建一个新的py文件,读取text文件,生成带有中文字符的决策树图片。

import os
os.environ['PATH']+= os.pathsep+"D:\graphviz\bin"
import pydotplus

file_path = "\决策树iris.text"
with open(file_path,'r',encoding = 'utf-8') as f:
  dot_data = f.read()

grap = pydotplus.graph_from_dot_data(dot_data)
grap.write_png("中文决策树iris.png")

在这里插入图片描述
同理还可自主设置target_names

target_names = ['山鸢尾', '杂色鸢尾', '韦尔吉鸢尾 ']

dot_data = tree.export_graphviz(clf,out_file = None,feature_names = feature_names,class_names=target_names,)

在这里插入图片描述
其他参数设置,颜色填充,圆角,特殊字符

dot_data = tree.export_graphviz(clf,out_file = None,feature_names = feature_names,
                                class_names=target_names,filled = True,rounded=True,special_characters=True)

在这里插入图片描述
颜色有无及深浅的解释:
定义:基尼指数(基尼不纯度):表示在样本集合中一个随机选中的样本被分错的概率。
即 基尼指数(基尼不纯度)= 样本被选中的概率 * 样本被分错的概率

基尼系数的性质与信息熵一样:度量随机变量的不确定度的大小;
G 越大,数据的不确定性越高;
G 越小,数据的不确定性越低;
G = 0,数据集中的所有样本都是同一类别;
这里gini越接近0.颜色越深,越接近0.5(猜测阈值),颜色越浅。每一种颜色代表一类class。

### 决策树模型可视化的方法 #### 使用 `sklearn` 和 `matplotlib` 对于决策树模型的可视化,可以利用 Python机器学习库 `scikit-learn` 提供的功能。该库允许用户轻松地构建并训练决策树模型,并提供了简单的接口用于绘制这些模型。 ```python from sklearn.datasets import load_iris from sklearn.tree import DecisionTreeClassifier, plot_tree import matplotlib.pyplot as plt # 加载数据集 data = load_iris() X, y = data.data, data.target # 创建并拟合模型 model = DecisionTreeClassifier(max_depth=3) model.fit(X, y) plt.figure(figsize=(10,8)) plot_tree(model, filled=True, feature_names=data.feature_names, class_names=data.target_names) plt.show() ``` 此代码片段展示了如何加载鸢尾花数据集,创建一个最大深度为 3 的决策树分类器实例,对其进行训练,并最终使用 `matplotlib` 将其图形化表示出来[^1]。 #### 集成模型中的单棵决策树可视化——以随机森林为例 当涉及到像随机森林这样的集成方法时,虽然整个集合难以一次性完全展现,但是可以从已建立好的随机森林中抽取一棵单独的决策树来进行可视化操作。这有助于理解构成整体的一部分是如何工作的。 ```python from sklearn.ensemble import RandomForestClassifier forest_model = RandomForestClassifier(n_estimators=100, random_state=42) forest_model.fit(X, y) single_tree_from_forest = forest_model.estimators_[0] plt.figure(figsize=(15,10)) plot_tree(single_tree_from_forest, filled=True, feature_names=data.feature_names, class_names=data.target_names) plt.show() ``` 这段脚本说明了怎样从随机森林里选取一颗具体的决策树进行绘图显示。 #### 利用 Graphviz 进行更复杂的定制化渲染 如果希望获得更加精细控制权以及美观的效果,则推荐采用第三方软件包 Graphviz 来生成高质量图像文件(如 PDF),从而更好地满足对外发布的需求。 ```python from sklearn.tree import export_graphviz import graphviz dot_data = export_graphviz( model, out_file=None, feature_names=data.feature_names, class_names=data.target_names, filled=True, rounded=True, special_characters=True ) graph = graphviz.Source(dot_data) graph.render('decision-tree', format='pdf', view=True) ``` 上述例子介绍了通过导出 DOT 文件格式并通过 Graphviz 渲染的方式得到更为专业的视觉呈现效果[^4]。 #### GBDT 模型下的决策路径分析 除了基本的结构展示之外,在某些情况下可能还需要关注每条分支的具体含义及其影响程度。特别是针对梯度提升机这类逐步优化的过程而言,能够追踪到每次分裂背后的原因是非常有价值的。 ```python for estimator in gbdt_model.estimators_.ravel(): plt.figure(figsize=(10,7)) plot_tree(estimator, filled=True, feature_names=data.feature_names, class_names=data.target_names) plt.title(f'Decision Tree {i}') i += 1 plt.show() ``` 这里提供了一种遍历所有弱学习者并将它们依次画出来的方案,使得读者能清晰看到各个阶段的变化趋势[^2]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值