লজিস্টিক রিগ্রেশন: সাইকিট ভার্সেস গ্ল্যামনেট


15

আমি আর-তে প্যাকেজ sklearnব্যবহার করে লজিস্টিক রিগ্রেশন লাইব্রেরি থেকে ফলাফলগুলি নকল করার চেষ্টা করছি glmnet

থেকে sklearnপণ্য সরবরাহ সংশ্লেষণ ডকুমেন্টেশন , এটা L2 শাস্তির অধীনে খরচ ফাংশন কমানোর জন্য চেষ্টা করছে

minw,c12wTw+ +সিΣআমি=1এনলগ(মেপুঃ(-Yআমি(এক্সআমিটিW+ +))+ +1)

এর ভিগনেটগুলি থেকে glmnet, এর প্রয়োগটি কিছুটা আলাদা ব্যয় ফাংশন হ্রাস করে

সর্বনিম্নβ,β0-[1এনΣআমি=1এনYআমি(β0+ +এক্সআমিটিβ)-লগ(1+ +(β0+ +এক্সআমিটিβ))]+ +λ[(α-1)||β||22/2+ +α||β||1]

দ্বিতীয় সমীকরণে কিছুটা টুইটের সাথে এবং α=0 ,

λসর্বনিম্নβ,β01এনλΣআমি=1এন[-Yআমি(β0+ +এক্সআমিটিβ)+ +লগ(1+ +(β0+ +এক্সআমিটিβ))]+ +||β||22/2

যা sklearnকেবলমাত্র set frac1 {N \ lambda} = C সেট করা থাকলে function ল্যাম্বডএর একটি ফ্যাক্টর দ্বারা ব্যয় ফাংশন থেকে পৃথক , তাই আমি দুটি প্যাকেজ থেকে একই গুণমানের অনুমান আশা করছিলাম। তবে এগুলি আলাদা। আমি ইউসিএলএ ইড্রি টিউটোরিয়াল থেকে ডেটাसेट ব্যবহার করছি , এর উপর ভিত্তি করে ভবিষ্যদ্বাণী করা , এবং । 400 টি পর্যবেক্ষণ রয়েছে, সুতরাং সি = 1 , \ ল্যাম্বদা = 0.0025 সহλ1এনλ=সিadmitgregparankসি=1λ=0,0025

#python sklearn
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

model = LogisticRegression(fit_intercept = False, C = 1)
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]


> # R glmnet
> df = fread("https://stats.idre.ucla.edu/stat/data/binary.csv")
> X = as.matrix(model.matrix(admit~gre+gpa+as.factor(rank), data=df))[,2:6]
> y = df[, admit]
> mylogit <- glmnet(X, y, family = "binomial", alpha = 0)
> coef(mylogit, s = 0.0025)
6 x 1 sparse Matrix of class "dgCMatrix"
                    1
(Intercept)      -3.984226893
gre               0.002216795
gpa               0.772048342
as.factor(rank)2 -0.530731081
as.factor(rank)3 -1.164306231
as.factor(rank)4 -1.354160642

Rহিসেবে দেখা যেতে পারে আউটপুট, একরকম নিয়মিতকরণ ছাড়া লজিস্টিক রিগ্রেশন পাসে হবে এখানে । আমি কি কিছু মিস করছি বা স্পষ্টতই কিছু ভুল করছি?

আপডেট: একই প্রক্রিয়াটি পরিচালনা করতে আমি LiblineaRপ্যাকেজটি ব্যবহার করার চেষ্টাও করেছি R, এবং তবুও আরও একটি পৃথক অনুমান পেয়েছি ( liblinearএছাড়াও এটি সমাধানকারীও sklearn):

> fit = LiblineaR(X, y, type = 0, cost = 1)
> print(fit)
$TypeDetail
[1] "L2-regularized logistic regression primal (L2R_LR)"
$Type
[1] 0
$W
            gre          gpa as.factor(rank)2 as.factor(rank)3 as.factor(rank)4         Bias
[1,] 0.00113215 7.321421e-06     5.354841e-07     1.353818e-06      9.59564e-07 2.395513e-06

আপডেট 2: মানায় মান বন্ধ করে glmnetদেওয়া:

> mylogit <- glmnet(X, y, family = "binomial", alpha = 0, standardize = F)
> coef(mylogit, s = 0.0025)
6 x 1 sparse Matrix of class "dgCMatrix"
                     1
(Intercept)      -2.8180677693
gre               0.0034434192
gpa               0.0001882333
as.factor(rank)2  0.0001268816
as.factor(rank)3 -0.0002259491
as.factor(rank)4 -0.0002028832

আপনি কি কখনও এটি খুঁজে বের করতে পারেন?
হুয়ে

উত্তর:


8

স্কেলেরনের লজিস্টিক রিগ্রেশন ইনপুটগুলিকে ডিফল্টরূপে মানক করে না, যা নিয়মিতকরণ শব্দটির অর্থ পরিবর্তন করে ; সম্ভবত গ্ল্যামনেট করে।এল2

বিশেষত যেহেতু আপনার greশব্দটি অন্যান্য ভেরিয়েবলের তুলনায় এত বড় আকারে রয়েছে, এটি ওজনগুলির জন্য বিভিন্ন ভেরিয়েবলগুলি ব্যবহারের তুলনামূলক ব্যয়কে পরিবর্তন করবে।

আরও মনে রাখবেন যে বৈশিষ্ট্যগুলিতে একটি সুস্পষ্ট ইন্টারসেপ্ট শব্দটি অন্তর্ভুক্ত করে আপনি মডেলের ইন্টারসেপ্টটি নিয়মিত করছেন। এটি সাধারণত করা হয় না, কারণ এর অর্থ হ'ল আপনার মডেলটি আর সমস্ত ধরণের লেবেলকে ধ্রুবকভাবে স্থানান্তরিত করতে সমাগত নয়।


glmnetইনপুটগুলির মানকে বন্ধ করার অনুমতি দেয়, তবে অনুমানযুক্ত সহগগুলি আরও আলাদা, দয়া করে উপরে দেখুন। এছাড়াও, আমি স্পষ্টভাবে ইন্টারসেপ্ট শব্দটি অন্তর্ভুক্ত করেছি sklearnকারণ glmnetএতে একটি স্বয়ংক্রিয়ভাবে অন্তর্ভুক্ত রয়েছে, সুতরাং এটি উভয় মডেলের ইনপুট একই কিনা তা নিশ্চিত হওয়া যায়।
হুরিকালে ২

2
@ হুরিকালে আমার মনে হয় গ্ল্যামনেট সম্ভবত ইন্টারসেপটি নিয়মিত করছে না, তবে স্কেলার্ন। থেকে বিরতি কলামটি ড্রপ করুন Xএবং এতে fit_intercept=True(ডিফল্ট) পাস করুন LogisticRegression। যদিও সম্ভবত আরও কিছু চলছে।
ডুগল

আমি চেষ্টা কি আপনি পরামর্শ এবং এখনো সহগ বিভিন্ন সেট করেছেন: [-1.873, -0.0606, -1.175, -1.378, 0.00182, 0.2435]জন্য sklearnএবং [-2.8181, 0.0001269, -0.0002259, -0.00020288, 0.00344, 0.000188]জন্য glmnetক্রমানুসারে [Intercept, rank_2, rank_3, rank_4, gre, gpa]। আমার উদ্বেগ হ'ল তারা উভয় প্রস্থে এবং ইতিবাচক / নেতিবাচকভাবে সম্ভাব্যতার উপর প্রভাব ফেলছে, সুতরাং কেন তারা পৃথক হয় তা না জেনে ব্যাখ্যা করার জন্য একজনকে বেছে নেওয়া শক্ত। এবং যদি কোনও সুযোগে বাস্তবায়নগুলির মধ্যে কোনও বাগ থাকে তবে এটি কোনটি নির্ভর করতে হবে তা আমি বিশেষভাবে গুরুত্বপূর্ণ।
হারিকালে

7

ডুগলের উত্তরটি সঠিক, আপনি ইন্টারসেপ্টটি sklearnআর-তে নয় তবে নিয়মিত করুন solver='newton-cg'default নিশ্চিত করুন যে আপনি ডিফল্ট সলভার ( 'liblinear') সর্বদা ইন্টারসেপ্টকে নিয়মিত করে থাকেন।

সিএফ https://github.com/scikit-learn/scikit-learn/issues/6595


সেটিং solver='newton-cg'ফলাফলগুলি sklearnএবং statsmodelsসামঞ্জস্যপূর্ণ তৈরি করেছে । অনেক ধন্যবাদ.
আয়রেন

0

এছাড়াও আপনি ব্যবহার করা উচিত L1_wt=0সহ যুক্তি alphaমধ্যে fit_regularized()কল।

এই কোডটিতে statsmodels:

import statsmodels.api as sm
res = sm.GLM(y, X, family=sm.families.Binomial()).fit_regularized(alpha=1/(y.shape[0]*C), L1_wt=0)

নিম্নলিখিত কোড থেকে সমতুল্য sklearn:

from sklearn import linear_model
clf = linear_model.LogisticRegression(C = C)
clf.fit(X, y)

আশা করি এটা সাহায্য করবে!

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.