数据分析入门系列教程-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()


微信图片_20220520180429.png

数据集的字段比较多,我整理了一个表格


微信图片_20220520180518.jpg

我们要预测的标签就是字段 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()


微信图片_20220520180548.png

我们可以清晰的看出, 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       111
           1       0.91      0.88      0.90        60   micro avg       0.93      0.93      0.93       171
   macro 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()


微信图片_20220520180649.png

发现特征也是很多的,我们不再关心每一列具体都是什么含义了,只需要知道 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())


微信图片_20220520180709.png

接下来再进行特征和标签的提取

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      1040
           1       0.96      0.94      0.95       991   micro avg       0.95      0.95      0.95      2031
   macro 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')


微信图片_20220520180741.png

本节完整代码

https://github.com/zhouwei713/DataAnalyse/tree/master/SVM


总结


今天带你实践了两个 SVM 分类的例子,希望你从这个过程中能够体会到整个项目的执行流程,包括数据加载、数据探索、数据清洗、特征转换、特征选择(主成分分析)、SVM 训练和评估等环节。

我们也能够看到,sklearn 已经为我们提供了大部分的实现,我们所需要做的就是理解业务(数据),找出最优的超参数,而把其他繁琐的数学运算先暂时放到一旁。我们需要在实战当中,熟悉流程,不断的训练自身的数据化思维和数据敏感度。

微信图片_20220520180816.png


练习题


在毒蘑菇的例子中,我是保留了10个特征,你能否尝试下如果保留15个特征,准确率会有什么变化呢?

相关文章
|
1月前
|
自然语言处理 小程序 数据挖掘
数据分析实战-Python实现博客评论数据的情感分析
数据分析实战-Python实现博客评论数据的情感分析
102 0
|
2月前
|
数据采集 存储 数据挖掘
Python 爬虫实战之爬拼多多商品并做数据分析
Python爬虫可以用来抓取拼多多商品数据,并对这些数据进行数据分析。以下是一个简单的示例,演示如何使用Python爬取拼多多商品数据并进行数据分析。
|
2月前
|
数据采集 存储 数据可视化
Python数据分析从入门到实践
Python数据分析从入门到实践
|
7天前
|
供应链 搜索推荐 数据挖掘
Pandas实战案例:电商数据分析的实践与挑战
【4月更文挑战第16天】本文通过一个电商数据分析案例展示了Pandas在处理销售数据、用户行为分析及商品销售趋势预测中的应用。在数据准备与清洗阶段,Pandas用于处理缺失值、重复值。接着,通过用户购买行为和商品销售趋势分析,构建用户画像并预测销售趋势。实践中遇到的大数据量和数据多样性挑战,通过分布式计算和数据标准化解决。未来将继续深入研究Pandas与其他先进技术的结合,提升决策支持能力。
|
7天前
|
存储 数据可视化 数据挖掘
实战案例:Pandas在金融数据分析中的应用
【4月更文挑战第16天】本文通过实例展示了Pandas在金融数据分析中的应用。案例中,一家投资机构使用Pandas加载、清洗股票历史价格数据,删除无关列并重命名,将日期设为索引。接着,数据被可视化以观察价格走势,进行基本统计分析了解价格分布,以及计算移动平均线来平滑波动。Pandas的便捷功能在金融数据分析中体现出高效率和实用性。
|
16天前
|
机器学习/深度学习 数据可视化 数据挖掘
利用Python进行数据分析与可视化:从入门到精通
本文将介绍如何使用Python语言进行数据分析与可视化,从基础概念到高级技巧一应俱全。通过学习本文,读者将掌握Python在数据处理、分析和可视化方面的核心技能,为实际项目应用打下坚实基础。
|
2月前
|
数据采集 存储 数据挖掘
Python 爬虫实战之爬拼多多商品并做数据分析
在上面的代码中,我们使用pandas库创建DataFrame存储商品数据,并计算平均价格和平均销量。最后,我们将计算结果打印出来。此外,我们还可以使用pandas库提供的其他函数和方法来进行更复杂的数据分析和处理。 需要注意的是,爬取拼多多商品数据需要遵守拼多多的使用协议和规定,避免过度请求和滥用数据。
|
2月前
|
机器学习/深度学习 数据可视化 数据挖掘
Python数据分析:从入门到实践
Python数据分析:从入门到实践
|
5天前
|
机器学习/深度学习 数据挖掘 计算机视觉
python数据分析工具SciPy
【4月更文挑战第15天】SciPy是Python的开源库,用于数学、科学和工程计算,基于NumPy扩展了优化、线性代数、积分、插值、特殊函数、信号处理、图像处理和常微分方程求解等功能。它包含优化、线性代数、积分、信号和图像处理等多个模块。通过SciPy,可以方便地执行各种科学计算任务。例如,计算高斯分布的PDF,需要结合NumPy使用。要安装SciPy,可以使用`pip install scipy`命令。这个库极大地丰富了Python在科学计算领域的应用。
9 1
|
5天前
|
数据可视化 数据挖掘 Python
Python中数据分析工具Matplotlib
【4月更文挑战第14天】Matplotlib是Python的数据可视化库,能生成多种图表,如折线图、柱状图等。以下是一个绘制简单折线图的代码示例: ```python import matplotlib.pyplot as plt x = [1, 2, 3, 4, 5] y = [2, 4, 6, 8, 10] plt.figure() plt.plot(x, y) plt.title('简单折线图') plt.xlabel('X轴') plt.ylabel('Y轴') plt.show() ```
9 1

热门文章

最新文章