基于SVM、Pipeline、GridSearchCV的鸢尾花分类

  1. 云栖社区>
  2. 博客>
  3. 正文

基于SVM、Pipeline、GridSearchCV的鸢尾花分类

潇洒坤 2018-08-26 08:14:00 浏览1107
展开阅读全文

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个种类的哪一类。
样本数据局部截图:

img_6d28d040e19ed7ed2c87d8b48d20b8c7.png
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.观察数据

鸢尾花数据集详细中文解释链接:http://sklearn.apachecn.org/cn/0.19.0/datasets/index.html#iris
网页中内容如下图所示:

img_bc46758276b75c0deb80660f50011936.png
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)

与上图中文文档的图对照阅读,可以加强对数据集的理解。
上面一段代码的运行结果如下图所示:


img_c4549b60bd49dc052be41632731a0e29.png
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)

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


img_982b4b79251d85c494761add9b11dc0c.png
交叉验证结果.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))

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


img_7c30a8f197164492606d15ec96a991de.png
image.png

网友评论

登录后评论
0/500
评论