SGDClassifier#
- class sklearn.linear_model.SGDClassifier(loss='hinge', *, penalty='l2', alpha=0.0001, l1_ratio=0.15, fit_intercept=True, max_iter=1000, tol=0.001, shuffle=True, verbose=0, epsilon=0.1, n_jobs=None, random_state=None, learning_rate='optimal', eta0=0.0, power_t=0.5, early_stopping=False, validation_fraction=0.1, n_iter_no_change=5, class_weight=None, warm_start=False, average=False)#
线性分类器(SVM、逻辑回归等)使用SGD训练。
该估计器实现了带有随机梯度下降(SGD)学习的正则化线性模型:每次估计一个样本的损失梯度,并沿着减弱的强度计划(又称学习率)更新模型。SGD允许通过
partial_fit
方法进行小批量(在线/外核)学习。为了使用默认学习率计划获得最佳结果,数据应具有零均值和单位方差。该实现适用于表示为浮点值密集或稀疏数组的数据。它拟合的模型可以通过损失参数进行控制;默认情况下,它拟合线性支持向量机(SVM)。
正则化器是添加到损失函数中的惩罚项,使用欧几里得范数L2或绝对范数L1或两者的组合(弹性网络)将模型参数缩小到零向量。如果由于正则化器的原因参数更新跨越0.0值,则更新被截断为0.0,以允许学习稀疏模型并实现在线特征选择。
更多信息请参阅 用户指南 。
- Parameters:
- loss{‘hinge’, ‘log_loss’, ‘modified_huber’, ‘squared_hinge’, ‘perceptron’, ‘squared_error’, ‘huber’, ‘epsilon_insensitive’, ‘squared_epsilon_insensitive’}, default=’hinge’
要使用的损失函数。
‘hinge’ 给出线性SVM。
‘log_loss’ 给出逻辑回归,一种概率分类器。
‘modified_huber’ 是另一种平滑损失,带来对异常值的容忍以及概率估计。
‘squared_hinge’ 类似于hinge,但二次惩罚。
‘perceptron’ 是感知器算法使用的线性损失。
其他损失,’squared_error’, ‘huber’, ‘epsilon_insensitive’ 和 ‘squared_epsilon_insensitive’ 设计用于回归,但在分类中也可能有用;请参阅
SGDRegressor
了解描述。
有关损失公式的更多详细信息,请参阅 用户指南 。
- penalty{‘l2’, ‘l1’, ‘elasticnet’, None}, default=’l2’
要使用的惩罚(又称正则化项)。默认为’l2’,这是线性SVM模型的标准正则化器。’l1’和 ‘elasticnet’ 可能会带来’l2’无法实现的稀疏性(特征选择)。当设置为
None
时,不添加惩罚。- alphafloat, default=0.0001
乘以正则化项的常数。值越高,正则化越强。当
learning_rate
设置为’optimal’时,也用于计算学习率。 值必须在范围[0.0, inf)
内。- l1_ratiofloat, default=0.15
弹性网络混合参数,0 <= l1_ratio <= 1。 l1_ratio=0 对应于L2惩罚,l1_ratio=1 对应于L1。 仅当
penalty
为’elasticnet’时使用。 值必须在范围[0.0, 1.0]
内。- fit_interceptbool, default=True
是否应估计截距。如果为False,则假定数据已经中心化。
- max_iterint, default=1000
对训练数据的最大遍数(又称epochs)。 它仅影响
fit
方法的行为,不影响partial_fit
方法。 值必须在范围[1, inf)
内。Added in version 0.19.
- tolfloat or None, default=1e-3
停止标准。如果它不为None,当(损失 > best_loss - tol)持续
n_iter_no_change
个epoch时,训练将停止。 根据early_stopping
参数,收敛性检查针对训练损失或验证损失。 值必须在范围[0.0, inf)
内。Added in version 0.19.
- shufflebool, default=True
是否应在每个epoch后打乱训练数据。
- verboseint, default=0
详细级别。 值必须在范围
[0, inf)
内。- epsilonfloat, default=0.1
epsilon-insensitive损失函数中的epsilon;仅当
loss
为 ‘huber’, ‘epsilon_insensitive’, 或 ‘squared_epsilon_insensitive’时使用。 对于’huber’,确定变得不那么重要的阈值以准确预测。 对于epsilon-insensitive,如果当前预测与正确标签之间的差异小于此阈值,则忽略这些差异。 值必须在范围[0.0, inf)
内。- n_jobsint, default=None
用于OVA(一对一,用于多类问题)计算的CPU数量。
None
意味着1,除非在joblib.parallel_backend
上下文中。-1
意味着使用所有处理器。有关更多详细信息,请参阅 Glossary 。- random_stateint, RandomState instance, default=None
用于在
shuffle
设置为True
时打乱数据。 传递一个int以在多次函数调用中获得可重复的输出。 请参阅 Glossary 。 整数值必须在范围[0, 2**32 - 1]
内。- learning_ratestr, default=’optimal’
学习率计划:
‘constant’:
eta = eta0
‘optimal’:
eta = 1.0 / (alpha * (t + t0))
其中t0
由Leon Bottou提出的一种启发式选择。‘invscaling’:
eta = eta0 / pow(t, power_t)
‘adaptive’:
eta = eta0
,只要训练持续下降。 每次n_iter_no_change个epoch未能将训练损失减少tol或未能增加验证分数tol(如果early_stopping
为True
),当前学习率除以5。Added in version 0.20: 添加了’adaptive’选项
- eta0float, default=0.0
‘constant’, ‘invscaling’ 或 ‘adaptive’ 计划的初始学习率。默认值为0.0,因为默认计划’optimal’不使用eta0。 值必须在范围
[0.0, inf)
内。- power_tfloat, default=0.5
逆缩放学习率的指数。 值必须在范围
(-inf, inf)
内。- early_stoppingbool, default=False
是否使用提前停止以在验证分数不提高时终止训练。如果设置为
True
,它将自动留出一部分训练数据作为验证,并在验证分数返回的score
方法未提高至少tol持续n_iter_no_change个epoch时终止训练。Added in version 0.20: 添加了’early_stopping’选项
- validation_fractionfloat, default=0.1
留出作为提前停止验证集的训练数据比例。必须在0和1之间。 仅当
early_stopping
为True时使用。 值必须在范围(0.0, 1.0)
内。Added in version 0.20: 添加了’validation_fraction’选项
- n_iter_no_changeint, default=5
在停止拟合之前等待无改进的迭代次数。 根据
early_stopping
参数,收敛性检查针对训练损失或验证损失。 整数值必须在范围[1, max_iter)
内。Added in version 0.20: 添加了’n_iter_no_change’选项
- class_weightdict, {class_label: weight} or “balanced”, default=None
class_weight fit参数的预设。
与类相关的权重。如果未给出,则假定所有类的权重为1。
“balanced”模式使用y的值自动调整权重,与输入数据中的类频率成反比 如
n_samples / (n_classes * np.bincount(y))
。- warm_startbool, default=False
当设置为True时,重用上一次调用fit的解决方案作为初始化,否则,只擦除之前的解决方案。 请参阅 the Glossary 。
在warm_start为True时重复调用fit或partial_fit可能会导致与单次调用fit不同的解决方案,因为数据被打乱的方式。 如果使用动态学习率,学习率会根据已看到的样本数量进行调整。调用
fit
会重置此计数器,而partial_fit
将导致增加现有计数器。- averagebool or int, default=False
当设置为
True
时,计算所有更新中SGD权重的平均值,并将结果存储在coef_
属性中。如果设置为大于1的int,则在看到的总样本数达到average
时开始平均。因此average=10
将在看到10个样本后开始平均。 整数值必须在范围[1, n_samples]
内。
- Attributes:
- coef_ndarray of shape (1, n_features) if n_classes == 2 else (n_classes, n_features)
分配给特征的权重。
- intercept_ndarray of shape (1,) if n_classes == 2 else (n_classes,)
决策函数中的常数。
- n_iter_int
达到停止标准前的实际迭代次数。 对于多类拟合,它是每个二元拟合中的最大值。
- classes_array of shape (n_classes,)
- t_int
训练期间执行的权重更新次数。 与
(n_iter_ * n_samples + 1)
相同。- n_features_in_int
fit 期间看到的特征数量。
Added in version 0.24.
- feature_names_in_ndarray of shape (
n_features_in_
,) fit 期间看到的特征名称。仅当
X
的特征名称均为字符串时定义。Added in version 1.0.
See also
sklearn.svm.LinearSVC
线性支持向量分类。
LogisticRegression
逻辑回归。
Perceptron
继承自SGDClassifier。
Perceptron()
等价于SGDClassifier(loss="perceptron", eta0=1, learning_rate="constant", penalty=None)
。
Examples
>>> import numpy as np >>> from sklearn.linear_model import SGDClassifier >>> from sklearn.preprocessing import StandardScaler >>> from sklearn.pipeline import make_pipeline >>> X = np.array([[-1, -1], [-2, -1], [1, 1], [2, 1]]) >>> Y = np.array([1, 1, 2, 2]) >>> # 始终缩放输入。最方便的方法是使用管道。 >>> clf = make_pipeline(StandardScaler(), ... SGDClassifier(max_iter=1000, tol=1e-3)) >>> clf.fit(X, Y) Pipeline(steps=[('standardscaler', StandardScaler()), ('sgdclassifier', SGDClassifier())]) >>> print(clf.predict([[-0.8, -1]])) [1]
- decision_function(X)#
预测样本的置信度分数。
样本的置信度分数与其到超平面的有符号距离成正比。
- Parameters:
- X{array-like, sparse matrix},形状为 (n_samples, n_features)
我们想要获取置信度分数的数据矩阵。
- Returns:
- scoresndarray,形状为 (n_samples,) 或 (n_samples, n_classes)
每个
(n_samples, n_classes)
组合的置信度分数。在二分类情况下,self.classes_[1]
的置信度分数,其中 >0 表示会预测这个类别。
- densify()#
将系数矩阵转换为密集数组格式。
将
coef_
成员(回)转换为 numpy.ndarray。这是coef_
的默认格式,并且是拟合所必需的,因此只有在之前已经稀疏化的模型上才需要调用此方法;否则,它是一个空操作。- Returns:
- self
拟合的估计器。
- fit(X, y, coef_init=None, intercept_init=None, sample_weight=None)#
拟合带有随机梯度下降的线性模型。
- Parameters:
- X{array-like, sparse matrix}, shape (n_samples, n_features)
训练数据。
- yndarray of shape (n_samples,)
目标值。
- coef_initndarray of shape (n_classes, n_features), default=None
用于优化预热启动的初始系数。
- intercept_initndarray of shape (n_classes,), default=None
用于优化预热启动的初始截距。
- sample_weightarray-like, shape (n_samples,), default=None
应用于单个样本的权重。 如果未提供,则假设均匀权重。如果指定了class_weight(通过构造函数传递),这些权重将与class_weight相乘。
- Returns:
- selfobject
返回self的一个实例。
- get_metadata_routing()#
获取此对象的元数据路由。
请查看 用户指南 以了解路由机制的工作原理。
- Returns:
- routingMetadataRequest
MetadataRequest
封装的 路由信息。
- get_params(deep=True)#
获取此估计器的参数。
- Parameters:
- deepbool, 默认=True
如果为True,将返回此估计器和包含的子对象(也是估计器)的参数。
- Returns:
- paramsdict
参数名称映射到它们的值。
- partial_fit(X, y, classes=None, sample_weight=None)#
执行一次给定样本的随机梯度下降。
内部使用
max_iter = 1
。因此,不能保证在调用一次后达到成本函数的最小值。诸如目标收敛、提前停止和学习率调整等问题应由用户处理。- Parameters:
- X{array-like, sparse matrix}, shape (n_samples, n_features)
训练数据的子集。
- yndarray of shape (n_samples,)
目标值的子集。
- classesndarray of shape (n_classes,), default=None
所有调用partial_fit的类别。 可以通过
np.unique(y_all)
获得,其中y_all是整个数据集的目标向量。 此参数在第一次调用partial_fit时是必需的,在后续调用中可以省略。 请注意,y不需要包含classes
中的所有标签。- sample_weightarray-like, shape (n_samples,), default=None
应用于单个样本的权重。 如果未提供,则假设均匀权重。
- Returns:
- selfobject
返回self的实例。
- predict(X)#
预测X中的样本类别标签。
- Parameters:
- X{array-like, sparse matrix},形状为 (n_samples, n_features)
我们希望获取预测的数据矩阵。
- Returns:
- y_predndarray,形状为 (n_samples,)
包含每个样本类别标签的向量。
- predict_log_proba(X)#
对概率估计的对数。
此方法仅适用于对数损失和修正的Huber损失。
当loss=”modified_huber”时,概率估计可能是硬零和硬一,因此取对数是不可能的。
详见
predict_proba
。- Parameters:
- X{array-like, sparse matrix},形状为 (n_samples, n_features)
用于预测的输入数据。
- Returns:
- Tarray-like, 形状为 (n_samples, n_classes)
返回模型中每个类别的样本的对数概率,类别按
self.classes_
中的顺序排列。
- predict_proba(X)#
估计概率。
此方法仅适用于对数损失和修正的Huber损失。
多类概率估计是通过简单归一化从二元(一对多)估计中得出的,如Zadrozny和Elkan所推荐。
对于loss=”modified_huber”的二元概率估计由(clip(decision_function(X), -1, 1) + 1) / 2给出。对于其他损失函数,需要通过使用:class:
~sklearn.calibration.CalibratedClassifierCV
包装分类器来进行适当的概率校准。- Parameters:
- X{array-like, sparse matrix}, shape (n_samples, n_features)
用于预测的输入数据。
- Returns:
- shape为(n_samples, n_classes)的ndarray
返回模型中每个类的样本概率,其中类按
self.classes_
中的顺序排列。
References
Zadrozny和Elkan,”Transforming classifier scores into multiclass probability estimates”, SIGKDD’02, https://dl.acm.org/doi/pdf/10.1145/775047.775151
loss=”modified_huber”情况下的公式证明在附录B中: http://jmlr.csail.mit.edu/papers/volume2/zhang02c/zhang02c.pdf
- score(X, y, sample_weight=None)#
返回给定测试数据和标签的平均准确率。
在多标签分类中,这是子集准确率,这是一个严格的指标,因为你要求每个样本的每个标签集都被正确预测。
- Parameters:
- X形状为 (n_samples, n_features) 的类数组
测试样本。
- y形状为 (n_samples,) 或 (n_samples, n_outputs) 的类数组
` X`的真实标签。
- sample_weight形状为 (n_samples,) 的类数组,默认=None
样本权重。
- Returns:
- scorefloat
self.predict(X)
相对于y
的平均准确率。
- set_fit_request(*, coef_init: bool | None | str = '$UNCHANGED$', intercept_init: bool | None | str = '$UNCHANGED$', sample_weight: bool | None | str = '$UNCHANGED$') SGDClassifier #
Request metadata passed to the
fit
method.Note that this method is only relevant if
enable_metadata_routing=True
(seesklearn.set_config
). Please see User Guide on how the routing mechanism works.The options for each parameter are:
True
: metadata is requested, and passed tofit
if provided. The request is ignored if metadata is not provided.False
: metadata is not requested and the meta-estimator will not pass it tofit
.None
: metadata is not requested, and the meta-estimator will raise an error if the user provides it.str
: metadata should be passed to the meta-estimator with this given alias instead of the original name.
The default (
sklearn.utils.metadata_routing.UNCHANGED
) retains the existing request. This allows you to change the request for some parameters and not others.Added in version 1.3.
Note
This method is only relevant if this estimator is used as a sub-estimator of a meta-estimator, e.g. used inside a
Pipeline
. Otherwise it has no effect.- Parameters:
- coef_initstr, True, False, or None, default=sklearn.utils.metadata_routing.UNCHANGED
Metadata routing for
coef_init
parameter infit
.- intercept_initstr, True, False, or None, default=sklearn.utils.metadata_routing.UNCHANGED
Metadata routing for
intercept_init
parameter infit
.- sample_weightstr, True, False, or None, default=sklearn.utils.metadata_routing.UNCHANGED
Metadata routing for
sample_weight
parameter infit
.
- Returns:
- selfobject
The updated object.
- set_params(**params)#
设置此估计器的参数。
该方法适用于简单估计器以及嵌套对象(例如
Pipeline
)。后者具有形式为<component>__<parameter>
的参数,以便可以更新嵌套对象的每个组件。- Parameters:
- **paramsdict
估计器参数。
- Returns:
- selfestimator instance
估计器实例。
- set_partial_fit_request(*, classes: bool | None | str = '$UNCHANGED$', sample_weight: bool | None | str = '$UNCHANGED$') SGDClassifier #
Request metadata passed to the
partial_fit
method.Note that this method is only relevant if
enable_metadata_routing=True
(seesklearn.set_config
). Please see User Guide on how the routing mechanism works.The options for each parameter are:
True
: metadata is requested, and passed topartial_fit
if provided. The request is ignored if metadata is not provided.False
: metadata is not requested and the meta-estimator will not pass it topartial_fit
.None
: metadata is not requested, and the meta-estimator will raise an error if the user provides it.str
: metadata should be passed to the meta-estimator with this given alias instead of the original name.
The default (
sklearn.utils.metadata_routing.UNCHANGED
) retains the existing request. This allows you to change the request for some parameters and not others.Added in version 1.3.
Note
This method is only relevant if this estimator is used as a sub-estimator of a meta-estimator, e.g. used inside a
Pipeline
. Otherwise it has no effect.- Parameters:
- classesstr, True, False, or None, default=sklearn.utils.metadata_routing.UNCHANGED
Metadata routing for
classes
parameter inpartial_fit
.- sample_weightstr, True, False, or None, default=sklearn.utils.metadata_routing.UNCHANGED
Metadata routing for
sample_weight
parameter inpartial_fit
.
- Returns:
- selfobject
The updated object.
- set_score_request(*, sample_weight: bool | None | str = '$UNCHANGED$') SGDClassifier #
Request metadata passed to the
score
method.Note that this method is only relevant if
enable_metadata_routing=True
(seesklearn.set_config
). Please see User Guide on how the routing mechanism works.The options for each parameter are:
True
: metadata is requested, and passed toscore
if provided. The request is ignored if metadata is not provided.False
: metadata is not requested and the meta-estimator will not pass it toscore
.None
: metadata is not requested, and the meta-estimator will raise an error if the user provides it.str
: metadata should be passed to the meta-estimator with this given alias instead of the original name.
The default (
sklearn.utils.metadata_routing.UNCHANGED
) retains the existing request. This allows you to change the request for some parameters and not others.Added in version 1.3.
Note
This method is only relevant if this estimator is used as a sub-estimator of a meta-estimator, e.g. used inside a
Pipeline
. Otherwise it has no effect.- Parameters:
- sample_weightstr, True, False, or None, default=sklearn.utils.metadata_routing.UNCHANGED
Metadata routing for
sample_weight
parameter inscore
.
- Returns:
- selfobject
The updated object.
- sparsify()#
将系数矩阵转换为稀疏格式。
将
coef_
成员转换为 scipy.sparse 矩阵,对于 L1 正则化模型来说,这种格式在内存和存储方面比通常的 numpy.ndarray 表示更高效。intercept_
成员不会被转换。- Returns:
- self
拟合的估计器。
Notes
对于非稀疏模型,即当
coef_
中没有很多零时,这实际上可能会增加内存使用量,因此请谨慎使用此方法。一个经验法则是,零元素的数量,可以通过(coef_ == 0).sum()
计算,必须超过 50% 才能提供显著的效益。调用此方法后,进一步使用 partial_fit 方法(如果有)进行拟合将不起作用,直到您调用 densify。