欢迎访问 生活随笔!

生活随笔

当前位置: 首页 > 编程资源 > 编程问答 >内容正文

编程问答

决策树实现鸢尾花分类

发布时间:2023/12/29 编程问答 42 豆豆
生活随笔 收集整理的这篇文章主要介绍了 决策树实现鸢尾花分类 小编觉得挺不错的,现在分享给大家,帮大家做个参考.

介绍

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

  • 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

数据集

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

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

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

iris=sns.load_dataset("iris") print(iris.head()) 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

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

print(iris.shape) (150, 5)

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

print(iris.describe()) 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

可视化

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()

决策树算法实现

划分数据集

yyy 表示数据集的标签,XXX 代表每一行除标签以外的特征。注意这里的axis=1axis=1axis=1表述行,axis=0axis=0axis=0表述列。

y=iris.species X=iris.drop('species',axis=1)
  • 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)从scikit-learn中调用决策树算法

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

clf=tree.DecisionTreeClassifier() clf.fit(X_train,y_train) 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')

3)导出决策树,将数据用决策树算法进行训练后,该算法会将数据进行分类,我们使用graphvizgraphvizgraphviz库生成一个.dot.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)

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

预测(predict()函数)

y_pred=(clf.predict(X_test))

输出正确率

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

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

print("Accuracy Score") print(accuracy_score(y_test,y_pred)*100) Accuracy Score 95.55555555555556

总结

以上是生活随笔为你收集整理的决策树实现鸢尾花分类的全部内容,希望文章能够帮你解决所遇到的问题。

如果觉得生活随笔网站内容还不错,欢迎将生活随笔推荐给好友。