2017-12-18 12 views
4

何らかの理由で、共変量の順序がscikit-learnのLogisticRegression分類子で問題に思えます。私は9つの共変量とバイナリ出力を持っています。カラムの順番を変えてfit()と呼んだら、predict_proba()と呼ぶと出力が異なります。LogisticRegression scikitは、トレーニングで共変量(列)の問題を学習します。

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

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

これは私には意外なようだが、多分の内部に関する知識の私の不足のthats:

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 = LogisticRegression(C=1e9, tol=1e-15) 

以下玩具の例では、異なる結果とを与えますアルゴリズムとフィット法。

私には何が欠けていますか?

EDIT:はここで完全なコードとデータである

データ:これは異なる結果を与えるので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) 

答えて

1

サンプルデータを追加していただきありがとうございます。

あなたのデータをより深く見ると、明らかに標準化されていません。 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の+、のオーダーであるだけでなく任意の妥当なレベルを超えています意義のある

+0

Grr yeh thatsは私が思っていたものですが、 solver == 'sag'または 'liblinear'のとき。これは私が 'newton-cg'を使った理由です。http://scikit-learn.org/stable/modules/generated/sklearn.linear_model.LogisticRegression.html –

+0

私は' logit_model = LogisticRegression(random_state = 0) 'で再実行するとLogisticRegression(fit_intercept = True、C = 1e9、tol = 1e-15、solver = 'newton-cg'、random_state = 0) 'を実行すると、LogisticRegression(LogisticRegression()その同じ –

+0

その場合、newton-cgをもう使用していないので意味があります。 – Grr

0

これは、両方のコードサンプルで同じことを測定しています。

我々はsklearnにクラシファイアにDataFrameを供給する場合、それはデータフレームの個々の行に列車(各行が一人の観察に相当)

だから行の順序があるため、問題ではありませんあなたが得ている出力は、特定の行が可能なクラスのそれぞれに対応する確率です。例えば

は:

array([[ 0.26117794, 0.73882206], ..])の出力は、我々は、分類器に供給される行は、クラス0にあるの〜26%の確率とクラス1この測定であるの〜74%の確率を有することを意味します個々の列について何も言わない。全体としてちょうど行。

それが役に立ったら私に教えてください。そして私は答えを明確にすることができます。

+1

私の質問は、出力の解釈や異なる行では違うのですが、それについては列の順序が 'fit'のときに違うのと同じです –

+0

コードに基づいて、出力はまったく同じです。同じ行のデータに対して出力が異なる例を教えてください。 –

+0

出力はまったく同じですか?違います。それはまったく同じでなければならないということですか? –

関連する問題