目录 |
---|
面板 | ||||
---|---|---|---|---|
| ||||
原文链接 : http://scikit-learn.org/stable/modules/svm.html 译文链接 : http://www.apache.wiki/pages/viewpage.action?pageId=10031359 |
支持向量机(SVM)是一组用于分类, 回归和异常值检测的监督学习方法。
支持向量机的优点是:
- 在高维空间有效。
- 在维度数量大于样本数量的情况下仍然有效。
- 在决策功能(称为支持向量)中使用训练点的子集,因此它也是内存有效的。
- 多功能:可以为决策功能指定不同的内核函数。提供通用内核,但也可以指定自定义内核。
支持向量机的缺点包括:
- 如果特征数量远远大于样本数量,则该方法可能会导致较差的性能。
- 支持向量机不直接提供概率估计,这些是使用昂贵的五重交叉验证计算的(参见下面的支持向量机不直接提供概率估计,这些是使用昂贵的五-折交叉验证计算的(参见下面的分数和概率)。
scikit学习中的支持向量机支持密集(numpy.ndarray
可转换为numpy.asarray
)和稀疏(任意scipy.sparse
)样本向量作为输入。然而,为了使用SVM对稀疏数据进行预测,它必须符合这些数据。为了获得最佳性能,请使用C-ordered numpy.ndarray
(密集)或 scipy.sparse.csr_matrix
(稀疏)dtype=float64
。
分类
SVC
,NuSVC
并且LinearSVC
是能够对数据集执行多类分类的类。
SVC
并且NuSVC
是类似的方法,但是接受稍微不同的参数集合并具有不同的数学公式(参见数学公式)。另一方面,LinearSVC
对于线性内核的情况,是支持向量分类的另一个实现。请注意, LinearSVC
不接受关键字kernel
,因为这被假定为线性的。它还缺少一些成员 SVC
和NuSVC
一样support_
。
作为其它分类器,SVC
,NuSVC
和 LinearSVC
作为输入的两个阵列:大小的数组X 保持训练样本,类别标签(字符串或整数),大小的量阵列y :[n_samples, n_features]
[n_samples]
代码块 | ||
---|---|---|
| ||
>>> from sklearn import svm >>> X = [[0, 0], [1, 1]] >>> y = [0, 1] >>> clf = svm.SVC() >>> clf.fit(X, y) SVC(C=1.0, cache_size=200, class_weight=None, coef0=0.0, decision_function_shape=None, degree=3, gamma='auto', kernel='rbf', max_iter=-1, probability=False, random_state=None, shrinking=True, tol=0.001, verbose=False) |
装配后,可以使用该模型来预测新值:
代码块 | ||
---|---|---|
| ||
>>> clf.predict([[2., 2.]]) array([1]) |
支持向量机的决策功能取决于训练数据的一些子集,称为支持向量。这些支持向量的一些属性可以在成员support_vectors_
中找到,support_
并且 n_support
:
代码块 | ||
---|---|---|
| ||
>>> # 获取支持向量 >>> clf.support_vectors_ array([[ 0., 0.], [ 1., 1.]]) >>> # 获取支持向量的索引 >>> clf.support_ array([0, 1]...) >>> # 得到支持向量的每个分类的number >>> clf.n_support_ array([1, 1]...) |
多类分类
SVC
并NuSVC
实施“一对一”的方法(Knerr等,1990)进行多类分类。如果n_class是类的数量,那么构造 n_class * (n_class - 1) / 2 【补充说明:两两组合,可以百度查询:组合数公式】 个分类器,并且从两个类中构建每个训练数据。 为了提供与其他分类器的一致的界面,decision_function_shape选项允许将“一对一”分类器的结果聚合到shape (n_samples, n_classes) 的决策函数:
代码块 | ||
---|---|---|
| ||
>>> X = [[0], [1], [2], [3]] >>> Y = [0, 1, 2, 3] >>> clf = svm.SVC(decision_function_shape='ovo') >>> clf.fit(X, Y) SVC(C=1.0, cache_size=200, class_weight=None, coef0=0.0, decision_function_shape='ovo', degree=3, gamma='auto', kernel='rbf', max_iter=-1, probability=False, random_state=None, shrinking=True, tol=0.001, verbose=False) >>> dec = clf.decision_function([[1]]) >>> dec.shape[1] # 4 classes: 4*3/2 = 6 6 >>> clf.decision_function_shape = "ovr" >>> dec = clf.decision_function([[1]]) >>> dec.shape[1] # 4 classes 4 |
另一方面,LinearSVC
实施“一对一”的多类策略,从而训练n_class模型。如果只有2类,只有一个模型被训练:
代码块 | ||
---|---|---|
| ||
>>> lin_clf = svm.LinearSVC() >>> lin_clf.fit(X, Y) LinearSVC(C=1.0, class_weight=None, dual=True, fit_intercept=True, intercept_scaling=1, loss='squared_hinge', max_iter=1000, multi_class='ovr', penalty='l2', random_state=None, tol=0.0001, verbose=0) >>> dec = lin_clf.decision_function([[1]]) >>> dec.shape[1] 4 |
有关决策函数的完整描述,请参阅数学公式。
请注意,LinearSVC
它还实现了一个替代的多类策略,即由Crammer和Singer制定的所谓的多类SVM,通过使用该选项multi_class='crammer_singer'
。这种方法是一致的,这对于一对其余分类是不正确的。在实践中,一对其余分类通常是首选的,因为结果大部分是相似的,但运行时间明显较少。
对于“一对其余” LinearSVC
,属性coef_和intercept_分别具有形状[n_class,n_features]和[n_class]。 系数的每一行对应于n_class中的一个,许多“一对其余”分类器,并且类似于截距,按照“一”类的顺序。
在“一对一”SVC
的情况下,属性的布局有一点更多的参与。 在具有线性内核的情况下,coef_和intercept_的布局类似于上述描述的LinearSVC
,除了coef_的形状是[n_class * (n_class - 1) / 2, n_features],对应于 许多二进制分类器。0到n级的顺序为“0 vs 1”,“0 vs 2”,...“0 vs n”,“1 vs 2”,“1 vs 3”,“1 vs n” 。。“n-1 vs n”。
double_coef_的形状是[n_class-1,n_SV],有点难以把握布局。 列对应于任何 n_class * (n_class - 1) / 2 “一对一”分类器中涉及的支持向量。 每个支持向量在n_class - 1分类器中使用。 每行中的n_class - 1个条目对应于这些分类器的双重系数。
这可以通过一个例子更清楚:
考虑一个三级问题与具有0级三个支撑矢量 dual_coef_
看起来像这样:
0级SV的系数 | ||
1类SV的系数 | ||
2类SV的系数 | ||
分数和概率
该SVC
方法decision_function
为每个样本提供每个类别的分数(或二进制数据中每个样本的单个分数)。当构造函数选项probability
设置为True
,启用类成员概率估计(来自方法predict_proba
和predict_log_proba
)。在二进制的情况下,使用Platt比例来校正概率:对SVM分数进行逻辑回归,通过对训练数据的附加交叉验证进行拟合。在多类案例中,根据Wu et al。(2004年)。
不用说,Platt扩展涉及的交叉验证是大型数据集的昂贵操作。此外,概率估计可能与分数不一致,在分数的“argmax”可能不是概率的argmax的意义上。(例如,在二进制分类中,样本可以被标记predict
为属于具有根据的概率<1/2的类predict_proba
。)Platt的方法也被称为具有理论问题。如果需要信心分数,但这些不一定是概率,那么建议设置probability=False
和使用decision_function
而不是predict_proba
。
提示 |
---|
参考文献:
|
不平衡问题
在需要更加重视某些类别或某些个人样本关键字class_weight
并 sample_weight
可以使用的问题中。
SVC
(但不是NuSVC
)class_weight
在fit
方法中实现一个关键字 。它的形式的字典 ,其中值是浮点数> 0,则设置参数类的到。{class_label : value}
C
class_label
C * value
SVC
,NuSVC
,SVR
,NuSVR
和 OneClassSVM
也实施在方法个体样本的权重 fit
,通过关键字sample_weight
。类似于class_weight
这些,将C
第i个示例的参数设置为。C * sample_weight[i]
回归
支持向量分类的方法可以扩展到解决回归问题。这种方法称为支持向量回归。
由支持向量分类产生的模型(如上所述)仅取决于训练数据的一部分,因为用于构建模型的成本函数不在于超出边际的训练点。类似地,由支持向量回归产生的模型仅取决于训练数据的子集,因为构建模型的成本函数忽略了接近模型预测的任何训练数据。
有支持向量回归的三种不同的实现方式: SVR
,NuSVR
和LinearSVR
。LinearSVR
提供比SVR
更快的实现,但只考虑线性内核,而NuSVR
实现与SVR
和LinearSVR
略有不同的方式。有关详细信息,请参阅 实施细节。
与分类类一样,拟合方法将作为参数向量X,y,只有在这种情况下,y预期具有浮点值而不是整数值:
代码块 | ||
---|---|---|
| ||
>>> from sklearn import svm >>> X = [[0, 0], [2, 2]] >>> y = [0.5, 2.5] >>> clf = svm.SVR() >>> clf.fit(X, y) SVR(C=1.0, cache_size=200, coef0=0.0, degree=3, epsilon=0.1, gamma='auto', kernel='rbf', max_iter=-1, shrinking=True, tol=0.001, verbose=False) >>> clf.predict([[1, 1]]) array([ 1.5]) |
例子:
密度估计,新奇检测
一类SVM用于新颖性检测,即给定一组样本,它将检测该集合的软边界,以便将新点归类为属于该集合。调用实现这个的类OneClassSVM
。
在这种情况下,由于它是一种无监督的学习方法,拟合方法将仅作为输入数组X,因为没有类标签。
有关此用法的更多详细信息,请参阅新颖性和异常值检测。
例子:
实用窍门
避免数据复制:对
SVC
,SVR
,NuSVC
和NuSVR
,如果通过一定的方法将数据不是C有序连续的,而双精度,它会调用底层的C实现之前复制。您可以通过检查其flags
属性来检查给定的numpy数组是否为C 连续的。对于
LinearSVC
(和LogisticRegression
)作为numpy数组传递的任何输入将被复制并转换为liblinear内部稀疏数据表示(非零组件的双精度浮点数和int32索引)。如果你想要适合一个大规模的线性分类器,而不需要复制一个密集的数字C连续的双精度数组作为输入,我们建议使用SGDClassifier
该类。目标函数可以配置为与LinearSVC
模型几乎相同。内核缓存大小:对
SVC
,SVR
,nuSVC
和NuSVR
,内核缓存的大小有较大的问题,在运行时间有很大的影响。如果您有足够的RAM可用,建议设置cache_size
为比默认值200(MB)更高的值,例如500(MB)或1000(MB)。设置为C:
C
是1
在默认情况下,这是一个合理的默认选择。如果你有很多嘈杂的观察结果,你应该减少它。它对应于更多的估计。支持向量机算法不是尺度不变量,因此强烈建议您扩展数据。例如,将输入向量X上的每个属性缩放到[0,1]或[-1,+ 1],或将其标准化为平均值0和方差1.注意,必须将相同的缩放应用于测试向量获得有意义的结果。有关缩放和归一化的更多详细信息,请参见 预处理数据。
参数
nu
在NuSVC
/OneClassSVM
/NuSVR
近似训练误差和支持向量的分数。在
SVC
,如果用于分类的数据不平衡(例如,许多正数和少量负数),请设置class_weight='balanced'
和/或尝试不同的惩罚参数C
。底层
LinearSVC
实现使用随机数生成器来在拟合模型时选择特征。因此,相同输入数据的结果略有不同,因此并不罕见。如果发生这种情况,请尝试使用较小的tol参数。使用提供的L1惩罚产生稀疏解,即只有特征权重的子集不同于零,并有助于决策函数。增加产量是一个更复杂的模型(选择更多的特征)。可以使用产生“零”模型(所有权重等于零)的值。
LinearSVC(loss='l2', penalty='l1', dual=False)
C
C
l1_min_c
内核函数
该内核函数可以是任何如下:
- 线性: 。
- 多项式:
degree
, by 指定coef0
。 。 由关键字 - RBF:
gamma
,必须大于0。 。 由关键字指定 - sigmoid(
coef0
。 ),其中 指定
初始化时,关键字内核指定不同的内核:
代码块 | ||
---|---|---|
| ||
>>> linear_svc = svm.SVC(kernel='linear') >>> linear_svc.kernel 'linear' >>> rbf_svc = svm.SVC(kernel='rbf') >>> rbf_svc.kernel 'rbf' |
自定义内核
您可以通过将内核作为python函数或通过预计算Gram矩阵来定义自己的内核。
具有自定义内核的分类器的行为方式与其他任何分类器相同,不同之处在于:
- 字段
support_vectors_
现在是空的,只有支持向量的索引被存储support_
fit()
存储方法中第一个参数的引用(而不是副本)以供将来参考。如果该数组在使用之间发生变化fit()
,predict()
您将会有意想不到的结果。
使用Python函数作为内核
您还可以通过将kernel
构造函数中的关键字传递一个函数来使用自己定义的内核。
您的内核必须以两个形状的矩阵作为参数 , 并返回一个形状的内核矩阵。(n_samples_1, n_features)
(n_samples_2, n_features)
(n_samples_1, n_samples_2)
以下代码定义了一个线性内核并创建了将使用该内核的分类器实例:
代码块 | ||
---|---|---|
| ||
>>> import numpy as np >>> from sklearn import svm >>> def my_kernel(X, Y): ... return np.dot(X, Y.T) ... >>> clf = svm.SVC(kernel=my_kernel) |
例子:
使用格拉姆矩阵
kernel='precomputed'
在fit方法中设置并传递Gram矩阵而不是X。此时,必须提供所有训练向量和测试向量之间的内核值。
代码块 | ||
---|---|---|
| ||
>>> import numpy as np >>> from sklearn import svm >>> X = np.array([[0, 0], [1, 1]]) >>> y = [0, 1] >>> clf = svm.SVC(kernel='precomputed') >>> # linear kernel computation >>> gram = np.dot(X, X.T) >>> clf.fit(gram, y) SVC(C=1.0, cache_size=200, class_weight=None, coef0=0.0, decision_function_shape=None, degree=3, gamma='auto', kernel='precomputed', max_iter=-1, probability=False, random_state=None, shrinking=True, tol=0.001, verbose=False) >>> # predict on training examples >>> clf.predict(gram) array([0, 1]) |
RBF内核的参数
当与训练的SVM 径向基函数(RBF)内核,两个参数必须考虑:C
和gamma
。C
所有SVM内核通用的参数都是根据决策表面的简单性,对训练样本进行错误分类。低水平C
使得决策表面平滑,而高度C
旨在正确地分类所有培训示例。 gamma
定义单个训练样本的影响程度。更大的gamma
是,其他更多的例子必须受到影响。
的正确选择C
和gamma
是对SVM的性能至关重要。其中一个建议使用sklearn.model_selection.GridSearchCV
与 C
和gamma
相隔很远成倍选择良好的价值观。
例子:
数学公式
支持向量机在高或无限维空间中构建超平面或一组超平面,可用于分类,回归或其他任务。直观地,通过与任何类别的最接近的训练数据点(所谓的功能余量)具有最大距离的超平面实现良好的分离,因为通常越大的边界越小,分类器的泛化误差越低。
SVC
给定的训练矢量
,I = 1,...,N,在两班,和一个矢量 ,SVC解决了以下主要问题:它的双重是
其中
是所有那些的载体, 是上界, 是一个 由 半正定矩阵, 其中 是内核。这里训练向量通过该函数隐含地映射成更高(可能是无限的)维空间 。决策功能是:
注意 |
---|
注意:虽然源自SVM模型LIBSVM和liblinear使用 |
这个参数可以通过成员访问dual_coef_
保持所述产品 ,support_vectors_
其保持支撑载体和intercept_
保持该独立术语 :
提示 |
---|
参考文献:
|
NuSVC
我们引入一个新的参数
来控制支持向量和训练误差的数量。参数 是训练误差分数和支持向量分数下限的上限。可以显示
-SVC制剂是-SVC的重新 配制,因此在数学上是等效的。SVR
给定训练向量
i = 1,...,n,矢量 -SVR解决了以下原始问题:它的双重是
其中
是所有那些的载体, 是上界, 是一个 由 半正定矩阵, 是内核。这里训练向量通过该函数隐含地映射成更高(可能是无限的)维空间 。决策功能是:
这些参数可以通过成员访问dual_coef_
,其保持的差 ,support_vectors_
其保持支撑载体和intercept_
保持该独立术语
提示 |
---|
参考文献:
|