当前位置:   article > 正文

决策树实现鸢尾花分类_用决策树实现鸢尾花数据集(iris.data)的分类。 绘制模型在训练集和测试集上的准确

用决策树实现鸢尾花数据集(iris.data)的分类。 绘制模型在训练集和测试集上的准确

介绍

在这篇博客中,我们使用以下几个库来实现决策树算法

  • scikit-learn机器学习库

scikit-learn最先是由David Cournapeau在2007年发起的一个Google Summer of Code项目,从那时起这个项目就已经拥有很多的贡献者了,该项目目前也是由一个志愿者团队在维护着。scikit-learn是python的一个开源机器学习模块,它建立在numpy,scipy和matplotlib模块之上。scikit-learn最大的特点就是,为用户提供各种机器学习算法接口,可以让用户简单、高效地进行数据挖掘和数据分析。
scikit-learn内包含了常用的机器学习数据集,比如做分类的iris和digit数据集,用于回归的经典数据集Boston house prices。scikit-learn载入的数据集是以类似于字典的形式存放的,该对象中包含了所有有关该数据的数据信息(甚至还有参考文献)。其中的数据值统一存放在.data的成员中。

  • numpy

NumPy是Python语言的一个扩充程序库。支持高级大量的维度数组与矩阵运算,此外也针对数组运算提供大量的数学函数库。Numpy内部解除了Python的PIL(全局解释器锁),运算效率极好,是大量机器学习框架的基础库!

  • pandas

Pandas是一个开源的Python数据分析库。Pandas把结构化数据分为了三类:
1)Series,1维序列,可视作为没有column名的、只有一个column的DataFrame;
2)DataFrame,同Spark SQL中的DataFrame一样,其概念来自于R语言,为多column并schema化的2维结构化数据,可视作为Series的容器(container);
3)Panel,为3维的结构化数据,可视作为DataFrame的容器;

  • matplotlib

matplotlib是一个python的数据可视化模块,能够创建多数类型的图表,如条形图,散点图,条形图,饼图,堆叠图,3D 图和地图图表。

  • seaborn

seaborn与matlotlib同出一源,只是把matplotlib进行了封装,让许多方法调用时变得更加简便。简单的操作就能够画出更加复杂的图像。由于seaborn是调用的matplotlib,在使用时,两个库可以进行相互操作。

导入库
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
import pandas as pd
from sklearn import tree
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score
from sklearn.externals import joblib
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

数据集

鸢尾花数据集(iris_data)是原则20世纪30年代的经典数据集。它是用统计进行分类的鼻祖。

1)下面我们从scikit-learn接口导入数据集(第一行)

在导入数据集后我们打印前五行发现每个样本有五个参数,分别为花萼长度、花萼宽度、花瓣长度、花瓣宽度和所属类别(山鸢尾花、变色鸢尾花和维吉尼亚鸢尾花)。

iris=sns.load_dataset("iris")
print(iris.head())
  • 1
  • 2
   sepal_length  sepal_width  petal_length  petal_width species
0           5.1          3.5           1.4          0.2  setosa
1           4.9          3.0           1.4          0.2  setosa
2           4.7          3.2           1.3          0.2  setosa
3           4.6          3.1           1.5          0.2  setosa
4           5.0          3.6           1.4          0.2  setosa
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

2)现在我们打印一下这个数据集的shape,可以发现这个数据集一共包含150个样本,每个样本五个参数。

print(iris.shape)
  • 1
(150, 5)
  • 1

3)打印数据集四个特征的详细分布情况

print(iris.describe())
  • 1
       sepal_length  sepal_width  petal_length  petal_width
count    150.000000   150.000000    150.000000   150.000000
mean       5.843333     3.057333      3.758000     1.199333
std        0.828066     0.435866      1.765298     0.762238
min        4.300000     2.000000      1.000000     0.100000
25%        5.100000     2.800000      1.600000     0.300000
50%        5.800000     3.000000      4.350000     1.300000
75%        6.400000     3.300000      5.100000     1.800000
max        7.900000     4.400000      6.900000     2.500000
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

可视化

seaborn画图-----pairplot多变量图

1)格式

seaborn.pairplot(data, hue=None, hue_order=None, palette=None, vars=None, x_vars=None, y_vars=None, kind=‘scatter’, diag_kind=‘hist’, markers=None, size=2.5, aspect=1, dropna=True, plot_kws=None, diag_kws=None, grid_kws=None)

2)基本参数

size : 默认 6,图的尺度大小(正方形)。参数类型:numeric

hue : 使用指定变量为分类变量画图。参数类型:string (变量名)

hue_order : list of strings Order for the levels of the hue variable in the palette

palette : 调色板颜色

markers : 使用不同的形状。参数类型:list

aspect : scalar, optional。Aspect * size gives the width (in inches) of each facet.

{plot, diag, grid}_kws : 指定其他参数。参数类型:dicts

sns.set(style="ticks")
sns.pairplot(iris,hue="species",palette="bright")
plt.show()
  • 1
  • 2
  • 3

在这里插入图片描述

决策树算法实现

划分数据集

y y y 表示数据集的标签, X X X 代表每一行除标签以外的特征。注意这里的 a x i s = 1 axis=1 axis=1表述行, a x i s = 0 axis=0 axis=0表述列。

y=iris.species
X=iris.drop('species',axis=1)
  • 1
  • 2
  • train_test_split函数

train_test_split函数用于将矩阵随机划分为训练子集和测试子集,并返回划分好的训练集测试集样本和训练集测试集标签。

格式:

X_train,X_test, y_train, y_test =cross_validation.train_test_split(train_data,train_target,test_size=0.3, random_state=0)

  • 参数解释

train_data:被划分的样本特征集

train_target:被划分的样本标签

test_size:如果是浮点数,在0-1之间,表示样本占比;如果是整数的话就是样本的数量

random_state:是随机数的种子。

随机数种子:其实就是该组随机数的编号,在需要重复试验的时候,保证得到一组一样的随机数。比如你每次都填1,其他参数一样的情况下你得到的随机数组是一样的。但填0或不填,每次都会不一样。

随机数的产生取决于种子,随机数和种子之间的关系遵从以下两个规则:

1)种子不同,产生不同的随机数;

2)种子相同,即使实例不同也产生相同的随机数。

from sklearn.model_selection import train_test_split
X_train,X_test,y_train,y_test=train_test_split(X,y,test_size=0.3,random_state=100,stratify=y)
  • 1
  • 2
决策树算法

1)从scikit-learn中调用决策树算法

2)训练(fit(x,y))

clf=tree.DecisionTreeClassifier()
clf.fit(X_train,y_train)
  • 1
  • 2
DecisionTreeClassifier(class_weight=None, criterion='gini', max_depth=None,
            max_features=None, max_leaf_nodes=None,
            min_impurity_decrease=0.0, min_impurity_split=None,
            min_samples_leaf=1, min_samples_split=2,
            min_weight_fraction_leaf=0.0, presort=False, random_state=None,
            splitter='best')
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

3)导出决策树,将数据用决策树算法进行训练后,该算法会将数据进行分类,我们使用 g r a p h v i z graphviz graphviz库生成一个 . d o t .dot .dot文件。

from sklearn.datasets import load_iris
iris=load_iris()
tree.export_graphviz(clf,out_file="iris.dot",feature_names=iris.feature_names,class_names=iris.target_names,filled=True,rounded=True,special_characters=True)
  • 1
  • 2
  • 3

使用一个Graphviz软件得到决策树如下:
tree

预测(predict()函数)
y_pred=(clf.predict(X_test))
  • 1

输出正确率

Recall =预测正确正/(预测正确正+预测错误的负)

Accuracy = (true positives + true negatives) / (total examples)

print("Accuracy Score")
print(accuracy_score(y_test,y_pred)*100)
  • 1
  • 2
Accuracy Score
95.55555555555556
  • 1
  • 2
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/笔触狂放9/article/detail/701822
推荐阅读
相关标签
  

闽ICP备14008679号