Sklearn逻辑回归predict_proba返回0或1。

4

我没有任何示例数据可以分享以复制问题,但也许有人可以提供一个高级别的答案。我过去创建了很多逻辑回归模型,这是第一次我的预测概率得分显示为1或0。

我正在创建一个二分类器来预测两个标签中的一个。我还使用了另外几个算法,XGBClassifier和RandomForestCalssifier与相同的数据集。对于这些,predict_proba产生了预期的概率结果(即0到1之间的浮点值)。

此外,对于LogisticRegression模型,我尝试了各种参数,包括所有默认参数,但问题仍然存在。奇怪的是,使用SGDClassifier和loss = 'log'或'modified_huber'也会产生相同的二进制predict_proba结果,因此我认为这可能是数据集固有的问题,但不确定。此外,如果我标准化训练集数据,只有在这种情况下会出现此问题。到目前为止,我已经尝试了StandardScaler和MinMaxScaler,结果相同。

是否有人遇到过这样的问题?

编辑:

LR参数如下:

LogisticRegression(C=1.7993269963183343, class_weight='balanced', dual=False,
                   fit_intercept=True, intercept_scaling=1, l1_ratio=.5,
                   max_iter=100, multi_class='warn', n_jobs=-1, penalty='elasticnet',
                   random_state=58, solver='saga', tol=0.0001, verbose=0,
                   warm_start=False)

再次强调,只有在使用 StandardScaler()MinMaxScaler() 标准化数据时才会出现问题。这很奇怪,因为所有特征的数据并不是一个统一的尺度。例如,某些特征表示为百分比,其他特征表示为美元价值,还有其他特征表示为虚拟编码。


4
有可用的代码吗?是否有np.argmax出现在某个地方? - razimbres
3
请提供您的代码样例,谢谢! - clockelliptic
2
请问您能否提供有关您尝试过的求解器、惩罚项、容差、C值和最大迭代次数的信息?我认为这对于理解您的问题至关重要。 - pythonic833
1
@pythonic833 完成。 - Negative Correlation
1
@NegativeCorrelation 还有一件事。你能把 model.coef_ 粘贴在这里吗?这样我们就可以检查哪个特征可能对效果负责了。 - pythonic833
显示剩余2条评论
1个回答

0

当您按照以下两个步骤顺序执行时,可能会发生这种情况:

  1. 使用标准化的训练数据拟合估算器,然后稍后
  2. 在验证或测试阶段将非标准化数据传递给同一估算器。

以下是使用UCI ML乳腺癌威斯康星州(诊断)数据集返回0或1的predict_proba示例:

from sklearn.datasets import load_breast_cancer
from sklearn.model_selection import train_test_split

from sklearn.pipeline import make_pipeline
from sklearn.preprocessing import StandardScaler
from sklearn.linear_model import LogisticRegression

import pandas as pd
import numpy as np



X, y = load_breast_cancer(return_X_y=True, as_frame=True)

X_train, X_test, y_train, y_test = train_test_split(X, y, train_size=0.75, random_state=123)


# Example 1 [CORRECT]
pipeline = make_pipeline(StandardScaler(), LogisticRegression())

pipeline.fit(X_train, y_train)

# Pipeline(steps=[('standardscaler', StandardScaler()), ('logisticregression', LogisticRegression())])
print(pipeline)

y_pred = pipeline.predict_proba(X_test)

# [0.37264656 0.62735344]
print(y_pred.mean(axis=0))



# Example 2 [INCORRECT]
# Fit the model with standardized training set
X_scaled = StandardScaler().fit_transform(X_train)
model = LogisticRegression()
model.fit(X_scaled, y_train)

# Test the model with unstandardized test set
y_pred = model.predict_proba(X_test)

# [1.00000000e+000 2.48303123e-204]
print(y_pred.mean(axis=0))

由于示例2中的估算器是在具有1.0单位方差的缩放数据(X_scaled)上拟合的,因此它正在测试的数据的方差(X_test)比预期高得多。因此,这会导致非常极端的概率结果,这并不令人意外。

您可以通过将估算器包含在管道内,并调用管道fit方法而不是估算器的fit方法(请参见示例1)来防止发生这种情况。以这种方式进行操作可以保证相同的转换应用于训练、验证和测试阶段的数据。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接