本文主要是介绍机器学习 sklearn SVM,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
1、简介
SVM:支持向量机(Support Vector Machines),通俗来讲,它是一种二类分类模型,其基本模型定义为特征空间上的间隔最大的线性分类器,其学习策略便是间隔最大化,最终可转化为一个凸二次规划问题的求解。
目的:SVM 是一个面向数据的分类算法,它的目标是为确定一个分类超平面,从而将不同的数据分隔开
大佬简易通俗理解SVM,强烈推荐看
SVM具体实现和推导
SVM基本概要与sklearn.svm.svc 参数说明
2、关键名词
- 函数间隔(Functional margin):实际上是人为定义的一个间隔度量
- 几何间隔(Geometrical margin):是直观上点到平面的距离
- 最大间隔分类器(Maximum Margin Classifier):
- 对于数据点进行分类,当超平面离数据点的“间隔”越大,分类的确信度(confidence)也就越大
- 为了使分类的确信度尽量高,需要让所选择的超平面能够最大化这个“间隔”值
- 函数间隔不适合作用来最大化间隔值,因为在超平面固定以后,可以等比列地缩放w的长度和b的值
- 最大间隔分类超平面的“间隔”指的是几何间隔,因为缩放w和b的时候,它只是随着超平面的变动而变动,函数值是不变的
- 线性可分
- 通过求解对偶问题得到最优解,线性可分条件下支持向量机的对偶算法;
- 采用对偶算法优点:一者对偶问题往往更容易求解;二者可以自然的引入核函数,进而推广到非线性分类问题”
- 线性不可分
- 实际情况中大部分数据都不是线性可分的,这个时候满足最大间隔分类的超平面不存在
- 一则一个核函数(kernel)κ(⋅,⋅),通过将数据映射到高维空间,来解决原始空间中线性不可分的情况
- 具体来说,在线性不可分的情况下,支持向量机首先在低维空间中完成计算,然后通过核函数输入空间映射到高维特征空间,最终在高维特征空间中构造出最优分离超平面,从而把平面上本身不好分的非线性数据分开
- 建立非线性学习器步骤
- 首先使用一个非线性映射将数据变换到一个特征空间F
- 然后在特征空间使用线性学习器分类
- 核函数的本质
- 实际中,我们会经常遇到线性不可分的样例,此时,我们常用做法是把特征映射到高维空间中去
- 但进一步,若果凡是遇到线性不可分的样例,一律映射到高维空间,那么这个维度大小是会高到可怕
- 此时,核函数就隆重登场了,核函数的价值在于它虽然也是将特征进行从低维到高维的转化,但是核函数的绝就绝在它事先在低维进行计算,而将实质上的分类效果表现在了高维上,也就是如上文所说的避免了直接在高维空间中的复杂计算。
- 在SVM用的最普遍的两种把数据投射到高维空间的方法分别是多项式内核(Polynomial kernel)径向基内核(Radial basis function kernel, RBF),其中多项式内核它是通过把原始特征进行乘方投射到高维空间,比如特征1成2次方,特征2乘3次方等;RBF内核也称为高斯内核(Gaussian kernel)
- 优势
- SVM可以说是机器学习领域非常强大的算法了,对各种不同的类型的数据集都有不错的表现。
- 它可以在数据特征很少的情况下生成非常复杂的决定边界,当然特征数据量很多的情况下表现也不错,换句话说,SVM对高维数据集和对低维数据集都还算得心应手,训练的前提条件书数据集的规模不是很大。
- 在图像识别领域,还有样本数和特征数比较接近的时候,SVM都会游刃有余。
- 劣势
- 如果样本集中的数据在1万以内,SVM都能驾驭,但是如果样本数据量超过10万的话,SVM就会非常耗费时间和内存。
- SVM对于数据做预处理和参数调节要求非常高;所以很多场景下大家都会很乐意用随机森林算法或者梯度上升决策树(GBDT)算法,因为它们不需要对数据做预处理,也不用费尽心机去调参;而对于非专业人士来说,随机森林和梯度上升决策树要比SVM更容易理解,毕竟SVM算法的建模过程是比较难以呈现的。
3、实际使用
机器学习数据预处理总结
- SVM分类分析
"""@func: 支持向量机的gamma参数调节,SVC用于分类分析优缺点:gamma的值越小,模型越倾向于欠拟合,而gamma的值越大,则模型越倾向于出现过拟合的问题
"""
import matplotlib.pyplot as plt
from sklearn import svm
from sklearn.datasets import load_wine
import numpy as npdef make_meshgrid(x, y, h=.02):x_min, x_max = x.min() - 1, x.max() + 1y_min, y_max = y.min() - 1, y.max() + 1xx, yy = np.meshgrid(np.arange(x_min, x_max, h), np.arange(y_min, y_max, h))return xx, yydef plot_contours(ax, clf, xx, yy, **params):Z = clf.predict(np.c_[xx.ravel(), yy.ravel()])Z = Z.reshape(xx.shape)out = ax.contourf(xx, yy, Z, **params)return outwine = load_wine()
X = wine.data[:, :2]
y = wine.target
C = 1.0# kernel为选择的核函数,gamma为选择的核函数传递的参数值,C为正则化参数
models = (svm.SVC(kernel='rbf', gamma=0.1, C=C),svm.SVC(kernel='rbf', gamma=1, C=C),svm.SVC(kernel='rbf', gamma=10, C=C))models = (clf.fit(X, y) for clf in models)titles = ('gamms = 0.1','gamma = 1','gamma = 10')fig, sub = plt.subplots(1, 3, figsize=(10, 3))X0, X1 = X[:, 0], X[:, 1]
xx, yy = make_meshgrid(X0, X1)for clf, title, ax in zip(models, titles, sub.flatten()):plot_contours(ax, clf, xx, yy, cmap=plt.cm.plasma, alpha=0.8)ax.scatter(X0, X1, c=y, cmap=plt.cm.plasma, s=20, edgecolors='k')ax.set_xlim(xx.min(), xx.max())ax.set_ylim(yy.min(), yy.max())ax.set_xlabel('Feature 0')ax.set_ylabel('Feature 1')ax.set_xticks(())ax.set_yticks(())ax.set_title(title)plt.show()
结论: 可以看出,图形从左向右gamma值从0.1增加到10,gamma值越小,则RBF的内核的直径越大,这样就会有更多的点被模型圈进决定边界中,所以决定边界也就越平滑,这时的模型也就越简单;而随着参数的增加,模型则更倾向于把每一个点都放到对应的决定边界中,这时模型的复杂度也相应提高了。所以gamma的值越小,模型越倾向于欠拟合,而gamma的值越大,则模型的越倾向于出现过拟合的问题。
- SVM回归分析
"""@func: 实战波士顿放假回归分析,使用SVR"""from sklearn.preprocessing import StandardScaler
from sklearn.datasets import load_boston
from sklearn.model_selection import train_test_split
from sklearn.svm import SVR
import matplotlib.pyplot as pltboston = load_boston()
X, y = boston.data, boston.target
X_train, X_test, y_train, y_test = train_test_split(X, y, random_state=8)# 由于数据中各特征量级差别比较大,所以要先进行对数据预处理
scaler = StandardScaler()
scaler.fit(X_train)
X_train_scaled = scaler.transform(X_train)
X_test_scaled = scaler.transform(X_test)for kernel in ['linear', 'rbf']:svr = SVR(kernel=kernel, C=100, gamma=0.1) # C和gamma参数值对训练模型的影响较大svr.fit(X_train_scaled, y_train)print(kernel, "核函数的模型训练得分:{:.3f}".format(svr.score(X_train_scaled, y_train)))print(kernel, "核函数的模型测试得分:{:.3f}".format(svr.score(X_test_scaled, y_test)))plt.plot(X_train_scaled.min(axis=0), 'v', label='train set min')
plt.plot(X_train_scaled.max(axis=0), '^', label='train set max')
plt.plot(X_test_scaled.min(axis=0), 'v', label='train set min')
plt.plot(X_test_scaled.min(axis=0), '^', label='train set max')
plt.yscale('log')
plt.legend(loc='best')plt.xlabel('scaled features')
plt.ylabel('scaled feature magnitude')plt.show()
保存训练模型,有时训练一个模型十分耗费时间,所以将训练的模型保存起来,再使用的时候加载是十分有用的
from sklearn.externals import joblib
# 保存训练模型
joblib.dump(svr, 'train_model.m')
# 加载训练模型
svr = joblib.load('train_model.m')
这篇关于机器学习 sklearn SVM的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!