逻辑回归中正则化强度的逆是什么?如何影响我的代码?

60 投票
2 回答
50906 浏览
提问于 2025-04-18 01:16

我正在使用 sklearn.linear_model.LogisticRegression 这个库里的功能来进行逻辑回归。

C : float, optional (default=1.0) Inverse of regularization strength;
    must be a positive float. Like in support vector machines, smaller
    values specify stronger regularization.

这里的 C 简单来说是什么意思呢?什么是正则化强度?

2 个回答

0

一句话来说,正则化让模型在训练数据上的表现变差,从而可能在未见过的数据上表现得更好。

逻辑回归是一个优化问题,我们需要最小化以下的目标函数。

func1

其中,损失函数看起来像这样(至少对于 solver='lbfgs' 来说)。

loss func

正则化会在这个函数中加入一个系数的范数。下面是实现L2惩罚的公式。

func2

从这个公式可以看出,正则化项是用来惩罚那些系数过大的情况(最小化问题就是在找出能让目标函数最小的系数)。由于每个系数的大小取决于其对应变量的尺度,因此需要对数据进行缩放,以确保正则化对每个变量的惩罚是相同的。正则化的强度由 C 决定,当 C 增加时,正则化项变小(对于非常大的 C 值,几乎就像没有正则化一样)。

如果初始模型出现了过拟合(也就是说,它对训练数据的拟合太好了),那么添加一个强的正则化项(小的 C 值)会让模型在训练数据上的表现变差,但这种“噪声”的引入会改善模型在未见过的数据(或测试数据)上的表现。


C 值下的准确率图中看到,如果 C 很大(几乎没有正则化),模型在训练数据和测试数据上的表现差距很大。然而,当 C 减小时,模型在训练数据上的表现变差,但在测试数据上的表现变好(测试准确率提高)。但是,当 C 变得太小(或者正则化变得太强)时,模型的表现又开始变差,因为这时正则化项完全主导了目标函数。

C vs accuracy


用于生成图表的代码:

import pandas as pd
from sklearn.datasets import make_classification
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.linear_model import LogisticRegression

# make sample data
X, y = make_classification(1000, 200, n_informative=195, random_state=2023)
# split into train-test datasets
X_train, X_test, y_train, y_test = train_test_split(X, y, random_state=2023)

# normalize the data
sc = StandardScaler()
X_train = sc.fit_transform(X_train)
X_test = sc.transform(X_test)

# train Logistic Regression models for different values of C
# and collect train and test accuracies
scores = {}
for C in (10**k for k in range(-6, 6)):
    lr = LogisticRegression(C=C)
    lr.fit(X_train, y_train)
    scores[C] = {'train accuracy': lr.score(X_train, y_train), 
                 'test accuracy': lr.score(X_test, y_test)}

# plot the accuracy scores for different values of C
pd.DataFrame.from_dict(scores, 'index').plot(logx=True, xlabel='C', ylabel='accuracy');
105

正则化就是给模型的参数加一个惩罚,让它们的值不要太大,这样可以减少过拟合的情况。当你训练一个模型,比如逻辑回归模型时,你会选择一些参数,使得模型对数据的拟合效果最好。这意味着你要尽量减少模型预测的结果和实际结果之间的误差。

问题出现在你有很多参数(也就是很多自变量),但数据不够多的情况下。在这种情况下,模型往往会把参数调得非常贴合你的数据中的一些特殊情况——这就意味着它几乎完美地拟合了你的数据。然而,因为这些特殊情况在你未来看到的数据中并不存在,所以模型的预测效果就很差。

为了解决这个问题,除了要最小化误差之外,你还需要增加一个步骤,就是要最小化一个惩罚函数,这个函数会对参数值过大进行惩罚。通常这个函数的形式是 λΣθj2,也就是一个常数 λ 乘以所有参数值平方的总和。λ 的值越大,参数的值就越不容易因为数据中的小波动而被调得过大。不过在你的情况下,你并不是直接指定 λ,而是指定 C=1/λ。

撰写回答