sklearn逻辑回归为什么要归一化

原创文章,转载请说明本文来自:《老饼讲解-机器学习》 www.bbbdata.com


目录

一、归一化对梯度下降的影响

01、下降路径的影响

02、对步长设置的影响

二、逻辑回归何时需要归一化


为什么有的人说,逻辑回归需要归一化,而有的人说逻辑回归不需要归一化呢?

他们说的都是对的,看完本文,你就知道为什么会有两种说法。

一、归一化对梯度下降的影响

我们先讲述不归一化对梯度下降法的影响,实际也就是逻辑回归需要归一化的主要原因

因为逻辑回归往往在求解过程中,使用的是梯度下降之类的算法。

以下讨论以下面的梯度下降问题为基础

求一组 w_1,w_2  令 y = w_1*x_1+w_2*x_2最小,其中x_1的范围为[-10000,10000],而 x_2 的范围为[-1,1]。


01、下降路径的影响

不做归一化的情况下,w_1调整1单位时,对  y 的影响范围为10000,而w_2 调整1单位只会影响1,即y对w1的调整非常敏感,因此,会极偏向调整w1,而忽略w2。

因此在调整同等步长的情况下,w1对w2的影响会更明显。

整个过程会成为:先调整w1,直到w1几乎不可调,再调整w2。只要迭代足够多次,这倒也没有问题。但明显的,w1,w2逐个调整比起w1,w2一起调整需要更多步数。




02、对步长设置的影响

(1) 解决不同变量需要不同步长

在梯度下降算法中,我们需要设置每次调整的步长,而不同变量需要不同步长。

对于w1,由于它的取值范围很多,微小的影响也对y影响很大,因此,我们可能设为0.00001,小步小步地调。

对于w2,我们只需设0.001可能就够了,

对于不同变量,我们需要调不同的步长,如果我们设为0.000001,则在调w2时明显过小,而设为0.001对调整w1又过大。这就麻烦了。

将所有变量的数据范围归一化到[0,1],对所有变量步长就统一

(2) 不同问题需要不同步长

另一方面,假设所有变量范围都一致,都是[-10000,10000],那么我们设为0.000001,但对另一个问题,所有变量为[-1,1],那我们设为0.001,则不同问题,我们还需要设置不同步长。

而不管原始数据范围是多少,我们统一将数据归一化为[0,1]后,我们都设为0.001就可以了,不需要针对不同问题设置不同步长。

总而言之,将数据范围统一在[0,1],对我们讨论、研究、处理问题,都有好处,不必不同问题作不同讨论。


二、逻辑回归何时需要归一化

为什么有的人说逻辑回归需要归一化,而有的人说不需要?

这个老饼认为,这种分歧主要来源于大家用的软件包不一样!


如果你用python的sklearn,不归一化试试?吃过亏后自然就乖乖做归一化啦!

而如果你用的是matlab,那你很疑惑,为什么逻辑回归也有人去做繁琐的归一化。

为什么会有这种差异呢?

主要原因在求解算法上。

sklearn默认用梯度下降,不归一化会需要更多的迭代步数。

而matlab则用牛顿法,牛顿法利用了二阶导的信息,所以在迭代速度上更加快,即使不归一化,一样可以在较少的步数内找到最优解。

总的来说,逻辑回归要不要归一化,并不是一概而定的,在不同的算法下,要求不同。

 一般我们用sklearn的话,都是需要归一化的。


相关文章

逻辑回归过拟合分析与解决方案

sklearn:一个简单的逻辑回归例子

sklearn提取逻辑回归模型系数

逻辑回归建模完整流程

### 使用 Sklearn 进行逻辑回归数据预处理 在使用 `LogisticRegression` 模型之前,适当的数据预处理对于提高模型性能至关重要。下面展示了一个完整的流程,包括加载数据、应用 KMeans 聚类进行降维以及训练逻辑回归模型。 #### 加载所需库和数据集 为了开始工作,先要引入必要的 Python 库,并获取用于实验的手写数字图像数据集合: ```python from sklearn.linear_model import LogisticRegression from sklearn.cluster import KMeans from sklearn.datasets import load_digits from sklearn.model_selection import train_test_split from sklearn.preprocessing import StandardScaler from sklearn.pipeline import make_pipeline from sklearn.metrics import accuracy_score import numpy as np ``` 接着加载 digits 数据集并查看其基本信息[^2]: ```python X, y = load_digits(return_X_y=True) print(f"Data shape: {X.shape}, Target shape: {y.shape}") ``` #### 数据标准化与聚类降维 由于不同特征可能具有不同的量纲,在执行任何机器学习任务前应该对输入变量做标准化处理。这里采用 Z-score 归一化方式使各列均值接近0而标准差等于1: ```python scaler = StandardScaler() X_scaled = scaler.fit_transform(X) # Apply k-means clustering to reduce dimensionality. n_clusters = min(32, X.shape[1]) # Limit number of clusters based on original dimensions or set manually. kmeans = KMeans(n_clusters=n_clusters).fit(X_scaled) cluster_centers = kmeans.cluster_centers_ new_features = cluster_centers[kmeans.labels_] print(f"After applying K-Means Clustering new feature matrix has shape: {new_features.shape}") ``` 通过上述操作,原始64维向量被转换成了较低维度的新表示形式(本例中最多不超过32维),这有助于简化后续建模过程中的复杂度。 #### 构造管道并拟合模型 现在可以创建一个包含所有步骤的工作流——从缩放到最终分类器的选择。在此基础上定义评估指标来衡量预测效果的好坏程度。 ```python pipeline = make_pipeline( StandardScaler(), LogisticRegression(max_iter=10000, solver='lbfgs', multi_class='multinomial') ) # Split dataset into training and testing sets. X_train, X_test, y_train, y_test = train_test_split(new_features, y, test_size=.2, random_state=42) # Fit the model using only the training data. pipeline.fit(X_train, y_train) predictions = pipeline.predict(X_test) accuracy = accuracy_score(y_true=y_test, y_pred=predictions) print(f'Accuracy after preprocessing with KMeans is {accuracy:.4f}') ``` 此段代码展示了如何利用 Scikit-Learn 的 Pipeline 功能串联起多个变换环节,并指定合适的优化算法(`solver`)及多类别策略(`multi_class`)完成整个建模周期[^1][^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值