sklearn中的逻辑回归中及正则化

本文探讨了在逻辑回归中使用多项式项和正则化技术,以处理非线性数据分类问题。通过调整超参数C和选择L1或L2正则化,有效地避免了过拟合,提高了模型的泛化能力。

0x00 前言

在逻辑回归中添加多项式项,从而得到不规则的决策边界,进而对非线性的数据进行很好的分类。但是众所周知,添加多项式项之后,模型会变变得很复杂,非常容易出现过拟合。因此就需要使用正则化,且sklearn中的逻辑回归,都是使用的正则化。

0x01 逻辑回归中使用正则化

对损失函数增加L1正则或L2正则。可以引入一个新的参数 来调节损失函数和正则项的权重,如: 。(对于L1、L2正则项的内容,不是本篇介绍的重点)

如果在损失函数前引入一个超参数 ,即: ,如果C越大,优化损失函数时越应该集中火力,将损失函数减小到最小;C非常小时,此时L1和L2的正则项就显得更加重要。其实损失函数前的参数 ,作用相当于参数 前的一个倒数。在逻辑回归中,对模型正则化更喜欢使用  这种方式。

0x02 sklearn中的逻辑回归

import numpy as np
import matplotlib.pyplot as plt


np.random.seed(666)
# 构建服从标准差为0,方差为1的分布,200个样本,有两个特征
X = np.random.normal(0, 1, size=(200, 2))
# 构建输入空间X与标签y的关系:是一个抛物线,通过布尔向量转为int类型
y = np.array((X[:,0]**2+X[:,1])<1.5, dtype='int')
# 随机在样本中挑20个点,强制分类为1(相当于噪音)
for _ in range(20):
    y[np.random.randint(200)] = 1
plt.scatter(X[y==0,0], X[y==0,1])
plt.scatter(X[y==1,0], X[y==1,1])
plt.show()

使用sklearn中的逻辑回归

from sklearn.model_selection import train_test_split
from sklearn.linear_model import LogisticRegression


X_train, X_test, y_train, y_test = train_test_split(X, y, random_state=666)


log_reg = LogisticRegression()
log_reg.fit(X_train, y_train)

返回sklearn的逻辑回归中的参数:

注意观察,有一个参数penalty的默认参数是l2,这说明sklearn中默认是使用L2正则项的,且超参数C默认1。

log_reg.score(X_train, y_train)
"""
输出:
0.79333333333333333
"""
log_reg.score(X_test, y_test)
"""
输出:
0.85999999999999999
"""

我们发现准确不高,这很正常!因为设置的就是非线性的数据,而现在用的还是没加多项式的逻辑回归。

下面可以可视化一下决策边界:

def plot_decision_boundary(model, axis):   
    x0, x1 = np.meshgrid(
        np.linspace(axis[0], axis[1], int((axis[1]-axis[0])*100)).reshape(-1, 1),
        np.linspace(axis[2], axis[3], int((axis[3]-axis[2])*100)).reshape(-1, 1),
    )
    X_new = np.c_[x0.ravel(), x1.ravel()]
    y_predict = model.predict(X_new)
    zz = y_predict.reshape(x0.shape)
    from matplotlib.colors import ListedColormap
    custom_cmap = ListedColormap(['#EF9A9A','#FFF59D','#90CAF9'])
    plt.contourf(x0, x1, zz, linewidth=5, cmap=custom_cmap)


plot_decision_boundary(log_reg, axis=[-4, 4, -4, 4])
plt.scatter(X[y==0,0], X[y==0,1])
plt.scatter(X[y==1,0], X[y==1,1])
plt.show()

0x03 多项式项逻辑回归

3.1 实现多项式项逻辑回归

尝试使用多项式项进行逻辑回归。使用pipeline方式组合三个步骤,得到一个使用多项式项的逻辑回归的方法

from sklearn.preprocessing import PolynomialFeatures
from sklearn.pipeline import Pipeline
from sklearn.preprocessing import StandardScaler


def PolynomialLogisticRegression(degree):
    return Pipeline([
        ('poly', PolynomialFeatures(degree=degree)),
        ('std_scaler', StandardScaler()),
        ('log_reg', LogisticRegression())
    ])


poly_log_reg = PolynomialLogisticRegression(degree=2)
poly_log_reg.fit(X_train, y_train)

看一下训练得到的结果:

poly_log_reg.score(X_train, y_train)
"""
输出:0.91333333333333333
"""
poly_log_reg.score(X_test, y_test)
"""
输出:
0.93999999999999995
"""
plot_decision_boundary(poly_log_reg, axis=[-4, 4, -4, 4])
plt.scatter(X[y==0,0], X[y==0,1])
plt.scatter(X[y==1,0], X[y==1,1])
plt.show()

下面设置一个比较大的阶数(目的就是看看过拟合的亚子)

poly_log_reg2 = PolynomialLogisticRegression(degree=20)
poly_log_reg2.fit(X_train, y_train)
poly_log_reg2.score(X_train, y_train)
"""
输出:0.93999999999999995
"""
poly_log_reg2.score(X_test, y_test)
"""
输出:0.93999999999999995
"""
plot_decision_boundary(poly_log_reg2, axis=[-4, 4, -4, 4])
plt.scatter(X[y==0,0], X[y==0,1])
plt.scatter(X[y==1,0], X[y==1,1])
plt.show()

其实单看结果,还看不出来太多,因为我们的模型设置的很简单。但是看决策边界的话,就知道,这个奇奇怪怪的曲线,一瞅就是过拟合了。

下面就在这个过拟合的基础上,加入模型的正则化。

3.2 模型的正则化

3.2.1 L2正则

使用参数 进行模型正则化,在构建管道时,用参数C去覆盖。同时在生成多项式逻辑回归实例参数时,同样设置阶数为20,然后设置一个比较小的损失函数的权重参数 ,相当于让模型正则化的项起到更大的作用,让分类准确度损失函数起到小一点的作用。

def PolynomialLogisticRegression(degree, C):
    return Pipeline([
        ('poly', PolynomialFeatures(degree=degree)),
        ('std_scaler', StandardScaler()),
        ('log_reg', LogisticRegression(C=C))
    ])


poly_log_reg3 = PolynomialLogisticRegression(degree=20, C=0.1)
poly_log_reg3.fit(X_train, y_train)

在训练数据集及测试数据集上的表现如下:

poly_log_reg3.score(X_train, y_train)
"""
输出:0.85333333333333339
"""
poly_log_reg3.score(X_test, y_test)
"""
输出:0.92000000000000004
"""
plot_decision_boundary(poly_log_reg3, axis=[-4, 4, -4, 4])
plt.scatter(X[y==0,0], X[y==0,1])
plt.scatter(X[y==1,0], X[y==1,1])
plt.show()

与没正则的情况下相比较,貌似是好了一点。

3.2.2 L1正则

def PolynomialLogisticRegression(degree, C, penalty):
    return Pipeline([
        ('poly', PolynomialFeatures(degree=degree)),
        ('std_scaler', StandardScaler()),
        ('log_reg', LogisticRegression(C=C, penalty=penalty))
    ])


poly_log_reg4 = PolynomialLogisticRegression(degree=20, C=0.1, penalty='l1')
poly_log_reg4.fit(X_train, y_train)
poly_log_reg4.score(X_train, y_train)
"""
输出:0.8266666666666667
"""
poly_log_reg4.score(X_test, y_test)
"""
输出:0.9
"""
plot_decision_boundary(poly_log_reg4, axis=[-4, 4, -4, 4])
plt.scatter(X[y==0,0], X[y==0,1])
plt.scatter(X[y==1,0], X[y==1,1])
plt.show()

虽然分类准确率比较低,但是没有过拟合,分类决策边界非常接近原本的真实数据了。

0xFF 总结

在这一篇文章中,就介绍了sklearn中如何使用逻辑回归,并对不同的正则化项得到的效果进行了展示。在实际使用中,阶数degree,参数C以及正则化项,都是超参数,使用网格搜索的方式得到最佳的组合。

其实逻辑回归不光可以解决二分类问题,还可以使用多分类问题。但是就留在后面介绍吧,大家加油!

热门文章

直戳泪点!数据从业者权威嘲讽指南!

AI研发工程师成长指南

数据分析师做成了提数工程师,该如何破局?

算法工程师应该具备哪些工程能力

数据团队思考:如何优雅地启动一个数据项目!

数据团队思考:数据驱动业务,比技术更重要的是思维的转变

<think>我们正在讨论的是sklearn中的逻辑回归。用户在上一个问题中提到了数值稳定性的问题,现在用户的新问题是:“我想查找在sklearn中设置逻辑回归的优器和学习率的方法 请问sklearn逻辑回归器和学习率的设置方法” 根据引用[3]中提到的`LogisticRegression`类的参数,我们可以知道: - `solver`参数用于设置优算法(优器) - 但是,sklearn逻辑回归中没有直接设置学习率的参数。不过,对于某些优器(如'sag'、'saga'和'lbfgs'),可以通过`max_iter`设置最大迭代次数,通过`tol`设置收敛阈值,间接影响优过程。 具体来说: 1. 优器(solver)的设置: 在`LogisticRegression`中,通过`solver`参数指定优算法。可选值包括: - 'liblinear':适用于小数据集,支持L1和L2正则化 - 'lbfgs':默认值,适用于中等规模数据集,支持L2正则化 - 'newton-cg':另一种牛顿法变种,支持L2正则化 - 'sag':随机平均梯度下降,适用于大数据集,支持L2正则化 - 'saga':sag的改进,支持L1和L2正则化,也支持弹性网络(Elastic-Net)正则化 2. 学习率: 在sklearn的`LogisticRegression`中,并没有一个叫`learning_rate`的参数。但是,对于使用随机梯度下降的优器(如'sag'和'saga'),我们可以通过`max_iter`(最大迭代次数)和`tol`(停止准则的容差)来控制优过程。此外,对于'saga'优器,我们可以通过设置`penalty`为'elasticnet',然后通过`l1_ratio`控制L1和L2正则化的比例。 但是,注意:对于'sag'和'saga',实际上有一个隐含的学习率控制,但sklearn没有提供直接设置学习率的参数。在源码中,对于'sag'和'saga',学习率是固定的,初始步长为$1.0$,并采用步长衰减策略。用户无法直接调整学习率。 因此,我们可以这样回答: 在sklearn中,通过`LogisticRegression`类的`solver`参数设置优器(优算法)。但是,sklearn逻辑回归没有直接提供学习率参数。不过,我们可以通过以下方式间接影响优过程: - 设置`max_iter`:最大迭代次数 - 设置`tol`:优停止的容忍度(当损失函数的变小于`tol`时,停止迭代) 另外,对于使用随机梯度下降的优器(如'saga'),我们可以通过设置`penalty='elasticnet'`和`l1_ratio`来使用弹性网络正则化,但这并不改变学习率。 如果用户需要调整学习率,可能需要考虑使用`SGDClassifier`,它使用随机梯度下降,并且有`learning_rate`参数。 引用[3]中提到了`linear_model.SGDClassifier`,这个类可以用来实现逻辑回归(通过设置`loss='log_loss'`),并且它提供了`learning_rate`参数(以及`eta0`初始学习率等参数)来调整学习率。 因此,我们可以有两种方案: 方案1:使用`LogisticRegression`,选择优器(但不直接设置学习率) 方案2:使用`SGDClassifier`,设置`loss='log'`(在sklearn的旧版本中)或`loss='log_loss'`(新版本),并设置学习率。 注意:在sklearn的文档中,逻辑回归的损失函数(交叉熵)在`SGDClassifier`中对应的损失函数是'log'(或'log_loss')。 总结回答结构: 1. 首先介绍`LogisticRegression`中优器的设置(solver参数) 2. 说明`LogisticRegression`没有直接的学习率参数,但可以通过max_iter和tol间接控制 3. 介绍替代方案:使用`SGDClassifier`,它提供了学习率参数 同时,根据引用[3],我们还可以提到正则化参数`C`(它实际上是正则化强度的倒数,C越大,正则化越弱)以及不同的正则化方式(penalty参数)。 最后,我们可以给出示例代码。 注意:引用文献的标注。在回答中,我们参考了引用[3](因为其中提到了LogisticRegression和SGDClassifier),所以可以在适当位置添加[^3]。 </think>在 sklearn 中设置逻辑回归的优器和学习率主要通过以下参数实现,核心依据来自引用[3]中的`LogisticRegression`类参数说明: ### 一、优器设置方法 通过`solver`参数指定优算法(优器): ```python from sklearn.linear_model import LogisticRegression # 示例:设置不同优器 model_lbfgs = LogisticRegression(solver='lbfgs') # 默认优器,拟牛顿法 model_liblinear = LogisticRegression(solver='liblinear') # 小数据集优选,支持L1正则 model_saga = LogisticRegression(solver='saga') # 大数据集优选,支持弹性网络 model_sag = LogisticRegression(solver='sag') # 随机平均梯度下降 ``` 常用优器对比: | 优器 | 适用场景 | 支持正则化 | 大数据集效率 | |--------|----------|------------|--------------| | `lbfgs` | 默认选择<br>中等规模数据 | L2 | 中等 | | `liblinear` | 小数据集<br>(n_samples<10⁵) | L1/L2 | 低 | | `saga` | 超大数据集<br>弹性网络 | L1/L2/Elastic-Net | 高 | | `sag` | 超大数据集 | L2 | 高 | > 注:多分类问题需配合`multi_class`参数(引用[2]) ### 二、学习率设置方法 sklearn 中**逻辑回归没有直接的学习率参数**,但可通过以下方式间接控制学习过程: 1. **迭代控制** ```python model = LogisticRegression( max_iter=1000, # 最大迭代次数(默认100) tol=1e-4 # 损失函数变阈值(默认1e-4) ) ``` - 增大`max_iter`允许更多学习步数 - 减小`tol`提高收敛精度 2. **正则化强度控制**(间接影响学习过程) ```python model = LogisticRegression( penalty='l2', # 正则化类型(L1/L2/elasticnet) C=0.1, # 正则强度倒数(C越小正则越强) l1_ratio=0.5 # Elastic-Net混合比例 ) ``` - `C`与学习速率成反比:$C \propto \frac{1}{\lambda}$ - `C`值越小,权重更新幅度越小(类似低学习率) 3. **梯度下降优器的学习率**(仅限`saga`/`sag`) ```python model = LogisticRegression( solver='saga', learning_rate='adaptive', # 自适应学习率 eta0=0.01 # 初始学习率 ) ``` - `learning_rate`:可选`constant`(恒定), `adaptive`(自适应) - `eta0`:初始学习率(仅`saga`/`sag`优器有效) ### 三、完整配置示例 ```python # 大数据集优配置 model = LogisticRegression( solver='saga', # 大数据集优器 penalty='elasticnet', # 弹性网络正则化 C=0.5, # 中等正则强度 l1_ratio=0.7, # L1占比70% max_iter=2000, # 增加迭代次数 learning_rate='adaptive',# 自适应学习率 eta0=0.05, # 初始学习率 tol=1e-5, # 更严格的收敛阈值 random_state=42 ) model.fit(X_train, y_train) ``` ### 关键注意事项 1. **优器选择优先级**: - 小数据集:首选`liblinear` - 大数据集:首选`saga`或`sag` - 默认场景:`lbfgs`(无需调整即可良好工作) 2. **学习率调优建议**: - 首次训练使用默认参数 - 收敛失败时先增加`max_iter` - 调整`C`值(推荐范围$[0.01, 10]$) - 最后考虑`saga`+`eta0`组合 3. **多分类扩展**(引用[2]): ```python model = LogisticRegression( multi_class='ovr', # 一对多策略 solver='newton-cg' # 牛顿法优器 ) ``` > 最佳实践:通过交叉验证选择参数组合(引用[4]中F1-score评估): > ```python > from sklearn.model_selection import GridSearchCV > param_grid = {'C': [0.1, 1, 10], 'solver': ['lbfgs', 'saga']} > grid_search = GridSearchCV(LogisticRegression(), param_grid, scoring='f1') > ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值