Scikit Learn 简明教程
Scikit Learn - Support Vector Machines
本章讨论了一种称为支持向量机 (SVM) 的机器学习方法。
Introduction
支持向量机 (SVM) 是强大而灵活的监督式机器学习方法,用于分类、回归和异常值检测。SVM 在高维空间中非常高效,通常用于分类问题。SVM 很流行且内存高效,因为它们在决策函数中使用训练点子集。
SVM 的主要目标是将数据集划分为多个类别,以便找到 maximum marginal hyperplane (MMH) ,这可以通过以下两步完成 −
-
支持向量机会首先迭代生成超平面,以最佳方式分隔类别。
-
之后,它将选择正确隔离类别的超平面。
SVM 中的一些重要概念如下 −
-
Support Vectors − 它们可以定义为最接近超平面的数据点。支持向量有助于决定分隔线。
-
Hyperplane − 分隔具有不同类别的对象的集合的决策平面或空间。
-
Margin − 不同类别最接近数据点上的两条线之间的间隔称为间隔。
以下图表将让您深入了解这些 SVM 概念−
Scikit-learn 中的 SVM 同时支持稀疏和密集样本向量作为输入。
SVC
C 支持向量分类,其实现基于 libsvm 。scikit-learn 使用的模块是 sklearn.svm.SVC 。此类根据一对一方案处理多类支持。
Parameters
下表包含 sklearn.svm.SVC 类使用的参数:
Sr.No |
Parameter & Description |
1 |
C - float,可选,默认 = 1.0 它是误差项的惩罚参数。 |
2 |
kernel - 字符串,可选,默认 = “rbf” 此参数指定算法中要使用的核类型。我们可以在以下任意一种中进行选择: ‘linear’, ‘poly’, ‘rbf’, ‘sigmoid’, ‘precomputed’ 。核心的默认值是 ‘rbf’ 。 |
3 |
degree - int,可选,默认 = 3 它表示“poly”核函数的次数,并且所有其他核将忽略它。 |
4 |
gamma - {“scale”、“auto”} 或 float,它是内核“rbf”、“poly”和“sigmoid”的内核系数。 |
5 |
optinal default - =“scale” 如果你选择默认值,即 gamma = “scale”,则 SVC 要使用的 gamma 值为 1/(𝑛𝑓𝑒𝑎𝑡𝑢𝑟𝑒𝑠∗𝑋.𝑣𝑎𝑟())。另一方面,如果 gamma = ‘auto’,则使用 1/𝑛𝑓𝑒𝑎𝑡𝑢𝑟𝑒𝑠。 |
6 |
coef0 - float,可选,默认 = 0.0 核函数中的独立项,仅在“poly”和“sigmoid”中显着。 |
7 |
tol - float,可选,默认 = 1.e-3 此参数表示迭代的停止准则。 |
8 |
shrinking - 布尔值,可选,默认 = True 此参数表示我们是否要使用启发式收缩。其默认值为 false。 |
9 |
verbose - 布尔值,默认:false 它启用或禁用详细输出。其默认值是 false。 |
10 |
probability - 布尔值,可选,默认 = true 此参数启用或禁用概率估计。默认值是 false,但必须在调用拟合之前启用它。 |
11 |
max_iter - int,可选,默认 = -1 如名称所示,它表示求解器中迭代的最大次数。值 -1 意味着对迭代次数没有限制。 |
12 |
cache_size - float,可选 此参数将指定内核高速缓存的大小。值将以 MB(兆字节)表示。 |
13 |
random_state − 整数,RandomState 实例或 None,可选,默认值为 none,此参数表示伪随机数生成的种子,该种子在洗牌数据时使用。以下是选项− int − 在这种情况下,random_state 是随机数生成器使用的种子。 RandomState instance − 在这种情况下,random_state 是随机数生成器。 None − 在这种情况下,随机数生成器是 np.random 使用的 RandomState 实例。 |
14 |
class_weight - {dict,'balanced'},可选 此参数将针对 SVC 将类 j 的参数 C 设置为 𝑐𝑙𝑎𝑠𝑠_𝑤𝑒𝑖𝑔ℎ𝑡[𝑗]∗𝐶。如果我们使用默认选项,则意味着所有类都被认为具有权重一。另一方面,如果你选择 class_weight:balanced ,则它将使用 y 的值来自动调整权重。 |
15 |
decision_function_shape - ovo','ovr',默认 = 'ovr' 此参数将决定算法是否将返回 ‘ovr’ (一对多)与其他所有分类器形状相同的判决函数或 libsvm 的原始 ovo (一对一)判决函数。 |
16 |
break_ties - 布尔值,可选,默认 = false True - 预测将根据决策函数的置信度值打破平局 False - 预测将在绑定的类中返回第一个类。 |
Attributes
下表包含 sklearn.svm.SVC 类使用的属性:
Sr.No |
Attributes & Description |
1 |
support_ - 类数组,形状 = [n_SV] 它返回支持向量的索引。 |
2 |
support_vectors_ - 与数组类似,形状 = [n_SV, n_features],返回支持向量。 |
3 |
n_support_ - 与数组类似,dtype=int32,形状 = [n_class],表示每个类的支持向量数量。 |
4 |
dual_coef_ - 数组,形状 = [n_class-1,n_SV],这是决策函数中支持向量的系数。 |
5 |
coef_ - 数组,形状 = [n_class * (n_class-1)/2, n_features],此属性仅可用于线性内核,提供分配给特征的权重。 |
6 |
intercept_ - 数组,形状 = [n_class * (n_class-1)/2],表示决策函数中的独立项(常数)。 |
7 |
fit_status_ - int,如果正确拟合,输出将为 0。如果拟合不正确,输出将为 1。 |
8 |
classes_ - 形状 = [n_classes] 的数组,给出类的标签。 |
Implementation Example
与其他分类器类似,SVC 还必须使用以下两个数组进行拟合 -
-
数组 X ,保存训练样本。其大小为 [n_samples, n_features]。
-
数组 Y ,保存目标值,即训练样本的类标签。其大小为 [n_samples]。
以下 Python 脚本使用 sklearn.svm.SVC 类 -
import numpy as np
X = np.array([[-1, -1], [-2, -1], [1, 1], [2, 1]])
y = np.array([1, 1, 2, 2])
from sklearn.svm import SVC
SVCClf = SVC(kernel = 'linear',gamma = 'scale', shrinking = False,)
SVCClf.fit(X, y)
Output
SVC(C = 1.0, cache_size = 200, class_weight = None, coef0 = 0.0,
decision_function_shape = 'ovr', degree = 3, gamma = 'scale', kernel = 'linear',
max_iter = -1, probability = False, random_state = None, shrinking = False,
tol = 0.001, verbose = False)
Example
现在,一旦拟合,我们可以借助以下 Python 脚本获取权重向量:
SVCClf.coef_
Output
array([[0.5, 0.5]])
Example
同样,我们可以获得其他属性的值,如下所示 -
SVCClf.predict([[-0.5,-0.8]])
Output
array([1])
Example
SVCClf.n_support_
Output
array([1, 1])
Example
SVCClf.support_vectors_
Output
array(
[
[-1., -1.],
[ 1., 1.]
]
)
Example
SVCClf.support_
Output
array([0, 2])
Example
SVCClf.intercept_
Output
array([-0.])
Example
SVCClf.fit_status_
Output
0
NuSVC
NuSVC 是核支持向量分类。它是 scikit-learn 提供的用于执行多类分类的另一个类。它类似于 SVC,但 NuSVC 接受略有不同的参数集。与 SVC 不同的参数如下 -
-
nu - float,可选,默认值 = 0.5
它表示训练误差的上限和支持向量数量的下限。其值应在 (o,1] 区间内。
其他参数和属性与 SVC 相同。
LinearSVC
它就是线性支持向量分类。它类似于 SVC,其 kernel = ‘linear’。它们之间的区别在于 LinearSVC 根据 liblinear 实现,而 SVC 根据 libsvm 实现。这就是 LinearSVC 在惩罚和损失函数的选择方面具有更大灵活性的原因。它的可扩展性也更高,适用于大量样本。
如果我们讨论其参数和属性,那么它不支持 ‘kernel’ ,因为它假定为线性,并且还缺少 support_, support_vectors_, n_support_, fit_status_ 和 dual_coef_ 等属性。
不过,它支持 penalty 和 loss 参数,如下所示:
-
penalty − string, L1 or L2(default = ‘L2’) 此参数用于指定罚则(正则化)中使用的范数(L1 或 L2)。
-
loss − string, hinge, squared_hinge (default = squared_hinge) 它代表损失函数,其中“铰链”是标准 SVM 损失,“平方铰链”是铰链损失的平方。
Implementation Example
以下 Python 脚本使用 sklearn.svm.LinearSVC 类:
from sklearn.svm import LinearSVC
from sklearn.datasets import make_classification
X, y = make_classification(n_features = 4, random_state = 0)
LSVCClf = LinearSVC(dual = False, random_state = 0, penalty = 'l1',tol = 1e-5)
LSVCClf.fit(X, y)
Regression with SVM
如前所述,SVM 用于分类和回归问题。Scikit-learn 的支持向量分类 (SVC) 方法还可以扩展以解决回归问题。该扩展方法称为支持向量回归 (SVR)。
SVR
它是基于 libsvm 实现的 Epsilon 支持向量回归。与 SVC 相反,该模型中有两个自由参数,即 ‘C’ 和 ‘epsilon’ 。
-
epsilon − float,可选,默认 = 0.1
它表示 epsilon-SVR 模型中的 epsilon,并指定 epsilon 管,在该管中,损失函数中与实际值距离 epsilon 之内的预测点不会产生罚则。
其他参数和属性与我们在 SVC 中使用的类似。
Implementation Example
以下 Python 脚本使用 sklearn.svm.SVR 类:
from sklearn import svm
X = [[1, 1], [2, 2]]
y = [1, 2]
SVRReg = svm.SVR(kernel = ’linear’, gamma = ’auto’)
SVRReg.fit(X, y)
NuSVR
NuSVR 是 Nu 支持向量回归。它类似于 NuSVC,但 NuSVR 使用参数 nu 来控制支持向量的数量。此外,与 NuSVC 不同(其中 nu 替换了 C 参数),这里它替换了 epsilon 。
Implementation Example
以下 Python 脚本使用 sklearn.svm.SVR 类:
from sklearn.svm import NuSVR
import numpy as np
n_samples, n_features = 20, 15
np.random.seed(0)
y = np.random.randn(n_samples)
X = np.random.randn(n_samples, n_features)
NuSVRReg = NuSVR(kernel = 'linear', gamma = 'auto',C = 1.0, nu = 0.1)^M
NuSVRReg.fit(X, y)
LinearSVR
它是线性支持向量回归。它类似于 SVR(kernel =“linear”)。它们之间的区别在于, LinearSVR 是根据 liblinear 实现的,而 SVC 是根据 libsvm 实现的。这就是为什么 LinearSVR 在罚则和损失函数的选择上更灵活的原因。它也能更好地扩展到大量样本。
如果我们讨论其参数和属性,那么它不支持 ‘kernel’ ,因为它假定为线性,并且还缺少 support_, support_vectors_, n_support_, fit_status_ 和 dual_coef_ 等属性。
不过,它支持以下“损失”参数:
-
loss - 字符串,可选,默认 = ‘epsilon_insensitive’
它表示 epsilon_insensitive 损失为 L1 损失且平方 epsilon_insensitive 损失为 L2 损失的损失函数。
Implementation Example
以下 Python 脚本使用 sklearn.svm.LinearSVR 类 -
from sklearn.svm import LinearSVR
from sklearn.datasets import make_regression
X, y = make_regression(n_features = 4, random_state = 0)
LSVRReg = LinearSVR(dual = False, random_state = 0,
loss = 'squared_epsilon_insensitive',tol = 1e-5)
LSVRReg.fit(X, y)