svm鸢尾花分类python代码_基于SVM、Pipeline、GridSearchCV的鸢尾花分类

本文介绍了如何使用Python的sklearn库中的SVM、Pipeline和GridSearchCV对鸢尾花数据集进行分类。首先解释了SVM、Pipeline和GridSearchCV的基本概念,接着通过加载鸢尾花数据集,使用交叉验证评估SVM分类器的性能。然后,结合Pipeline和GridSearchCV搜索SVM模型的最优参数,并展示了最佳参数和得分。最后,通过classification_report检验了模型的分类效果。
摘要由CSDN通过智能技术生成

SVM中文叫做支持向量机,support vector machine的简写,是常用的分类方法。

Pipeline中文叫做管道,是sklearn中用来打包数据预处理、模型训练这2个步骤的常用方法。

GridSearchCV中文叫做交叉验证网格搜索,是sklearn库中用来搜索模型最优参数的常用方法。

2018年8月26日笔记

1.数据集

Iris(鸢尾花)数据集是多重变量分析的数据集。

数据集包含150行数据,分为3类,每类50行数据。

每行数据包括4个属性:Sepal Length(花萼长度)、Sepal Width(花萼宽度)、Petal Length(花瓣长度)、Petal Width(花瓣宽度)。可通过这4个属性预测鸢尾花属于3个种类的哪一类。

样本数据局部截图:

Iris.png

获取150个样本数据的3种方法:

1.完整的样本数据Iris.csv文件下载链接: https://pan.baidu.com/s/16N0ivGWFrmc73ustPLWPZA 密码: ugun

2.数据集链接:https://gist.github.com/curran/a08a1080b88344b0c8a7

3.在sklearn的skleanrn库中自带了iris数据集,可以导入sklearn库的datasets文件,调用datasets文件中的load_iris方法就可以获得iris数据集。

本文采用的是第3种方法,直接从sklearn库中获取数据。

2.观察数据

image.png

查看数据集对象的属性和方法,代码如下:

from sklearn.datasets import load_iris

dir(load_iris())

上面一段代码的运行结果如下:

['DESCR', 'data', 'feature_names', 'target', 'target_names']

查看数据集的描述,即打印数据集对象的DESCR属性,代码如下:

from sklearn.datasets import load_iris

print(load_iris().DESCR)

与上图中文文档的图对照阅读,可以加强对数据集的理解。

上面一段代码的运行结果如下图所示:

image.png

将150个样本4个特征组成的矩阵赋值给变量X,变量X为大写字母的原因是数学中表示矩阵使用大写字母。

将150个样本1个预测目标值组成的矩阵赋值给变量y。

载入数据集的代码如下:

from sklearn.datasets import load_iris

X = load_iris().data

y = load_iris().target

3.支持向量机分类器

验证分类器效果时,使用交叉验证使结果具有说服性。

交叉验证第1种写法:

SVC是support vector classfier的简写。

从sklearn,model_selection库中导入ShuffleSplit方法。

使用sklearn.model_selection库中的ShuffleSplit方法实例化交叉验证对象时,需要3个参数。第1个关键字参数n_splits是指定进行几次交叉验证,第2个关键字参数train_size是训练集占总样本的百分比,第3个关键字参数test_size是测试集占总样本的百分比。

ShuffleSplit对象的split方法需要1个参数,参数为特征矩阵或者预测目标值。此方法的返回值的数据类型为生成器,可以for循环获取生成器中的每个元素,生成器的每个元素的数据类型为元组,元组中的第1个元素为训练集在样本中的索引,第2个元素为测试集在样本中的索引。

获取训练集和测试集后,实例化模型对象,使用模型对象的fit方法进行训练,使用模型对象的score方法对模型评分。

from sklearn.svm import SVC

from sklearn.model_selection import ShuffleSplit

cv_split = ShuffleSplit(n_splits=5, train_size=0.7, test_size=0.25)

for train_index, test_index in cv_split.split(X):

train_X = X[train_index]

test_X = X[test_index]

train_y = y[train_index]

test_y = y[test_index]

svc_model = SVC()

svc_model.fit(train_X, train_y)

score = svc_model.score(test_X, test_y)

print(score)

上面一段代码的运行结果如下:

交叉验证结果.png

交叉验证第2种写法,代码如下:

from sklearn.svm import SVC

from sklearn.model_selection import ShuffleSplit

from sklearn.model_selection import cross_val_score

cv_split = ShuffleSplit(n_splits=5, train_size=0.7, test_size=0.25)

svc_model = SVC()

score_ndarray = cross_val_score(svc_model, X, y, cv=cv_split)

print(score_ndarray)

score_ndarray.mean()

4.Pipeline和GridSearchCV结合使用

Pipeline和GridSearchCV结合使用搜索模型最优参数。

使用sklearn.pipeline库中的Pipeline方法实例化Pipeline对象时,需要1个参数,参数的数据类型为列表,列表中的每个元素的数据类型为元组或列表。

使用sklearn.model_selection库中的ShuffleSplit方法实例化交叉验证对象时,需要3个参数。第1个关键字参数n_splits是指定进行几次交叉验证,第2个关键字参数train_size是训练集占总样本的百分比,第3个关键字参数test_size是测试集占总样本的百分比。

变量param_grid里面有4个键值对,即对模型的4个参数搜索最优参数。

代码如下:

from sklearn.svm import SVC

from sklearn.pipeline import Pipeline

from sklearn.model_selection import ShuffleSplit

from sklearn.model_selection import GridSearchCV

from sklearn.tree import DecisionTreeClassifier

pipe_steps = [

('svc', SVC())

]

pipeline = Pipeline(pipe_steps)

cv_split = ShuffleSplit(n_splits=5, train_size=0.7, test_size=0.25)

param_grid = {

'svc__cache_size' : [100, 200, 400],

'svc__C': [1, 10, 100],

'svc__kernel' : ['rbf', 'linear'],

'svc__degree' : [1, 2, 3, 4],

}

grid = GridSearchCV(pipeline, param_grid, cv=cv_split)

grid.fit(X, y)

查看表格搜索最优参数和最优得分,代码如下:

print(grid.best_params_)

print(grid.best_score_)

上面一段代码的运行结果如下:

{'svc__C': 1, 'svc__cache_size': 100, 'svc__degree': 1, 'svc__kernel': 'rbf'}

0.9789473684210527

5.模型检验

使用sklearn.metrics库中的classification_report方法检验上一步得出的最优模型分类效果。

代码如下:

from sklearn.metrics import classification_report

predict_y = grid.predict(X)

print(classification_report(y, predict_y))

上面一段代码的运行结果如下图所示:

image.png

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值