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

简介: SVM中文叫做支持向量机,support vector machine的简写,是常用的分类方法。Pipeline中文叫做管道,是sklearn中用来打包数据预处理、模型训练这2个步骤的常用方法。

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
目录
相关文章
|
弹性计算 NoSQL Java
若依框架---前后端分离项目部署实践
若依框架---前后端分离项目部署实践
1026 0
|
6月前
|
文字识别 测试技术 语音技术
看听说写四维突破:Qwen2.5-Omni 端到端多模态模型开源!
今天,通义千问团队发布了 Qwen2.5-Omni,Qwen 模型家族中新一代端到端多模态旗舰模型。该模型专为全方位多模态感知设计,能够无缝处理文本、图像、音频和视频等多种输入形式,并通过实时流式响应同时生成文本与自然语音合成输出。
1317 6
看听说写四维突破:Qwen2.5-Omni 端到端多模态模型开源!
|
7月前
|
人工智能 自然语言处理 数据可视化
Agentic Reasoning:推理界RAG诞生!牛津大学框架让LLM学会『组队打怪』:动态调用搜索/代码代理,复杂任务准确率飙升50%
Agentic Reasoning 是牛津大学推出的增强大型语言模型(LLM)推理能力的框架,通过整合外部工具提升多步骤推理、实时信息检索和复杂逻辑关系组织的能力。
305 1
|
11月前
|
存储 缓存 算法
|
10月前
|
分布式计算 Java 开发工具
阿里云MaxCompute-XGBoost on Spark 极限梯度提升算法的分布式训练与模型持久化oss的实现与代码浅析
本文介绍了XGBoost在MaxCompute+OSS架构下模型持久化遇到的问题及其解决方案。首先简要介绍了XGBoost的特点和应用场景,随后详细描述了客户在将XGBoost on Spark任务从HDFS迁移到OSS时遇到的异常情况。通过分析异常堆栈和源代码,发现使用的`nativeBooster.saveModel`方法不支持OSS路径,而使用`write.overwrite().save`方法则能成功保存模型。最后提供了完整的Scala代码示例、Maven配置和提交命令,帮助用户顺利迁移模型存储路径。
|
机器学习/深度学习 存储 算法
R语言实现SMOTE与SMOGN算法解决不平衡数据的回归问题
R语言实现SMOTE与SMOGN算法解决不平衡数据的回归问题
252 1
R语言实现SMOTE与SMOGN算法解决不平衡数据的回归问题
|
机器学习/深度学习 算法 数据可视化
基于线性SVM的CIFAR-10图像集分类
基于线性SVM的CIFAR-10图像集分类
891 0
基于线性SVM的CIFAR-10图像集分类
|
分布式计算 Hadoop 测试技术
Hadoop格式化前备份数据
【7月更文挑战第22天】
259 7
|
机器学习/深度学习 算法
现代深度学习框架构建问题之tinyDL中机器学习的通用组件与深度学习如何解决
现代深度学习框架构建问题之tinyDL中机器学习的通用组件与深度学习如何解决
363 2
|
数据安全/隐私保护
耐震时程曲线,matlab代码,自定义反应谱与地震波,优化源代码,地震波耐震时程曲线
地震波格式转换、时程转换、峰值调整、规范反应谱、计算反应谱、计算持时、生成人工波、时频域转换、数据滤波、基线校正、Arias截波、傅里叶变换、耐震时程曲线、脉冲波合成与提取、三联反应谱、地震动参数、延性反应谱、地震波缩尺、功率谱密度