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

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

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

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
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 205,236评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,867评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,715评论 0 340
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,899评论 1 278
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,895评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,733评论 1 283
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,085评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,722评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,025评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,696评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,816评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,447评论 4 322
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,057评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,009评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,254评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,204评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,561评论 2 343

推荐阅读更多精彩内容