由于某种原因,协变量的顺序似乎与scikit-learn中的 LogisticRegression 分类器有关,这对我来说似乎很奇怪。我有9个协变量和一个二进制输出,当我更改列的顺序并调用fit()然后再调用predict_proba()时,输出将有所不同。下面的玩具示例

logit_model = LogisticRegression(C=1e9, tol=1e-15)

以下
logit_model.fit(df['column_2','column_1'],df['target'])
logit_model.predict_proba(df['column_2','column_1'])

array([[ 0.27387109,  0.72612891] ..])

给出以下不同的结果:
logit_model.fit(df['column_1','column_2'],df['target'])
logit_model.predict_proba(df['column_1','column_2'])

array([[ 0.26117794,  0.73882206], ..])

这对我来说似乎令人惊讶,但也许那只是我对算法内部和fit方法的知识不足。

我想念什么?

编辑:这是完整的代码和数据

数据:https://s3-us-west-2.amazonaws.com/gjt-personal/test_model.csv
import pandas as pd
from sklearn.linear_model import LogisticRegression

df = pd.read_csv('test_model.csv',index_col=False)

columns1 =['col_1','col_2','col_3','col_4','col_5','col_6','col_7','col_8','col_9']
columns2 =['col_2','col_1','col_3','col_4','col_5','col_6','col_7','col_8','col_9']

logit_model = LogisticRegression(C=1e9, tol=1e-15)

logit_model.fit(df[columns1],df['target'])
logit_model.predict_proba(df[columns1])

logit_model.fit(df[columns2],df['target'])
logit_model.predict_proba(df[columns2])

事实证明它与tol=1e-15有关,因为这会产生不同的结果。
LogisticRegression(C=1e9, tol=1e-15)

但这给出了相同的结果。
LogisticRegression(C=1e9)

最佳答案

感谢您添加示例数据。

深入了解您的数据显然是不标准化的。如果要对数据集应用 StandardScaler 并再次尝试拟合,则会发现预测差异消失了。

尽管此结果至少是一致的,但仍然令人担忧的是它引发了LineSearchWarningConvergenceWarning。我要说的是,您在1e-15上的容忍度非常低。鉴于您已经应用了很高的正则化惩罚比率(1e9),将tol降低为默认1e-4确实不会产生任何影响。这样可以使模型正确收敛,并且仍然可以产生相同的结果(运行时间要快得多)。

我的整个过程如下所示:

import numpy as np
from sklearn.preprocessing import StandardScaler
from sklearn.linear_model import LogisticRegression

ss = StandardScaler()
cols1 = np.arange(9)
cols2 = np.array([1,0,2,3,4,5,6,7,8])
X = ss.fit_transform(df.drop('target', axis=1))

lr = LogisticRegression(solver='newton-cg', tol=1e-4, C=1e9)
lr.fit(X[:, cols1], df['target'])
preds_1 = lr.predict_proba(X[:, cols1])

lr.fit(X[:, cols2], df['target'])
preds_2 = lr.predict_proba(X[:, cols2])

preds_1
array([[  0.00000000e+00,   1.00000000e+00],
       [  0.00000000e+00,   1.00000000e+00],
       [  0.00000000e+00,   1.00000000e+00],
       ...,
       [  1.00000000e+00,   9.09277801e-31],
       [  1.00000000e+00,   3.52079327e-35],
       [  1.00000000e+00,   5.99607407e-30]])

preds_2
array([[  0.00000000e+00,   1.00000000e+00],
       [  0.00000000e+00,   1.00000000e+00],
       [  0.00000000e+00,   1.00000000e+00],
       ...,
       [  1.00000000e+00,   9.09277801e-31],
       [  1.00000000e+00,   3.52079327e-35],
       [  1.00000000e+00,   5.99607407e-30]])

断言preds_1 == preds_2将失败,但是每个值的差值在1e-40 +的数量级上,我想说它远远超出了任何可能的显着性水平。

关于python - LogisticRegression scikit学习有关训练的协变量(列)顺序的问题,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/47876157/

10-12 17:40