乐趣区

关于机器学习:机器学习四通俗理解支持向量机SVM及代码实践

上一篇文章咱们介绍了应用逻辑回归来解决分类问题,本文咱们讲一个更弱小的分类模型。本文仍旧偏重代码实际,你会发现咱们解决问题的伎俩越来越丰盛,问题解决起来越来越简略。

反对向量机 (Support Vector Machine, SVM) 是最受欢迎的机器学习模型之一。它特地适宜解决中小型简单数据集的分类工作。

一、什么是反对向量机

SMV 在泛滥实例中寻找一个最优的决策边界,这个边界上的实例叫做反对向量,它们“反对”(撑持)分来到超平面,所以它叫反对向量机。

那么咱们如何保障咱们失去的决策边界是 最优 的呢?

如上图,三条彩色直线都能够完满宰割数据集。由此可知,咱们仅用繁多直线能够失去无数个解。那么,其中怎么的直线是最优的呢?

如上图,咱们计算直线到宰割实例的间隔,使得咱们的直线与数据集的 间隔尽可能的远,那么咱们就能够失去惟一的解。最大化上图虚线之间的间隔就是咱们的指标。而上图中重点圈出的实例就叫做反对向量。

这就是反对向量机。

二、从代码中映射实践

2.1 导入数据集

增加援用:

import numpy as np
import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt

导入数据集(大家不必在意这个域名):

df = pd.read_csv('https://blog.caiyongji.com/assets/mouse_viral_study.csv')
df.head()
Med_1_mL Med_2_mL Virus Present
0 6.50823 8.58253 0
1 4.12612 3.07346 1
2 6.42787 6.36976 0
3 3.67295 4.90522 1
4 1.58032 2.44056 1

该数据集模仿了一项医学钻研,对感化病毒的小白鼠应用不同剂量的两种药物,察看两周后小白鼠是否感化病毒。

  • 特色:1. 药物 Med_1_mL 药物 Med_2_mL
  • 标签:是否感化病毒(1 感化 / 0 不感化)

2.2 察看数据

sns.scatterplot(x='Med_1_mL',y='Med_2_mL',hue='Virus Present',data=df)

咱们用 seaborn 绘制两种药物在不同剂量特色对应感化后果的散点图。

sns.pairplot(df,hue='Virus Present')

咱们通过 pairplot 办法绘制特色两两之间的对应关系。

咱们能够做出大略的判断,当加大药物剂量可使小白鼠防止被感化。

2.3 应用 SVM 训练数据集

#SVC: Supprt Vector Classifier 反对向量分类器
from sklearn.svm import SVC

#筹备数据
y = df['Virus Present']
X = df.drop('Virus Present',axis=1) 

#定义模型
model = SVC(kernel='linear', C=1000)

#训练模型
model.fit(X, y)

# 绘制图像
# 定义绘制 SVM 边界办法
def plot_svm_boundary(model,X,y):
    
    X = X.values
    y = y.values
    
    # Scatter Plot
    plt.scatter(X[:, 0], X[:, 1], c=y, s=30,cmap='coolwarm')

    
    # plot the decision function
    ax = plt.gca()
    xlim = ax.get_xlim()
    ylim = ax.get_ylim()

    # create grid to evaluate model
    xx = np.linspace(xlim[0], xlim[1], 30)
    yy = np.linspace(ylim[0], ylim[1], 30)
    YY, XX = np.meshgrid(yy, xx)
    xy = np.vstack([XX.ravel(), YY.ravel()]).T
    Z = model.decision_function(xy).reshape(XX.shape)

    # plot decision boundary and margins
    ax.contour(XX, YY, Z, colors='k', levels=[-1, 0, 1], alpha=0.5,
               linestyles=['--', '-', '--'])
    # plot support vectors
    ax.scatter(model.support_vectors_[:, 0], model.support_vectors_[:, 1], s=100,
               linewidth=1, facecolors='none', edgecolors='k')
    plt.show()
plot_svm_boundary(model,X,y)

咱们导入 sklearn 下的 SVC(Supprt Vector Classifier) 分类器,它是 SVM 的一种实现。

2.4 SVC 参数 C

SVC 办法参数 C 代表 L2 正则化参数,正则化的强度与 C 的值城 正比,即 C 值越大正则化强度越弱,其必须严格为正。

model = SVC(kernel='linear', C=0.05)
model.fit(X, y)
plot_svm_boundary(model,X,y)

咱们缩小 C 的值,能够看到模型拟合数据的水平削弱。

2.5 核技巧

SVC 办法的 kernel 参数可取值 {'linear', 'poly', 'rbf', 'sigmoid', 'precomputed'}。像前文中所应用的那样,咱们能够使kernel='linear' 进行线性分类。那么如果咱们像进行非线性分类呢?

2.5.1 多项式内核

多项式内核 kernel='poly' 的原理简略来说就是,用繁多特色生成多特色来拟合曲线。比方咱们拓展 X 到 y 的对应关系如下:

X X^2 X^3 y
0 6.50823 6.50823**2 6.50823**3 0
1 4.12612 4.12612**2 4.12612**3 1
2 6.42787 6.42787**2 6.42787**3 0
3 3.67295 3.67295**2 3.67295**3 1
4 1.58032 1.58032**2 1.58032**3 1

这样咱们就能够用曲线来拟合数据集。

model = SVC(kernel='poly', C=0.05,degree=5)
model.fit(X, y)
plot_svm_boundary(model,X,y)

咱们应用多项式内核,并通过 degree=5 设置多项式的 最高次数 为 5。咱们能够看出宰割呈现了肯定的弧度。

2.5.2 高斯 RBF 内核

SVC 办法默认内核为高斯 RBF,即 Radial Basis Function(径向基函数)。这时咱们须要引入gamma 参数来管制钟形函数的形态。减少 gamma 值会使钟形曲线变得更窄,因而每个实例影响的范畴变小,决策边界更不规则。减小 gamma 值会使钟形曲线变得更宽,因而每个实例的影响范畴变大,决策边界更平坦。

model = SVC(kernel='rbf', C=1,gamma=0.01)
model.fit(X, y)
plot_svm_boundary(model,X,y)

2.6 调参技巧:网格搜寻

from sklearn.model_selection import GridSearchCV
svm = SVC()
param_grid = {'C':[0.01,0.1,1],'kernel':['rbf','poly','linear','sigmoid'],'gamma':[0.01,0.1,1]}
grid = GridSearchCV(svm,param_grid)
grid.fit(X,y)
print("grid.best_params_ =",grid.best_params_,", grid.best_score_ =" ,grid.best_score_)

咱们能够通过 GridSearchCV 办法来遍历超参数的各种可能性来寻求最优超参数。这是通过算力碾压的形式暴力调参的伎俩。当然,在剖析问题阶段,咱们必须限定了各参数的可选范畴能力利用此办法。

因为数据集太简略,咱们在遍历第一种可能性时就曾经失去 100% 的准确率了,输入如下:

grid.best_params_ =  {'C': 0.01, 'gamma': 0.01, 'kernel': 'rbf'} , grid.best_score_ = 1.0

总结

当咱们解决线性可分的数据集时,能够应用 SVC(kernel='linear') 办法来训练数据,当然咱们也能够应用更快的办法 LinearSVC 来训练数据,特地是当训练集特地大或特色十分多的时候。
当咱们解决非线性 SVM 分类时,能够应用高斯 RBF 内核, 多项式内核,sigmoid 内核来进行非线性模型的的拟合。当然咱们也能够通过 GridSearchCV 寻找最优参数。

往期文章:

  • 机器学习(三):了解逻辑回归及二分类、多分类代码实际
  • 机器学习(二):了解线性回归与梯度降落并做简略预测
  • 机器学习(一):5 分钟了解机器学习并上手实际
  • 前置机器学习(五):30 分钟把握罕用 Matplotlib 用法
  • 前置机器学习(四):一文把握 Pandas 用法
  • 前置机器学习(三):30 分钟把握罕用 NumPy 用法
  • 前置机器学习(二):30 分钟把握罕用 Jupyter Notebook 用法
  • 前置机器学习(一):数学符号及希腊字母
退出移动版