为什么LogisticRegression每次都给出相同的结果,即使是不同的随机状态



我不是逻辑回归专家,但我认为在使用lgfgs求解时,它是在进行优化,为目标函数找到局部极小值。但每次我使用scikit-learn运行它时,它都会返回相同的结果,即使我给它提供了不同的随机状态。

下面是重现我的问题的代码。

首先通过生成数据来设置问题

import numpy as np
from sklearn.linear_model import LogisticRegression
from sklearn.model_selection import train_test_split
from sklearn import metrics
from sklearn import datasets
# generate data
X, y = datasets.make_classification(n_samples=1000, 
n_features=10, 
n_redundant=4,
n_clusters_per_class=1, 
random_state=42)

# Set up the test/training data
X_train,X_test,y_train,y_test=train_test_split(X,y,test_size=0.25)

第二,训练模型并检查结果

# Set up a different random state each time
rand_state = np.random.randint(1000)
print(rand_state)
model = LogisticRegression(max_iter=1000,
solver='lbfgs',
random_state=rand_state)
model.fit(X_train,y_train)
y_pred = model.predict(X_test)
conf_mat = metrics.confusion_matrix(y_test, y_pred)
print(y_pred[:20],"n", conf_mat)

每次运行时,我都会得到相同的y_pred(显然还有混淆矩阵(,尽管每次运行时我使用的是具有不同随机状态的lbfgs解算器。我很困惑,因为我认为这是一个随机求解器,它沿着梯度向下移动到局部最小值。

也许我没有正确地随机化初始状态?我还没能从文件中弄清楚。

有关问题的讨论

有一个相关的问题,我在研究过程中没有发现:
假设优化收敛,逻辑回归总是找到全局最优吗?

答案是代价函数是凸的,所以如果数值解表现良好,它将找到全局最小值。也就是说,你的优化算法不会陷入一堆局部最小值:它每次都会达到相同的(全局(最小值(可能取决于你选择的求解器?(。

然而,在评论中,有人指出,根据您选择的解算器,在某些情况下,您无法获得相同的解算,这取决于random_state参数。至少,我认为这将有助于解决问题。

首先,让我回答一下是什么让这个问题在前面被重复了:一个逻辑回归问题(没有完美分离(有一个全局最优,因此不存在使用不同随机种子的局部最优。如果求解器令人满意地收敛,它将在全局最优上收敛。因此,random_state唯一能产生任何影响的时间是求解器未能收敛的时候。

现在,LogisticRegression的参数random_state的文档状态为:

solver=="sag"、"saga"或"liblinear"时用于混洗数据。[…]

因此,对于您的代码,使用solver='lbfgs',确实没有预期的效果。

不难使sagsaga不能收敛,并且用不同的random_state以不同的解结束;为了更容易,请设置max_iter=1liblinear显然不使用random_state,除非求解对偶,所以设置dual=True也允许不同的解。我发现,多亏了这篇关于github问题的评论(该问题的其余部分可能值得阅读以了解更多背景信息(。

最新更新