数据分析入门系列教程-SVM实战
公众号后台回复“图书“,了解更多号主新书内容
作者:周萝卜
来源:萝卜大杂烩
上一节我们了解了 SVM 的原理,今天就来带你进行 SVM 的实战。
SVM 是有监督的学习模型,就是说我们需要先对数据打上标签,之后通过求解最大分类间隔来求解二分类问题,而对于多分类问题,可以组合多个 SVM 分类器来处理。
sklearn 中的 SVM
其实在工具 sklearn 中,已经封装了多种 SVM 模型,这里我们重点介绍下 SVC,该模型既可以训练线性可分的数据,也可以训练线性不可分数据。
from sklearn.svm import SVC
相关参数
参数名 | 含义 |
---|---|
C | 惩罚系数,默认为1.0。当 C 越大时,分类器的准确性越高,但是泛化能力越低。反之,泛化能力强,但是准确性会降低。 |
kernel |
核函数类型,默认为 rbf。主要的核函数类型如下: liner:线性核函数,在数据为线性可分的情况下使用 poly:多项式核函数,可以将数据从低维空间映射到高维空间,但是参数较多,计算量大 rbf:高斯核函数,同样可以将数据从低维空间映射到高维空间,相比 poly,参数较少,通用性较好 sigmoid:当使用 sigmoid 核函数时,SVM 实现的是一个多层神经网络 |
gamma | 核函数系数,默认为样本特征数的倒数,即 gamma = 1/ n_features |
max_iter | 最大迭代次数,默认为-1,不做限制 |
class_weight | 类别权重,dict 类型或 str 类型,可选参数,默认为 None。如果给定参数'balance',则使用 y 的值自动调整为与输入数据中的类频率成反比的权重。 |
乳腺癌预测
本例子使用的数据可以在这里下载
https://github.com/zhouwei713/DataAnalyse/tree/master/SVM
数据探索
我们先来加载数据,查看下数据情况
import pandas as pd
breast = pd.read_csv('breast_data.csv')
breast.head()
数据集的字段比较多,我整理了一个表格
我们要预测的标签就是字段 diagnosis,是一个二分类的问题。
除去 id 和 diagnosis 字段,还有30个字段,它们都是某些特征的平均值、方差值和最大值,所以真实的特征是10个,每个特征存在3个维度的数据。
breast.isnull().sum() # 查看缺失值
>>>
id 0
diagnosis 0
radius_mean 0
texture_mean 0
perimeter_mean 0
area_mean 0
smoothness_mean 0
compactness_mean 0
concavity_mean 0
concave points_mean 0
symmetry_mean 0
fractal_dimension_mean 0
radius_se 0
texture_se 0
perimeter_se 0
area_se 0
smoothness_se 0
compactness_se 0
concavity_se 0
concave points_se 0
symmetry_se 0
fractal_dimension_se 0
radius_worst 0
texture_worst 0
perimeter_worst 0
area_worst 0
smoothness_worst 0
compactness_worst 0
concavity_worst 0
concave points_worst 0
symmetry_worst 0
fractal_dimension_worst 0
dtype: int64
数据集很完整,并没有缺失值
print(breast['diagnosis'].value_counts())
>>>
B 357
M 212
Name: diagnosis, dtype: int64
患有恶性肿瘤的有212人,良性患者为357人
数据清洗
首先去掉不需要的字段,ID 字段
breast.drop("id", axis=1, inplace=True)
再把标签列(diagnosis)转换成0-1的形式,可以使用独热编码,也可以直接转换
breast['diagnosis']=breast['diagnosis'].map({'M': 1, 'B': 0})
最后再把数据分为三个部分,分别为 mean,se 和 worst
breast_mean = list(breast.columns[1:11])
breast_se = list(breast.columns[11:21])
breast_worst = list(breast.columns[21:31])
特征关联性分析
还是使用热力图来观察各个特征之间的关联关系
import matplotlib.pyplot as plt
import seaborn as sns
breast_corr = breast[breast_mean].corr()
sns.heatmap(breast_corr, annot=True)
plt.show()
我们可以清晰的看出, radius_mean 和 perimeter_mean,area_mean 的相关性非常大,compactness_mean 和 concave_points_mean,concavity_mean 的相关性也很高,所以我们可以只取它们中的一个作为代表即可。
特征选择
我们做特征选择的目的就是为了降维,用少量的特征代表数据的特性,从而提高分类器的泛化能力,避免模型过拟合。
因为 mean,se 和 worst 分别是每个特征的三个不同度量方式,所以可以只取 mean 一类作为代表。又因为上面的相关性分析,可以把相关性高的特征中选出一个作为代表即可。
breast_features = ['radius_mean','texture_mean', 'smoothness_mean','compactness_mean','symmetry_mean', 'fractal_dimension_mean']
拆分数据集
把数据拆分成训练集和测试集
train, test = train_test_split(breast, test_size = 0.3)
# 抽取特征选择的数值作为训练和测试数据
X_train = train[breast_features]
y_train =train['diagnosis']
X_test = test[breast_features]
y_test =test['diagnosis']
数据规范化
不同于决策树,SVM 模型还是需要进行数据规范化的,这里还是使用 Z-Score 规范化
from sklearn.preprocessing import StandardScaler
ss = StandardScaler()
X_train = ss.fit_transform(X_train)
X_test = ss.transform(X_test)
训练和预测
最后,就可以构建 SVM 分类器进行训练和预测了
from sklearn.svm import SVC
from sklearn.metrics import accuracy_score
# 创建 SVM 分类器
model = SVC()
# 用训练集做训练
model.fit(X_train,y_train)
# 用测试集做预测
prediction=model.predict(X_test)
print('准确率: ', accuracy_score(prediction,y_test))
>>>
准确率: 0.9298245614035088
看起来效果还不错,已经达到了 92%
查看性能报告
我们可以利用 sklearn 提供的性能报告,来查看模型的性能
from sklearn.metrics import classification_report
print(classification_report(y_test, prediction))
>>>precision recall f1-score support 0 0.94 0.95 0.95 1111 0.91 0.88 0.90 60 micro avg 0.93 0.93 0.93 171macro avg 0.93 0.92 0.92 171
weighted avg 0.93 0.93 0.93 171
函数 classification_report 需要传递两个参数,测试标签和预测标签
报告大致意思为:
每个类别的准确率,召回率,f1-score(准确率和召回率的组合运算值)以及每个类别的个数
同时还提供了各种平均值,最小,最大和加权平均值。
毒蘑菇检测
同样,还是可以在这里找到数据集
https://github.com/zhouwei713/DataAnalyse/tree/master/SVM
还是先来探索下数据
import pandas as pd
import numpy as np
mush = pd.read_csv('mushrooms.csv')
mush.head()
发现特征也是很多的,我们不再关心每一列具体都是什么含义了,只需要知道 class 是标签列,用于区分蘑菇是否有毒。特特征提取由于我们的数据集中,每一列都是字符,不是数字类型,所以不能够通过构造热力图来判断特征之间的相关性,那么我们可以使用另一种更加普遍的方式,主成分分析法来做特征提取
主成分分析 PCA
是一种统计方法,通过正交变换将一组可能存在相关性的变量转换为一组线性不相关的变量,转换后的这组变量叫主成分。
而 sklearn 同样为我们提供了该方法的实现
from sklearn.decomposition import PCA
主要参数:
n_components:需要保留的特征个数,如果 n_components = 1,将把原始数据降到一维;如果赋值为 string,如 n_components='mle',将自动选取特征个数,使得满足所要求的方差百分比;如果没有赋值,默认为 None,特征个数不会改变(特征数据本身会改变)
whiten:默认为 False,是否白化,使得每个特征具有相同的方差
特征转换
由于数据集中特征都是字符类型,需要通过独热编码的方法转换
mush_encoded = pd.get_dummies(mush)
print(mush_encoded.head())
接下来再进行特征和标签的提取
X_mush = mush_encoded.iloc[:,2:]
y_mush = mush_encoded.iloc[:,1]
构建 SVM 分类器
from sklearn.svm import SVC
from sklearn.pipeline import make_pipeline
pca = PCA(n_components=10, whiten=True, random_state=42)
svc = SVC(kernel='linear', class_weight='balanced')
model = make_pipeline(pca, svc)
这里用到了 make_pipeline 工具,该工具就是 sklearn 提供的便于编程的小工具,即把通过 PCA 做过处理的数据依次传递给模型(svc)
拆分训练集和测试集
from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(X_mush, y_mush,random_state=42)
使用网格搜索的方式调参
from sklearn.model_selection import GridSearchCV
param_grid = {'svc__C': [1, 5, 10, 50]}
grid = GridSearchCV(model, param_grid)
grid.fit(X_train, y_train)
print(grid.best_params_)
>>>
{'svc__C': 50}
这里我们应用到了 GridSearchCV 工具,该工具通过我们传递进去的参数 param_grid 来判断需要对模型的哪些参数做循环拟合测试,并最终得出不同参数下模型的得分情况。
从上面的输入可以看出,在惩罚系数为50的情况下,模型的表现是最好的。
而对于 param_grid 可以使用的 key 值,我们可以用如下的方法查看
model.get_params().keys()
>>>
dict_keys(['memory', 'steps', 'pca', 'svc', 'pca__copy', 'pca__iterated_power', 'pca__n_components', 'pca__random_state', 'pca__svd_solver', 'pca__tol', 'pca__whiten', 'svc__C', 'svc__cache_size', 'svc__class_weight', 'svc__coef0', 'svc__decision_function_shape', 'svc__degree', 'svc__gamma', 'svc__kernel', 'svc__max_iter', 'svc__probability', 'svc__random_state', 'svc__shrinking', 'svc__tol', 'svc__verbose'])
此处的 model 是通过 make_pipeline 得到的
查看模型得分
在找到了最佳的模型参数后,我们就可以打印下模型的性能得分了
from sklearn.metrics import classification_report
svm_model = grid.best_estimator_
yfit = svm_model.predict(X_test)
print(classification_report(y_test, yfit))
>>>precision recall f1-score support 0 0.94 0.96 0.95 10401 0.96 0.94 0.95 991 micro avg 0.95 0.95 0.95 2031macro avg 0.95 0.95 0.95 2031
weighted avg 0.95 0.95 0.95 2031
看起来模型还不错,平均都是在 95% 了。
混淆矩阵
再来看下混淆矩阵的情况,在前面的章节,我们打印过简易版的混淆矩阵,现在我们通过热力图的形式来展现混淆矩阵
from sklearn.metrics import confusion_matrix
mat = confusion_matrix(y_test, yfit)
sns.heatmap(mat.T, square=True, annot=True, fmt='d', cbar=False)
plt.xlabel('true label')
plt.ylabel('predicted label')
本节完整代码
https://github.com/zhouwei713/DataAnalyse/tree/master/SVM
总结
今天带你实践了两个 SVM 分类的例子,希望你从这个过程中能够体会到整个项目的执行流程,包括数据加载、数据探索、数据清洗、特征转换、特征选择(主成分分析)、SVM 训练和评估等环节。
我们也能够看到,sklearn 已经为我们提供了大部分的实现,我们所需要做的就是理解业务(数据),找出最优的超参数,而把其他繁琐的数学运算先暂时放到一旁。我们需要在实战当中,熟悉流程,不断的训练自身的数据化思维和数据敏感度。
◆ ◆ ◆ ◆ ◆
麟哥新书已经在京东上架了,我写了本书:《拿下Offer-数据分析师求职面试指南》,目前京东正在举行100-40活动,大家可以用相当于原价5折的预购价格购买,还是非常划算的:
数据森麟公众号的交流群已经建立,许多小伙伴已经加入其中,感谢大家的支持。大家可以在群里交流关于数据分析&数据挖掘的相关内容,还没有加入的小伙伴可以扫描下方管理员二维码,进群前一定要关注公众号奥,关注后让管理员帮忙拉进群,期待大家的加入。管理员二维码:猜你喜欢● 卧槽!原来爬取B站弹幕这么简单● 厉害了!麟哥新书登顶京东销量排行榜!● 笑死人不偿命的知乎沙雕问题排行榜
● 用Python扒出B站那些“惊为天人”的阿婆主!● 你相信逛B站也能学编程吗
数据分析入门系列教程-SVM实战相关推荐
- 数据分析入门系列教程-常用图表
点击上方"菜鸟学Python",选择"星标"公众号 重磅干货,第一时间送达 今天我们来学习下数据可视化,其实在前面的章节中,我们也接触到了一些数据可视化的知识, ...
- 数据分析入门系列教程-微博热点
公众号后台回复"图书",了解更多号主新书内容 作者:周萝卜 来源:萝卜大杂烩 在前面,我们学习了爬虫的基本流程和必备技能,对于刚刚入门的人来说,打好基础,掌握基本步骤是最为重要的. ...
- 数据分析入门系列教程-决策树原理
公众号后台回复"图书",了解更多号主新书内容 作者:周萝卜 来源:萝卜大杂烩 今天我们一起来学习决策树,那么什么是决策树呢,其实在生活中,我们无时无刻不在使用它. 比如现在有朋友给 ...
- 深度学习入门系列6项目实战:声纳回声识别
大家好,我技术人Howzit,这是深度学习入门系列第六篇,欢迎大家一起交流! 深度学习入门系列1:多层感知器概述 深度学习入门系列2:用TensorFlow构建你的第一个神经网络 深度学习入门系列3: ...
- Power BI入门系列教程
欢迎使用Power BI入门系列教程. 在接下来的4周里,我会向您介绍Excel和Power BI中最新和最强大功能的基本用法.如果您有着下面这些疑问: 想学习数据分析,不知道从什么工具入手? 从没有 ...
- Provisioning Services 7.8 入门系列教程之十三 使用 Boot Device Management(BDM)
续Provisioning Services 7.8 入门系列教程之十二 实现高可用性 可以使用 Boot Device Management 实用程序将 IP 和引导信息(引导设备)交付给目标设备, ...
- Provisioning Services 7.8 入门系列教程之十四 UEFI支持和BOOTPTAB 编辑器
续Provisioning Services 7.8 入门系列教程之十三 使用 Boot Device Management(BDM) UEFI,全称Unified Extensible Firmw ...
- graphviz 画决策树_数据挖掘入门系列教程(四)之基于scikit-lean决策树处理Iris
数据挖掘入门系列教程(四)之基于scikit-lean决策树处理Iris 加载数据集 数据特征 训练 随机森林 调参工程师 结尾 数据挖掘入门系列教程(四)之基于scikit-lean决策树处理Iri ...
- Provisioning Services 7.8 入门系列教程之十一 通过版本控制自动更新虚拟磁盘
续Provisioning Services 7.8 入门系列教程之十 通过类自动更新虚拟磁盘 从前两的两种更新方式可以看出,它们有一个共同的特点,即需要产生(复制)完成的虚拟磁盘副本,然后进行相关的 ...
- html5游戏制作入门系列教程(八)
今天,我已经准备了一个新的游戏 – SkyWalker.基本上 – 这是用飞飞行模拟射击类游戏.我们的目标到达终点线.这个游戏还有其它一些特点,例如使用飞机运动动画和爆炸动画,多按键处理(例如同时移动 ...
最新文章
- 2022-2028年中国丁晴橡胶行业市场深度分析及投资规划分析报告
- 定位AI交互技术服务商,声智科技完成近亿元A轮融资,将拓展安防、汽车等新场景
- 线性代数 matlab,实用大众线性代数(MATLAB版)
- php设置mysql查询编码,php连接mysql时怎么设置编码方式
- 超级玛丽游戏(洛谷-P1000)
- 快速修剪技巧_20个相见恨晚的CAD画图神技巧,让你效率飞升!
- 学习vue-router源码记录-1
- [原]tornado源码分析系列(五)[HTTPServer 层]
- nodejs如何实现ajax,nodejs + express怎么实现Ajax方式及其简单功能
- php如何进行微信支付宝,php实现微信和支付宝支付的示例代码
- 数据不平衡问题——SMOTE算法赏析
- ubuntu各种实践笔记
- 【前端面试题】前端基础 | 八股文 | HTTP网络 | Vue | React
- docker exec -it container1 /bin/bash 异常
- 学界 | 大数据背景下,景观研究怎么做?
- 再见了,“阅兵村”!
- 谈谈对python中的日期、时间、时区的理解(1)
- Mac 使用brew安装phpredis扩展
- 软件测试建模:Google ACC
- matlab练习程序(随机粒子切换特效)