zhuqibs
作者zhuqibs·2020-04-09 23:55
软件开发工程师·Adidas

跟我学机器学习 -- 支持向量机

字数 3275阅读 1207评论 0赞 6

SVM简介

支持向量机(support vector machines, SVM)是一种二分类模型,它的基本模型是定义在特征空间上的间隔最大的线性分类器,间隔最大使它有别于感知机;SVM还包括核技巧,这使它成为实质上的非线性分类器。SVM的的学习策略就是间隔最大化,可形式化为一个求解凸二次规划的问题,也等价于正则化的合页损失函数的最小化问题。SVM的的学习算法就是求解凸二次规划的最优化算法。
在这里插入图片描述
SVM算法原理

SVM学习的基本想法是求解能够正确划分训练数据集并且几何间隔最大的分离超平面。如下图所示, \boldsymbol{w}\cdot x+b=0 即为分离超平面,对于线性可分的数据集来说,这样的超平面有无穷多个(即感知机),但是几何间隔最大的分离超平面却是唯一的。

在推导之前,先给出一些定义。假设给定一个特征空间上的训练数据集

数据集同第五天用的是Social_Network_Ads。

第一步:导入库并加载数据集

数据集如下:

导入库:
import numpy as np
import pandas as pd

import matplotlib.pyplot as plt

加载数据集:
dataset = pd.read_csv('E:/datasets/Social_Network_Ads.cs')
X = dataset.iloc[ : , [2, 3]].values

Y = dataset.iloc[ : , 4].values

打印查看数据集是否加载正确
print(X[0])
print(Y[0])

第二步:划分数据集为测试集和训练集

from sklearn.cross_validation import train_test_split
X_train, X_test, Y_train, Y_test = train_test_split(X, Y, test_size = 0.25, random_state = 0)

Tips:有关train_test_split说明

train_test_split是交叉验证中常用的函数,功能是从样本中随机的按比例选取train data和testdata
train_test_split在17之前是cross_validation.train_test_split用法
在之后都是model_selection.train_test_split用法
具体变化看详细文档,下面简单介绍几个重要的参数。
参数说明:
*arrays:可以是列表、numpy数组、scipy稀疏矩阵或pandas的数据框(train_features、train_labels)
test_size:可以是浮点、整数或者None
浮点:测试集占总样本的百分
整数:测试集等于样本数
None:默认是0.25
random_state:可以为整数、RandomState实例或None,默认为None
整数:每次生成的数据都是相同的
None:随机生成数据
stratify:可以是类似数组或None
None:划分出来的测试集或训练集中,其类标签的比例也是随机的
不为None:划分的测试集或训练集,其类标签的比例同输入的数组中的类标签比例,可以用于处理不均衡的数据集。

第三步:特征缩放

from sklearn.preprocessing import StandardScaler
sc = StandardScaler() //创建模型
X_train = sc.fit_transform(X_train)
X_test = sc.fit_transform(X_test)

第四步:训练SVM模型

from sklearn.svm import SVC
classifier = SVC(kernel = 'linear', random_state = 0)
classifier.fit(X_train, Y_train)

Tips:SVC主要参数说明

sklearn.svm.SVC(C=1.0, kernel=’rbf’, degree=3, gamma=’auto_deprecated’, coef0=0.0,
shrinking=True, probability=False, tol=0.001, cache_size=200, class_weight=None,

verbose=False, max_iter=-1, decision_function_shape=’ovr’, random_state=None)

每个版本的参数都是不一样的,这是21版本的参数解释。
主要参数说明:
C:惩罚参数,这个就不用多说了,C越大,相当于惩罚松弛变量,希望松弛变量接近0,即对误分类的惩罚增大,
趋向于对训练集全分对的情况,这样对训练集测试时准确率很高,但泛化能力弱。
C值小,对误分类的惩罚减小,允许容错,将他们当成噪声点,泛化能力较强。
kernel:核函数,核函数,默认是rbf,可以是‘linear’, ‘poly’, ‘rbf’, ‘sigmoid’
degree:多项式poly函数的维度,默认是3,选择其他核函数时会被忽略。
gamma:‘rbf’,‘poly’ 和‘sigmoid’的核函数参数。
coef0:核函数的常数项。对于‘poly’和 ‘sigmoid’有用。
tol :停止训练的误差值大小,默认为1e-3
max_iter :最大迭代次数。-1为无限制。

第五步:预测结果并输出混淆矩阵

预测:
Y_pred = classifier.predict(X_test)

from sklearn.metrics import confusion_matrix

cm = confusion_matrix(Y_test, Y_pred)

打印混淆矩阵
print(cm)

第六步:结果的可视化

from matplotlib.colors import ListedColormap
X_set, Y_set = X_train, Y_train
X1, X2 = np.meshgrid(np.arange(start = X_set[:, 0].min() - 1, stop = X_set[:, 0].max() + 1, step = 0.01),
np.arange(start = X_set[:, 1].min() - 1, stop = X_set[:, 1].max() + 1, step = 0.01))
plt.contourf(X1, X2, classifier.predict(np.array([X1.ravel(), X2.ravel()]).T).reshape(X1.shape),
alpha = 0.75, cmap = ListedColormap(('red', 'green')))
plt.xlim(X1.min(), X1.max())
plt.ylim(X2.min(), X2.max())
for i, j in enumerate(np.unique(Y_set)):
plt.scatter(X_set[Y_set == j, 0], X_set[Y_set == j, 1],
c = ListedColormap(('red', 'green'))(i), label = j)
plt.title('SVM (Training set)')
plt.xlabel('Age')
plt.ylabel('Estimated Salary')
plt.legend()
plt.show()

如果觉得我的文章对您有用,请点赞。您的支持将鼓励我继续创作!

6

添加新评论0 条评论

Ctrl+Enter 发表

作者其他文章

相关文章

相关问题

相关资料

X社区推广