线性支持向量机分类器#
- class sklearn.svm.LinearSVC(penalty='l2', loss='squared_hinge', *, dual='auto', tol=0.0001, C=1.0, multi_class='ovr', fit_intercept=True, intercept_scaling=1, class_weight=None, verbose=0, random_state=None, max_iter=1000)[source]#
线性支持向量分类。
类似于参数kernel='linear'的SVC,但它是基于liblinear而不是libsvm实现的,因此在惩罚项和损失函数的选择上具有更大的灵活性,并且应该能够更好地扩展到大样本量。
LinearSVC
和SVC
之间的区别主要在于默认使用的损失函数,以及这两个实现之间对截距正则化的处理方式。此类支持密集和稀疏输入,多类别支持根据一对多方案进行处理。
在 用户指南 中了解更多信息。
- 参数:
- penalty{‘l1’, ‘l2’}, default=’l2’
指定惩罚中使用的范数。'l2'惩罚是SVC中使用的标准惩罚。'l1'会导致
coef_
向量稀疏。- loss{‘hinge’, ‘squared_hinge’}, default=’squared_hinge’
指定损失函数。'hinge'是标准的SVM损失(例如,SVC类使用),而'squared_hinge'是hinge损失的平方。不支持
penalty='l1'
和loss='hinge'
的组合。- dual“auto” 或 bool, default=”auto”
选择算法来求解对偶或原始优化问题。当n_samples > n_features时,优先选择dual=False。
dual="auto"
将根据n_samples
、n_features
、loss
、multi_class
和penalty
的值自动选择参数的值。如果n_samples
<n_features
并且优化器支持所选择的loss
、multi_class
和penalty
,则dual将设置为True,否则将设置为False。1.3版本中的更改: 1.3版本中添加了
"auto"
选项,并在1.5版本中将成为默认选项。- tolfloat, default=1e-4
停止准则的容差。
- Cfloat, default=1.0
正则化参数。正则化的强度与C成反比。必须严格为正。有关缩放正则化参数C的影响的直观可视化,请参阅 缩放SVC的正则化参数。
- multi_class{‘ovr’, ‘crammer_singer’}, default=’ovr’
如果
y
包含两个以上的类别,则确定多类别策略。"ovr"
训练n_classes个一对多分类器,而"crammer_singer"
对所有类别优化联合目标。虽然crammer_singer
从理论角度来看很有趣,因为它是一致的,但在实践中很少使用,因为它很少能带来更好的准确性,而且计算成本更高。如果选择"crammer_singer"
,则将忽略选项loss、penalty和dual。- fit_interceptbool, default=True
是否拟合截距。如果设置为True,则特征向量将扩展为包含一个截距项:
[x_1, ..., x_n, 1]
,其中1对应于截距。如果设置为False,则计算中不使用任何截距(即,预期数据已居中)。- intercept_scalingfloat, default=1.0
当
fit_intercept
为 True 时,实例向量 x 将变为[x_1, ..., x_n, intercept_scaling]
,即一个“合成”特征,其常数值等于intercept_scaling
,会被添加到实例向量中。截距将变为 intercept_scaling * 合成特征权重。请注意,liblinear 在内部对截距进行惩罚,将其视为特征向量中的任何其他项。为了减少正则化对截距的影响,可以将intercept_scaling
参数设置为大于 1 的值;intercept_scaling
的值越高,正则化对其的影响越低。然后,权重将变为[w_x_1, ..., w_x_n, w_intercept*intercept_scaling]
,其中w_x_1, ..., w_x_n
表示特征权重,截距权重按intercept_scaling
进行缩放。这种缩放允许截距项与其他特征相比具有不同的正则化行为。- class_weight字典或 'balanced',默认值=None
对于 SVC,将类 i 的参数 C 设置为
class_weight[i]*C
。如果未给出,则所有类都应具有权重 1。“balanced”模式使用 y 的值自动调整权重,使其与输入数据中类频率成反比,如n_samples / (n_classes * np.bincount(y))
。- verbose整数,默认值=0
启用详细输出。请注意,此设置利用了 liblinear 中的每个进程运行时设置,如果启用该设置,则可能无法在多线程上下文中正常工作。
- random_state整数、RandomState 实例或 None,默认值=None
控制用于对偶坐标下降(如果
dual=True
)的数据混洗的伪随机数生成。当dual=False
时,LinearSVC
的底层实现不是随机的,并且random_state
不会影响结果。为跨多个函数调用获得可重复输出,请传入一个整数。请参见词汇表。- max_iter整数,默认值=1000
要运行的最大迭代次数。
- 属性:
- coef_如果 n_classes == 2,则形状为 (1, n_features) 的 ndarray;否则为 (n_classes, n_features)
分配给特征的权重(原始问题中的系数)。
coef_
是从raw_coef_
派生的只读属性,它遵循 liblinear 的内部内存布局。- intercept_如果 n_classes == 2,则形状为 (1,) 的 ndarray;否则为 (n_classes,)
决策函数中的常数。
- classes_形状为 (n_classes,) 的 ndarray
唯一的类标签。
- n_features_in_整数
在拟合期间看到的特征数量。
在 0.24 版本中添加。
- feature_names_in_形状为 (
n_features_in_
,) 的 ndarray 在拟合期间看到的特征名称。仅当
X
具有全部为字符串的特征名称时才定义。在 1.0 版本中添加。
- n_iter_整数
所有类中运行的最大迭代次数。
另请参见
支持向量机分类器 (SVC)
使用 libsvm 实现支持向量机分类器:内核可以是非线性的,但其 SMO 算法不能像 LinearSVC 那样扩展到大量样本。此外,SVC 多类模式是使用一对一方案实现的,而 LinearSVC 使用一对其余方案。可以使用
OneVsRestClassifier
包装器来实现一对其余方案。最后,如果输入是 C 连续的,SVC 可以拟合密集数据而无需内存复制。但是,稀疏数据仍然会产生内存复制。sklearn.linear_model.SGDClassifier
通过调整惩罚和损失参数,SGDClassifier 可以优化与 LinearSVC 相同的成本函数。此外,它需要的内存更少,允许增量(在线)学习,并实现了各种损失函数和正则化方案。
备注
底层的 C 实现使用随机数生成器在拟合模型时选择特征。因此,对于相同输入数据获得略微不同的结果并不罕见。如果发生这种情况,请尝试使用较小的
tol
参数。底层实现 liblinear 使用稀疏的内部数据表示,这将导致内存复制。
在某些情况下,预测输出可能与独立的 liblinear 的输出不匹配。请参阅叙述文档中的liblinear 的差异。
参考文献
示例
>>> from sklearn.svm import LinearSVC >>> from sklearn.pipeline import make_pipeline >>> from sklearn.preprocessing import StandardScaler >>> from sklearn.datasets import make_classification >>> X, y = make_classification(n_features=4, random_state=0) >>> clf = make_pipeline(StandardScaler(), ... LinearSVC(random_state=0, tol=1e-5)) >>> clf.fit(X, y) Pipeline(steps=[('standardscaler', StandardScaler()), ('linearsvc', LinearSVC(random_state=0, tol=1e-05))])
>>> print(clf.named_steps['linearsvc'].coef_) [[0.141... 0.526... 0.679... 0.493...]]
>>> print(clf.named_steps['linearsvc'].intercept_) [0.1693...] >>> print(clf.predict([[0, 0, 0, 0]])) [1]
- decision_function(X)[source]#
预测样本的置信度分数。
样本的置信度分数与该样本到超平面的带符号距离成正比。
- 参数:
- X形状为 (n_samples, n_features) 的{类数组、稀疏矩阵}
我们要获取置信度分数的数据矩阵。
- 返回:
- scores形状为 (n_samples,) 或 (n_samples, n_classes) 的 ndarray
每个
(n_samples, n_classes)
组合的置信度分数。在二元情况下,self.classes_[1]
的置信度分数,其中 >0 表示将预测此类。
- densify()[source]#
将系数矩阵转换为密集数组格式。
将
coef_
成员(返回)转换为 numpy.ndarray。这是coef_
的默认格式,并且是拟合所必需的,因此仅需要对以前已稀疏化的模型调用此方法;否则,它是一个无操作。- 返回:
- self
拟合的估计器。
- fit(X, y, sample_weight=None)[source]#
根据给定的训练数据拟合模型。
- 参数:
- X形状为 (n_samples, n_features) 的{类数组、稀疏矩阵}
训练向量,其中
n_samples
是样本数,n_features
是特征数。- yarray-like of shape (n_samples,)
相对于X的目标向量。
- sample_weightarray-like of shape (n_samples,), default=None
分配给各个样本的权重数组。如果没有提供,则每个样本都赋予单位权重。
0.18版本新增。
- 返回:
- selfobject
估计器的实例。
- get_metadata_routing()[source]#
获取此对象的元数据路由。
请查看用户指南,了解路由机制的工作原理。
- 返回:
- routingMetadataRequest
一个
MetadataRequest
,封装了路由信息。
- get_params(deep=True)[source]#
获取此估计器的参数。
- 参数:
- deepbool, default=True
如果为True,则将返回此估计器及其包含的子对象(也是估计器)的参数。
- 返回:
- paramsdict
参数名称与其值的映射。
- predict(X)[source]#
预测X中样本的类别标签。
- 参数:
- X形状为 (n_samples, n_features) 的{类数组、稀疏矩阵}
我们要获取预测结果的数据矩阵。
- 返回:
- y_predndarray of shape (n_samples,)
包含每个样本类别标签的向量。
- score(X, y, sample_weight=None)[source]#
返回给定测试数据和标签的平均准确率。
在多标签分类中,这是子集准确率,这是一个严格的指标,因为它要求每个样本的每个标签集都被正确预测。
- 参数:
- Xarray-like of shape (n_samples, n_features)
测试样本。
- yarray-like of shape (n_samples,) or (n_samples, n_outputs)
X
的真实标签。- sample_weightarray-like of shape (n_samples,), default=None
样本权重。
- 返回:
- scorefloat
self.predict(X)
相对于y
的平均准确率。
- set_fit_request(*, sample_weight: bool | None | str = '$UNCHANGED$') LinearSVC [source]#
请求传递给
fit
方法的元数据。请注意,只有当
enable_metadata_routing=True
时(参见sklearn.set_config
),此方法才相关。请参阅用户指南,了解路由机制的工作原理。每个参数的选项为
True
:请求元数据,如果提供则将其传递给fit
。如果未提供元数据,则忽略请求。False
:不请求元数据,元估计器不会将其传递给fit
。None
:不请求元数据,如果用户提供元数据,元估计器将引发错误。str
:元数据应使用此给定的别名而不是原始名称传递给元估计器。
默认值(
sklearn.utils.metadata_routing.UNCHANGED
)保留现有请求。这允许您更改某些参数的请求,而其他参数则保持不变。版本 1.3 中新增。
注意
只有当此估计器用作元估计器的子估计器时,例如在
Pipeline
中使用时,此方法才相关。否则,它无效。- 参数:
- sample_weightstr、True、False 或 None,默认值=sklearn.utils.metadata_routing.UNCHANGED
fit
中sample_weight
参数的元数据路由。
- 返回:
- selfobject
更新后的对象。
- set_params(**params)[source]#
设置此估计器的参数。
此方法适用于简单的估计器以及嵌套对象(例如
Pipeline
)。后者具有<component>__<parameter>
形式的参数,因此可以更新嵌套对象的每个组件。- 参数:
- **paramsdict
估计器参数。
- 返回:
- self估计器实例
估计器实例。
- set_score_request(*, sample_weight: bool | None | str = '$UNCHANGED$') LinearSVC [source]#
请求传递给
score
方法的元数据。请注意,只有当
enable_metadata_routing=True
时(参见sklearn.set_config
),此方法才相关。请参阅用户指南,了解路由机制的工作原理。每个参数的选项为
True
:请求元数据,如果提供则传递给score
。如果未提供元数据,则忽略请求。False
:不请求元数据,元估计器不会将其传递给score
。None
:不请求元数据,如果用户提供元数据,元估计器将引发错误。str
:元数据应使用此给定的别名而不是原始名称传递给元估计器。
默认值(
sklearn.utils.metadata_routing.UNCHANGED
)保留现有请求。这允许您更改某些参数的请求,而其他参数则保持不变。版本 1.3 中新增。
注意
只有当此估计器用作元估计器的子估计器时,例如在
Pipeline
中使用时,此方法才相关。否则,它无效。- 参数:
- sample_weightstr、True、False 或 None,默认值=sklearn.utils.metadata_routing.UNCHANGED
score
中sample_weight
参数的元数据路由。
- 返回:
- selfobject
更新后的对象。
- sparsify()[source]#
将系数矩阵转换为稀疏格式。
将
coef_
成员转换为 scipy.sparse 矩阵,对于 L1 正则化模型,这比通常的 numpy.ndarray 表示更节省内存和存储空间。intercept_
成员不会被转换。- 返回:
- self
拟合的估计器。
备注
对于非稀疏模型,即当
coef_
中没有很多零时,这实际上可能会增加内存使用量,因此请谨慎使用此方法。一个经验法则是,零元素的数量(可以使用(coef_ == 0).sum()
计算)必须超过 50%,才能提供显著的益处。调用此方法后,使用 partial_fit 方法(如果有)进行进一步拟合将无法工作,直到您调用 densify。
图库示例#
使用 Pipeline 和 GridSearchCV 选择降维