机器学习手册学习笔记--支持向量机

205 阅读3分钟

仅供自己复习回顾使用,若有侵权可删除

一个超平面就是 n 维空间中的 n - 1维空间

支持向量机通过寻找一个能最大化训练集数据中分类间距的超平面来给数据分类

image.png

训练一个线性分类器

from sklearn.svm import LinearSVC
from sklearn import datasets
from sklearn.preprocessing import StandardScaler
import numpy as np
iris = datasets.load_iris()
features = iris.data[:100,:2]
target = iris.target[:100]

# 标准化特征
scaler = StandardScaler()
features_standardized = scaler.fit_transform(features)
# 创建支持向量分类器
svc = LinearSVC(C=1.0)
# 训练模型
model = svc.fit(features_standardized, target)
# 创建一个新的样本点
new_observation = [[ -2, 3]]
svc.predict(new_observation)

常见的情况是,我们并不能完美地将数据分类。在这些情况下,需要在 SVC 最大化超平面两侧的间距和最小化分类错误之间取得平衡。在 SVC 中,后者是通过一个超参数 C(分类错误时所需要接受的惩罚)来控制的。

C 是 SVC 学习器的一个参数,也是学习器将一个样本点分类错误时被施加的罚项。当 C 很小时, SVC 可以容忍更多的样本点被错误分类(偏差大,方差小)。当 C 很大时, SVC 会因为对数据的错误分类而被重罚,因此通过反向传播来避免对样本点的错误分类(偏差小、方差大)

使用核函数处理线性不可分的数据

线性核函数

image.png

多项式核函数

image.png

径向基核函数

image.png

多项式核函数中的 d(通过 degree 参数来设置)

径向基核函数中的 γ(通过 gamma 参数来设置,大于0)

我们还需要设置惩罚参数 C。

# 加载库
from sklearn.svm import SVC
from sklearn import datasets
from sklearn.preprocessing import StandardScaler
import numpy as np
# 设置随机种子
np.random.seed(0)
# 生成两个特征
features = np.random.randn(200, 2)
# 使用异或门(你不需要知道原因)创建线性不可分的数据
target_xor = np.logical_xor(features[:, 0] > 0, features[:, 1] > 0)
target = np.where(target_xor, 0, 1)
# 创建一个有径向基核函数的支持向量机
svc = SVC(kernel="rbf", random_state=0, gamma=1, C=1)
# 训练分类器
model = svc.fit(features, target)

计算预测分类的概率

'''

SVC 算法使用一个超平面来创建决策区间,这种做法并不会直接计算出观察值属于某个分类的概率。但是,我们可以输出校准过的分类概率,并给出几点说明。在有两个分类的 SVC 中可以使用 Platt 缩放(Platt scaling),它首先训练这个 SVC,然后训练一个独立的交叉验证逻辑回归模型将 SVC 的输出转换为概率 。

image.png

计算预测分类的概率有两个主要的问题 :第一,因为我们还训练了一个带交叉验证的模型,所以生成预测分类概率的过程会显著增加模型训练的时间 ;第二,因为预测的概率是通过交叉验证计算出来的,所以它们可能不会总是与预测的分类匹配。也就是说,一个观察值可能被预测为属于分类 1,但是它被预测为属于分类 1 的概率却小于 0.5。

from sklearn.svm import SVC
from sklearn import datasets
from sklearn.preprocessing import StandardScaler
import numpy as np
iris = datasets.load_iris()
features = iris.data
target = iris.target

# 标准化特征
scaler = StandardScaler()
features_standardized = scaler.fit_transform(features)
# 创建 SVC 对象
svc = SVC(kernel="linear", probability=True, random_state=0)
# 训练分类器
model = svc.fit(features_standardized, target)
# 创建一个新的观察值
new_observation = [[.4, .4, .4, .4]]
# 查看观察值被预测为不同分类的概率
model.predict_proba(new_observation)

识别支持向量

超平面是由相对而言的一小部分观察值(被称为支持向量)所决定的,支持向量机这个名字由此得来。直观地说,你可以把超平面想象成是被这些支持向量“举起来”的。因此,这些支持向量对于模型来说非常重要。

from sklearn.svm import SVC
from sklearn import datasets
from sklearn.preprocessing import StandardScaler
import numpy as np
iris = datasets.load_iris()
features = iris.data[:100,:]
target = iris.target[:100]

# 标准化特征
scaler = StandardScaler()
features_standardized = scaler.fit_transform(features)
# 创建 SVC 对象
svc = SVC(kernel="linear", random_state=0)
# 训练分类器
model = svc.fit(features_standardized, target)
# 查看支持向量
model.support_vectors_
#查看支持向量在观察值中的索引
model.support_
#每个分类有几个支持向量
model.n_support_

处理不均衡的分类

svc = SVC(kernel="linear", class_weight="balanced", C=1.0, random_state=0)