赞
踩
在这篇博客中,我们使用以下几个库来实现决策树算法
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是Python语言的一个扩充程序库。支持高级大量的维度数组与矩阵运算,此外也针对数组运算提供大量的数学函数库。Numpy内部解除了Python的PIL(全局解释器锁),运算效率极好,是大量机器学习框架的基础库!
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是一个python的数据可视化模块,能够创建多数类型的图表,如条形图,散点图,条形图,饼图,堆叠图,3D 图和地图图表。
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
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()
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)
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)导出决策树,将数据用决策树算法进行训练后,该算法会将数据进行分类,我们使用 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)
使用一个Graphviz软件得到决策树如下:
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
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。