2017-12-18 18 views
4

어떤 이유로 공변량의 순서는 scikit-learn에서 LogisticRegression 분류 자와 관련이있는 것으로 보입니다. 이상하게 보입니다. 나는 9 개의 공변량과 2 진 출력을 가지고 있는데, 열의 순서를 바꾸고 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], ..]) 

이 나에게 놀라운 보이지만 어쩌면의 내부에 대한 지식의 내 부족 이잖아 다음

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) 

아래 장난감 예는 다른 결과로를 제공 알고리즘 및 적합 방법.

무엇이 누락 되었습니까?

편집 : 여기에 전체 코드 및 데이터입니다

데이터 :이 다른 결과를 제공하기 때문에 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 내가 생각하고 있었지만 문서에는 다음과 같이 표시되어 있습니다 : "Used 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() 그것도 동일합니다 –

+0

그럴 경우 newton-cg를 더 이상 사용하지 않습니다. – Grr

0

이 두 코드 샘플에서 같은 것을 측정합니다. 우리 sklearn의 분류에 DataFrame 공급되면

, 그것은 이후 (각 행은 하나 명의 관찰에 대응)

따라서 행의 순서가 중요하지 않은 데이터 프레임의 각 행에 열차 출력은 특정 행이 가능한 각 클래스에 해당 할 확률입니다. 예를 들어

는 :

array([[ 0.26117794, 0.73882206], ..])의 출력은 우리가 분류기에 공급되는 열이 클래스 0 인의 ~ 26 %의 확률 및 클래스 1이 측정에 빠지는의 ~ 74 %의 확률을 의미 개별 항목에 대해 아무 것도 말하지 않습니다. 전체적으로 행.

그게 도움이되는지, 내 대답을 분명히 할 수 있는지 알려주세요.

+1

내 질문에 대한 출력의 해석에 대해 또는 다른 행에 대해 다르지 않다, 그것에 대해 동일한 행에 대해 다른 '열 맞추기'의 순서가 다를 때 –

+0

코드를 기반으로, 출력은 똑같습니다. 동일한 데이터 행에 대해 출력이 다른 예제를 제공 할 수 있습니까? –

+0

출력이 정확히 동일하다는 것은 무엇을 의미합니까? 그것은 다르다. 정확히 일치해야합니까? –