数据挖掘

您所在的位置:网站首页 森林的树种类 数据挖掘

数据挖掘

2024-07-10 15:48| 来源: 网络整理| 查看: 265

数据挖掘 | 决策树/随机森林应用于鸢尾花分类

本文最后更新于:2021年5月8日 凌晨

# 数据挖掘 | 决策树/随机森林应用于鸢尾花分类

本文主要分为四个部分:

数据集探索(了解数据内容)

各维度数据可视化(绘制各维度直方图和散点图矩阵,但不限于此)

决策树模型、可视化及调参(训练决策树模型,可视化决策树,尝试不同决策树参数对分类准确度的影响)

扩展实验(随机森林模型)

01 / 数据集和模型简介 鸢尾花数据集

鸢尾花数据集内包含 3 类(iris-setosa, iris-versicolour, iris-virginica)共 150 条记录,每类各 50 个数据,每条记录都有 4 项特征:花萼(Sepal)长度、花萼宽度、花瓣(Petal)长度、花瓣宽度。 可以通过这4个特征对鸢尾花进行聚类或者预测鸢尾花卉属于中的哪一品种。

img

img

决策树模型

决策树(decision tree)是一种描述对实例进行分类的树形结构。

决策树由结点和有向边组成。结点有两种类型:内部结点和叶结点。内部结点表示一个特征或属性,每个分支代表这个特征属性在某个值域上的输出,叶结点表示一个类。

使用决策树进行决策的过程就是从根结点开始,测试待分类项中相应的特征属性,并按照其值选择输出分支,直到到达叶结点,将叶结点存放的类别作为决策结果。

02 / 探索性数据分析 数据集探索 导入工具包和鸢尾花数据集 import matplotlib.pyplot as plt import pandas as pd import numpy as np from sklearn.datasets import load_iris from sklearn import tree from sklearn import metrics from sklearn.tree import DecisionTreeClassifier from sklearn.ensemble import RandomForestClassifier from sklearn.model_selection import train_test_split 加载鸢尾花数据集 from sklearn.datasets import load_iris iris_dataset = load_iris() 查看数据集对象的属性和方法 dir(iris_dataset)

[‘DESCR’, ‘data’, ‘feature_names’, ‘filename’, ‘frame’, ‘target’, ‘target_names’]

查看数据集标签名 iris_dataset.target_names

array([‘setosa’, ‘versicolor’, ‘virginica’], dtype=’ DecisionTreeClassifier(max_depth=3, random_state=0) 用测试集来预测测试准确度accuracy ​````python pred = dt_clf.predict(X_test) print('决策树的 accuracy 为 {0}'.format(metrics.accuracy_score(pred,Y_test)))

决策树的 accuracy 为 0.9736842105263158

模型可视化 用Sklearn自带的tree包进行决策树可视化 tree.plot_tree(dt_clf); import matplotlib.pyplot as plt fn=iris_dataset.feature_names  # fn=['sepal length (cm)','sepal width (cm)','petal length (cm)','petal width (cm)' cn=iris_dataset.target_names  # cn=['setosa', 'versicolor', 'virginica'] fig, axes = plt.subplots(nrows=1,ncols=1,figsize = (6,6), dpi=300) tree.plot_tree(dt_clf,                feature_names=fn,                 class_names=cn,                filled = True); fig.savefig('vis_dt.png')

img

使用graphviz可视化决策树 tree.export_graphviz(dt_clf,                      out_file="dt.dot",                      feature_names = fn,                       class_names=cn,                      filled = True) ! dot -Tpng -Gdpi=300 dt.dot -o dt_graphviz.png ![img](https://i.loli.net/2021/05/08/JHwuO5xtPbZBcEG.jpg) #### 使用dtreeviz包进行可视化 ​````python from dtreeviz.trees import dtreeviz viz = dtreeviz(dt_clf,                iris_dataset.data,                iris_dataset.target,                target_name='Species',                feature_names=iris_dataset.feature_names,                class_names={0:'setosa',1:'versicolor',2:'virginica'}) viz.save("dtreeviz.svg")

img

从最后这张dtreeviz生成的图可以看出,决策树通过petal width分出setosa,与versicolor和virginica分离开,再从versicolor和virginica里通过petal length和petal width分类,petal width小于1.65cm的就是versicolor,petal length大于等于5.05cm的就是virginica。

模型调参调优效果对比

经过前面数据探索已经初步确定花瓣对鸢尾花分类更有效果,下面还可以继续分析花瓣的长度和宽度对分类的影响,为了对比明显,加上了花萼的数据。

单个特征对分类准确率得分的比较 def acc_test(fn):     acc_list=[]     X_train, X_test, Y_train, Y_test = train_test_split(iris_df[[fn]], iris_df['label'], random_state=0)     for i in range(1,6):         dt_clf = DecisionTreeClassifier(max_depth = i, random_state = 0)         dt_clf.fit(X_train, Y_train)         pred = dt_clf.predict(X_test)         res = metrics.accuracy_score(pred,Y_test)         acc_list.append(res)     return acc_list          acc_pl = acc_test('petal length (cm)') acc_pw = acc_test('petal width (cm)') acc_sl = acc_test('sepal length (cm)') acc_sw = acc_test('sepal width (cm)') import matplotlib import matplotlib.pyplot as plt matplotlib.rcParams['font.sans-serif'] = ['SimHei'] x=range(1,6) plt.figure(figsize=(10,5)) plt.title("花萼长度vs花萼宽度vs花瓣长度vs花瓣宽度") plt.xlabel("max_depth") plt.xticks(rotation=45) plt.ylabel("accuracy") plt.plot(x,acc_pl,'-',label="花瓣长度") plt.plot(x,acc_pw,'-',color='r',label="花瓣宽度") plt.plot(x,acc_sl,'-',color='g',label="花萼长度") plt.plot(x,acc_sw,'-',color='limegreen',label="花萼宽度") plt.legend() plt.grid() plt.savefig("pl_pw_sl_sw.png") plt.show()

img

通过对比可以发现花瓣宽度比长度对分类更有效,且在最大深度为2时就收敛。

多个特征时不同最大深度对分类准确率得分的影响 acc = [] X_train, X_test, Y_train, Y_test = train_test_split(iris_df[['petal length (cm)','petal width (cm)']], iris_df['label'], random_state=0) for i in range(1,10):     dt_clf = DecisionTreeClassifier(max_depth = i, random_state = 0)     dt_clf.fit(X_train, Y_train)     pred = dt_clf.predict(X_test)     res = metrics.accuracy_score(pred,Y_test)     acc.append(res)      print(acc) import matplotlib import matplotlib.pyplot as plt matplotlib.rcParams['font.sans-serif'] = ['SimHei'] y1=acc x1=range(1,10) plt.plot(x1,y1,label='',linewidth=2,color='limegreen',marker='o',markerfacecolor='c',markersize=8,alpha=0.9) plt.xlabel('max_depth') plt.ylabel('accuracy') plt.title('花瓣宽度+花瓣长度') plt.savefig("petal_width_lenth.png") plt.show()

img

通过实验,当使用花瓣的两个特征训练决策树时,最大深度参数设置为3时较好。

04 / 随机森林

随机森林就是很多棵决策树的集成模型,由很多决策树构成的,不同决策树之间没有关联。

当我们进行分类任务时,新的输入样本进入,就让森林中的每一棵决策树分别进行判断和分类,每个决策树会得到一个自己的分类结果,决策树的分类结果中哪一个分类最多,那么随机森林就会把这个结果当做最终的结果。

随机森林模型训练 from sklearn.ensemble import RandomForestClassifier df = pd.DataFrame(iris_dataset.data, columns=iris_dataset.feature_names) df['target'] = iris_dataset.target # 将数据转换为特征矩阵和目标向量 X = df.loc[:, df.columns != 'target'] y = df.loc[:, 'target'].values # 将数据集分割为训练集和测试集 X_train, X_test, Y_train, Y_test = train_test_split(X, y, random_state=0) # scikit-learn里的随机森林模型 (N = 100) rf = RandomForestClassifier(n_estimators=100,                             random_state=0) rf.fit(X_train, Y_train) 随机森林部分可视化

这里设置了100棵树,可视化模型中的第一棵树。

fn=iris_dataset.feature_names cn=iris_dataset.target_names fig, axes = plt.subplots(nrows = 1,ncols = 1,figsize = (4,4), dpi=300) tree.plot_tree(rf.estimators_[0],                feature_names = fn,                 class_names=cn,                filled = True); fig.savefig('rf_individualtree.png')

img

可视化其中的前五棵树 fig, axes = plt.subplots(nrows = 1,ncols = 5,figsize = (10,2), dpi=800) for index in range(0, 5):     tree.plot_tree(rf.estimators_[index],                    feature_names = fn,                     class_names=cn,                    filled = True,                    ax = axes[index]);     axes[index].set_title('Estimator: ' + str(index), fontsize = 11) fig.savefig('rf_5trees.png')

img

由于图太大就放不下,这里设置的小一点。

随机森林调参

下面设置从1到10棵树参数进行随机森林的训练,对比不同参数下的准确率:

acc_rf = [] for i in range(1,10):     rf = RandomForestClassifier(n_estimators=i,                                 random_state=0)     rf.fit(X_train, Y_train)     pred = rf.predict(X_test)     acc_rf.append(metrics.accuracy_score(pred,Y_test)) import matplotlib import matplotlib.pyplot as plt matplotlib.rcParams['font.sans-serif'] = ['SimHei'] x=range(1,10) plt.figure(figsize=(10,5)) plt.title("随机森林") plt.xlabel("n_estimators") plt.xticks(rotation=45) plt.ylabel("accuracy") plt.plot(x,acc_rf,'-',color='limegreen',marker='o',markerfacecolor='c',markersize=6) plt.grid() plt.savefig("rf_acc_curve.png") plt.show()

img

可以发现当随机森林参数设置为5之后分类准确率就基本稳定了,且其最高准确率和决策树一样,都是97.37%。

一点感想

决策树这类传统机器学习算法有极高的可解释性,可能有助于应用在深度学习的可解释性上,或许可以在帮助人们理解深度学习如何决策的方面作为辅助模型进行使用。

ML/DL 数据挖掘 Python 数据挖掘 决策树 随机森林 鸢尾花分类

本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!

北大法宝法律文书数据爬取方案 上一篇 编译原理2-词法分析 下一篇


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3