Hồi quy logistic: Scikit Learn vs Statsmodels


31

Tôi đang cố gắng để hiểu tại sao đầu ra từ hồi quy logistic của hai thư viện này cho kết quả khác nhau.

Tôi đang sử dụng dữ liệu từ UCLA idre hướng dẫn , dự đoán admitdựa trên gre, gparank. rankđược coi là biến phân loại, do đó, lần đầu tiên nó được chuyển đổi thành biến giả với biến rank_1. Một cột chặn cũng được thêm vào.

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

Đầu ra từ statsmodelsgiống như hiển thị trên trang web idre, nhưng tôi không chắc tại sao scikit-learn tạo ra một tập hợp các hệ số khác nhau. Liệu nó giảm thiểu một số chức năng mất khác nhau? Có tài liệu nào nêu rõ việc thực hiện không?

Câu trả lời:


28

Manh mối của bạn để tìm ra điều này phải là các ước tính tham số từ ước tính tìm hiểu scikit có độ lớn nhỏ hơn so với đối tác thống kê. Điều này có thể khiến bạn tin rằng scikit-learn áp dụng một số loại chính quy tham số. Bạn có thể xác nhận điều này bằng cách đọc tài liệu tìm hiểu scikit .

Không có cách nào để tắt tính chính quy trong scikit-learn, nhưng bạn có thể làm cho nó không hiệu quả bằng cách đặt tham số điều chỉnh Cthành một số lượng lớn. Đây là cách nó hoạt động trong trường hợp của bạn:

# module imports
from patsy import dmatrices
import pandas as pd
from sklearn.linear_model import LogisticRegression
import statsmodels.discrete.discrete_model as sm

# read in the data & create matrices
df = pd.read_csv("http://www.ats.ucla.edu/stat/data/binary.csv")
y, X = dmatrices('admit ~ gre + gpa + C(rank)', df, return_type = 'dataframe')

# sklearn output
model = LogisticRegression(fit_intercept = False, C = 1e9)
mdl = model.fit(X, y)
model.coef_

# sm
logit = sm.Logit(y, X)
logit.fit().params

Cảm ơn bạn rất nhiều vì lời giải thích! Với kết quả được chuẩn hóa này, tôi đã cố gắng nhân đôi kết quả bằng cách sử dụng glmnetgói trong R, nhưng không thể có được hệ số tương tự. glmnet có hàm chi phí hơi khác so với sklearn , nhưng ngay cả khi tôi đặt alpha=0trong glmnet(có nghĩa là chỉ sử dụng l2-phạt) và thiết lập 1/(N*lambda)=C, tôi vẫn không nhận được kết quả tương tự?
Hurrikale

Trực giác của tôi là nếu tôi chia cả hai thuật ngữ của hàm chi phí glmnetcho lambdavà đặt hằng số mới theo phông chữ của khả năng ghi nhật ký, 1/(N*lambda)bằng với sklearnhai hàm đó , hai hàm chi phí trở nên giống nhau, hoặc tôi có thiếu gì không?
Hurrikale

@hurrikale Đặt câu hỏi mới và liên kết nó ở đây, và tôi sẽ xem xét.
tchakravarty

Cảm ơn! Tôi đã đăng câu hỏi ở đây .
Hurrikale

Tôi nghĩ rằng cách tốt nhất để tắt tính chính quy trong scikit-learn là cài đặt penalty='none'.
Nzbuu

3

Một điểm khác biệt nữa là bạn đã đặt fit_intercept = false, đây thực sự là một mô hình khác. Bạn có thể thấy rằng Statsmodel bao gồm đánh chặn. Không có đánh chặn chắc chắn sẽ thay đổi trọng lượng dự kiến ​​trên các tính năng. Hãy thử những điều sau đây và xem nó so sánh như thế nào:

model = LogisticRegression(C=1e9)

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.