이 두 라이브러리의 로지스틱 회귀 출력에서 다른 결과를 얻는 이유를 이해하려고합니다.
나는 idre UCLA에서 데이터 세트 사용하고 자습서를 예측, admit
기반 gre
, gpa
그리고 rank
. rank
는 범주 형 변수로 취급되므로 먼저 rank_1
삭제 된 더미 변수로 변환됩니다 . 절편 열도 추가됩니다.
df = pd.read_csv("https://stats.idre.ucla.edu/stat/data/binary.csv")
y, X = dmatrices('admit ~ gre + gpa + C(rank)', df, return_type = 'dataframe')
X.head()
> Intercept C(rank)[T.2] C(rank)[T.3] C(rank)[T.4] gre gpa
0 1 0 1 0 380 3.61
1 1 0 1 0 660 3.67
2 1 0 0 0 800 4.00
3 1 0 0 1 640 3.19
4 1 0 0 1 520 2.93
# Output from scikit-learn
model = LogisticRegression(fit_intercept = False)
mdl = model.fit(X, y)
model.coef_
> array([[-1.35417783, -0.71628751, -1.26038726, -1.49762706, 0.00169198,
0.13992661]])
# corresponding to predictors [Intercept, rank_2, rank_3, rank_4, gre, gpa]
# Output from statsmodels
logit = sm.Logit(y, X)
logit.fit().params
> Optimization terminated successfully.
Current function value: 0.573147
Iterations 6
Intercept -3.989979
C(rank)[T.2] -0.675443
C(rank)[T.3] -1.340204
C(rank)[T.4] -1.551464
gre 0.002264
gpa 0.804038
dtype: float64
의 결과 statsmodels
는 idre 웹 사이트에 표시된 것과 동일하지만 scikit-learn이 다른 계수 세트를 생성하는 이유를 모르겠습니다. 다른 손실 기능을 최소화합니까? 구현에 관한 문서가 있습니까?
glmnet
로 R 의 패키지를 사용하여 결과를 복제하려고 했지만 동일한 계수를 얻을 수 없었습니다. glmnet은 에 비해 약간 다른 비용 함수가 sklearn를 하지만, 내가 설정 한 경우에도alpha=0
에서glmnet
와 세트 (단지는 L2-페널티 킥을 사용하는 의미)1/(N*lambda)=C
, 난 여전히 같은 결과를 얻을하지 않습니다?