机器学习“傻瓜式”理解(14)SVM(1)

SVM(Support Vector Machine):支撑向量机(重点)

基本介绍
在我们进行机器学习的过程中,会不可避免的出现“不适定问题”,所谓的不适定问题便是值得我们在进行决策的时候,决策边界不唯一,可能会偏向某一样本类型,模型的泛化能力差,其原因可能是模型由训练数据集所得,训练数据集中没有包含所有类型的所有样本,训练数据集中的样本的分布,可能并不能准确的反应不同样本之间的分布规律,并且通过训练数据集所得到的决策边界也不是真正的决策边界,例如,逻辑回归中,
决策边界可能会呈现下面的这种状态:
在这里插入图片描述
针对上面提到的问题,SVM应运而生,SVM的目的便是找到一个最优的决策边界,不仅可以正确的划分数据集而且还具有很好的模型泛化能力。
在这里插入图片描述
其实现的主要的方法是找到一条决策边界使得其距离两部分的数据尽可能的远。
值得注意的是,SVM在考虑模型的泛化能力的时候并不是寄希望在数据的预处理上,而是通过对算法内部进行相应的改造。

实现的具体方法
根据SVM的中文名字,我们可以知道,SVM是由支撑向量和margin组成的。
在这里插入图片描述

SVM的目标便是最大化的margin。
另外不论是逻辑回归还是SVM讨论的前提都是样本线性可分。
Hard Margin SVM解决的是两部分数据线性可分,而Soft Margin SVM解决的是线性不可分(实际中这种情况十分多)。
Soft Margin SVM 算法是从 Hard Margin SVM 的基础上改进的。
目标函数推导
在这里插入图片描述
重要思想:所谓的正则化,是一个概念,但是并不是对所有模型添加同样的L1正则或者L2正则,有时候我们需要进行灵活的调整,但是其最终的目的是相同的,都是为了提高模型的泛化能力。

使用SVM

'''
    注意:我们在进行试验的过程中,不论数据是线性可分还是不可分的,我们都需要进行数据的标准化处理,因为如果数据的
    量纲差距过大,会导致决策边界是一条直线的现象。
'''
import numpy as np
import matplotlib.pyplot as plt
from sklearn import datasets
from sklearn.preprocessing import StandardScaler

from sklearn.svm import LinearSVC
from myML.metrics import plot_decision_boundary

'''模拟数据集'''
iris = datasets.load_iris()
X = iris.data
y = iris.target


X = X[y<2,:2]
y = y[y<2]


'''使用SVM算法进行试验'''
standardScaler = StandardScaler()
standardScaler.fit(X)
X_std = standardScaler.transform(X)

svc = LinearSVC(C=10**9)
svc.fit(X_std,y)

# hard margin
'''查看决策边界'''
plot_decision_boundary(svc,axis=[-3,3,-3,3])
'''散点图分布'''
plt.scatter(X_std[y==0,0],X_std[y==0,1],color='red')
plt.scatter(X_std[y==1,0],X_std[y==1,1],color='blue')
plt.show()


#soft margin
svc2 = LinearSVC(C = 0.01)
'''查看决策边界'''
plot_decision_boundary(svc,axis=[-3,3,-3,3])
'''散点图分布'''
plt.scatter(X_std[y==0,0],X_std[y==0,1],color='red')
plt.scatter(X_std[y==1,0],X_std[y==1,1],color='blue')
plt.show()


'''绘制支撑向量所在直线'''


def plot_svc_decision_boundary(model, axis):
    x0, x1 = np.meshgrid(
        np.linspace(axis[0], axis[1], int((axis[1] - axis[0]) * 100)).reshape(-1, 1),
        np.linspace(axis[2], axis[3], int((axis[3] - axis[2]) * 100)).reshape(-1, 1)
    )
    X_new = np.c_[x0.ravel(), x1.ravel()]

    y_predict = model.predict(X_new)
    zz = y_predict.reshape(x0.shape)

    from matplotlib.colors import ListedColormap
    custom_cmap = ListedColormap(['#EF9A9A', '#FFF59D', '#90CAF9'])

    plt.contourf(x0, x1, zz, linewidth=5, cmap=custom_cmap)

    w = model.coef_[0]
    b = model.intercept_[0]

    plot_x = np.linspace(axis[0], axis[1], 200)
    up_y = -w[0] / w[1] * plot_x - b / w[1] + 1 / w[1]
    down_y = -w[0] / w[1] * plot_x - b / w[1] - 1 / w[1]

    up_index = (up_y >= axis[2]) & (up_y <= axis[3])
    down_index = (down_y >= axis[2]) & (down_y <= axis[3])
    plt.plot(plot_x[up_index], up_y[up_index], color='black')
    plt.plot(plot_x[down_index], down_y[down_index], color='black')


# hard margin
'''查看决策边界'''
plot_svc_decision_boundary(svc,axis=[-3,3,-3,3])
'''散点图分布'''
plt.scatter(X_std[y==0,0],X_std[y==0,1],color='red')
plt.scatter(X_std[y==1,0],X_std[y==1,1],color='blue')
plt.show()


#soft margin
svc2 = LinearSVC(C = 0.01)
'''查看决策边界'''
plot_svc_decision_boundary(svc,axis=[-3,3,-3,3])
'''散点图分布'''
plt.scatter(X_std[y==0,0],X_std[y==0,1],color='red')
plt.scatter(X_std[y==1,0],X_std[y==1,1],color='blue')
plt.show()

四张图形依次的运行结果为:
在这里插入图片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章