গ্ল্যামনেট কীভাবে ব্যাখ্যা করবেন?


36

আমি প্রায় 60 পূর্বাভাসকারী ভেরিয়েবল এবং 30 টি পর্যবেক্ষণের সাথে মাল্টিভারিয়েট লিনিয়ার রিগ্রেশন মডেলটি ফিট করার চেষ্টা করছি, তাই নিয়মিত রেজিস্ট্রেশনের জন্য আমি গ্ল্যামনেট প্যাকেজটি ব্যবহার করছি কারণ পি> এন।

আমি ডকুমেন্টেশন এবং অন্যান্য প্রশ্নের মধ্য দিয়ে যাচ্ছি তবে আমি এখনও ফলাফলগুলি ব্যাখ্যা করতে পারি না, এখানে একটি নমুনা কোড রয়েছে (20 ভবিষ্যদ্বাণীকারী এবং 10 টি পর্যবেক্ষণকে সহজ করার জন্য):

আমি একটি নাম্বার সারি = সংখ্যা পর্যবেক্ষণ এবং সংখ্যা কলস = সংখ্যা পূর্বাভাসকারী এবং একটি ভেক্টর y সহ একটি ম্যাট্রিক্স এক্স তৈরি করেছি যা প্রতিক্রিয়া ভেরিয়েবলের প্রতিনিধিত্ব করে

> x=matrix(rnorm(10*20),10,20)
> y=rnorm(10)

আমি আলফাকে ডিফল্ট হিসাবে রেখে একটি গ্ল্যামনেট মডেল ফিট করি (লাসো পেনাল্টির জন্য = 1)

> fit1=glmnet(x,y)
> print(fit1)

আমি বুঝতে পারছি ল্যাম্বদা (অর্থাত্ পেনাল্টি) এর হ্রাসমান মানগুলির সাথে আমি বিভিন্ন পূর্বাভাস পাই

Call:  glmnet(x = x, y = y) 

        Df    %Dev   Lambda
  [1,]  0 0.00000 0.890700
  [2,]  1 0.06159 0.850200
  [3,]  1 0.11770 0.811500
  [4,]  1 0.16880 0.774600
   .
   .
   .
  [96,] 10 0.99740 0.010730
  [97,] 10 0.99760 0.010240
  [98,] 10 0.99780 0.009775
  [99,] 10 0.99800 0.009331
 [100,] 10 0.99820 0.008907

এখন আমি আমার বিটা মানগুলি বেছে নেওয়ার পূর্বাভাস দিচ্ছি, উদাহরণস্বরূপ, সবচেয়ে ছোট লাম্বদা মানটি দেওয়া glmnet

> predict(fit1,type="coef", s = 0.008907)

21 x 1 sparse Matrix of class "dgCMatrix"
                  1
(Intercept) -0.08872364
V1           0.23734885
V2          -0.35472137
V3          -0.08088463
V4           .         
V5           .         
V6           .         
V7           0.31127123
V8           .         
V9           .         
V10          .         
V11          0.10636867
V12          .         
V13         -0.20328200
V14         -0.77717745
V15          .         
V16         -0.25924281
V17          .         
V18          .         
V19         -0.57989929
V20         -0.22522859

পরিবর্তে আমি সঙ্গে lambda নির্বাচন করুন

cv <- cv.glmnet(x,y)
model=glmnet(x,y,lambda=cv$lambda.min)

সমস্ত ভেরিয়েবল (।) হবে।

সন্দেহ এবং প্রশ্ন:

  1. আমি কীভাবে ল্যাম্বদা চয়ন করব তা সম্পর্কে নিশ্চিত নই।
  2. আমি অন্য মডেল ফিট করার জন্য নন (।) ভেরিয়েবল ব্যবহার করা উচিত? আমার ক্ষেত্রে আমি যতটা সম্ভব ভেরিয়েবল রাখতে চাই।
  3. আমি কীভাবে পি-মান জানি, অর্থাৎ কোন পরিবর্তনশীল উল্লেখযোগ্যভাবে প্রতিক্রিয়ার পূর্বাভাস দেয়?

আমি আমার দরিদ্র পরিসংখ্যান জ্ঞানের জন্য ক্ষমা চাই! এবং কোন সাহায্যের জন্য আপনাকে ধন্যবাদ।


সম্ভবত CRAN প্যাকেজ এইচডি দেখুন , এটি উচ্চ-মাত্রিক মডেলগুলির জন্য
অনুমিতকরণ সরবরাহ করে

ব্যবহৃত পদ্ধতিগুলির সম্পূর্ণ ব্যাখ্যার জন্য আমি আপনাকে এই
কাগজটিতে

উত্তর:


40

এখানে একটি অনাদায়ী সত্য - আপনি আসলে গ্ল্যামনেটকে ল্যাম্বডার একক মূল্য দেওয়ার কথা না। এখানে ডকুমেন্টেশন থেকে :

ল্যাম্বডা (সিভি ব্যবহারের পূর্বে পূর্বাভাসের পরিবর্তে পূর্বাভাসের জন্য) এর জন্য একক মান সরবরাহ করবেন না। পরিবর্তে ল্যাম্বদা মানগুলির ক্রমহ্রাসমান ক্রম সরবরাহ করুন। গ্ল্যামনেট তার উষ্ণতার উপর নির্ভর করে গতির জন্য শুরু হয়, এবং এটি একক fi t গণনার চেয়ে প্রায় পুরো পথে দ্রুত গতিতে চলে যায়।

cv.glmnetআপনি যেমন ল্যাম্বদা চয়ন করতে সহায়তা করবেন, যেমন আপনি আপনার উদাহরণগুলিতে ইঙ্গিত করেছেন। গ্ল্যামনেট প্যাকেজটির লেখকরা cv$lambda.1seপরিবর্তে এটিকে পরামর্শ দিচ্ছেন, তবে বাস্তবে আমি উত্তরোত্তর cv$lambda.minসাফল্য পেয়েছি।

Cv.glmnet চালানোর পরে, আপনাকে গ্ল্যামনেট পুনরায় চালু করতে হবে না! গ্রিডের প্রতিটি ল্যাম্বদা cv$lambdaইতিমধ্যে চালানো হয়েছে। এই কৌশলটিকে "উষ্ণ সূচনা" বলা হয় এবং আপনি এটি সম্পর্কে এখানে আরও পড়তে পারেন । পরিচিতিটি থেকে প্যারাফ্রেসিংয়ের পরে, ওয়ার্ম স্টার্ট কৌশলটি পরবর্তী অপ্টিমাইজেশান সমস্যার (যেমন, একটি ছোট ল্যাম্বডা সহ গ্ল্যামনেট) একটি প্রাথমিক শুরুর মান হিসাবে আলাদা অপ্টিমাইজেশান সমস্যার সমাধান (যেমন, বৃহত্তর ল্যাম্বদা সহ গ্ল্যামনেট) ব্যবহার করে পুনরাবৃত্ত পদ্ধতিগুলির চলমান সময়কে হ্রাস করে eg )।

এগুলি থেকে কাঙ্ক্ষিত রানটি বের করতে cv.glmnet.fit, এটি ব্যবহার করে দেখুন:

small.lambda.index <- which(cv$lambda == cv$lambda.min)
small.lambda.betas <- cv$glmnet.fit$beta[, small.lambda.index]

পুনর্বিবেচনা (1/28/2017)

উপরের মতো গ্ল্যামনেট অবজেক্টটিতে হ্যাক করার দরকার নেই; নিতে @ নিচে alex23lemm পরামর্শ এবং পাস s = "lambda.min", s = "lambda.1se"অথবা অন্য কোনো সংখ্যা (যেমন, s = .007উভয়) coefএবং predict। মনে রাখবেন যে আপনার সহগ এবং ভবিষ্যদ্বাণীগুলি এই মানের উপর নির্ভর করে যা ক্রস বৈধকরণের দ্বারা নির্ধারিত হয়। প্রজননযোগ্যতার জন্য একটি বীজ ব্যবহার করুন! এবং ভুলে যাবেন না যে আপনি যদি একটি "s"ইন সরবরাহ না করেন coefএবং predict, আপনি এর ডিফল্ট ব্যবহার করবেন s = "lambda.1se"। একটি ছোট তথ্য পরিস্থিতিতে এটি আরও ভাল কাজ করে দেখার পরে আমি সেই ডিফল্টটিতে উষ্ণ হয়েছি।s = "lambda.1se"এছাড়াও আরও নিয়মিতকরণ সরবরাহ করার প্রবণতা রয়েছে, সুতরাং আপনি যদি আলফা> 0 এর সাথে কাজ করছেন তবে এটি আরও পার্সিমোনিয়াস মডেলের দিকে ঝুঁকবে। এর মধ্যে কোথাও যাওয়ার জন্য প্লটএলএমনেটের সাহায্যে আপনি একটি সংখ্যাসূচক মানও চয়ন করতে পারেন (x অক্ষ থেকে মানগুলি সূচিত করতে ভুলবেন না!)।


1
ধন্যবাদ! এটি সাহায্য করে ... আপনার কাছে 2 এবং 3 প্রশ্নের উত্তর থাকতে পারে?
এলিস

3
না কোন উদ্বেগ। (।) গুলি শূন্যগুলি উপস্থাপন করে। যেহেতু আপনি লাসোর সাথে গেছেন, আপনি উল্লেখ করেছেন যে আপনি "স্পার্স" সমাধান চান (অর্থাত্ প্রচুর জিরো)। আপনি যদি এই সমস্তটির মান থাকতে চান তবে আলফা = 0 সেট করুন Now এখন আপনি লাসো থেকে রিজ রিগ্রেশন এ চলে গেছেন। গ্ল্যামনেটের জন্য পি-মানগুলি ধারণামূলকভাবে জটিল। উদাহরণস্বরূপ, আপনি "লাসোর জন্য পি-মানগুলি" গুগল করেন, আপনি সাম্প্রতিক গবেষণা এবং বিতর্ক দেখতে পাবেন। এমনকি আমি একটি অ্যাকাউন্ট (উত্স অ্যামনেসিয়া) পড়েছি যেখানে লেখক যুক্তি দিয়েছিলেন যে পি-ভ্যালু লসো এবং রিজ রিগ্রেশন-এর মতো পক্ষপাতদুষ্ট রেগ্রেশনগুলির জন্য অর্থবোধ করে না।
বেন ওগোরেক

6
ন্যূনতম সিভিএম দেয় এমন ল্যাম্বডা মানের সাথে যুক্ত সহগফলগুলি বের করার বিকল্প উপায়টি নিম্নলিখিত:small.lambda.betas <- coef(cv, s = "lambda.min")
alex23lemm

1
@ বেনগোরেক, দুর্দান্ত আপডেট! আর একটি দরকারী রেফারেন্স হ'ল ফ্রেডম্যান জে, হাসটি টি, হওফ্লিং এইচ, তিবশিরানী আর। পাথওয়াইজ সমন্বয় অপটিমাইজেশন। ফলিত পরিসংখ্যানের বার্তা als 2007; 2 (1): 302-332। ( arxiv.org/pdf/0708.1485.pdf )
ডিভি_বিএন

1
@ অ্যারোজেন্নিন, সিভি.glmnet এর ল্যাম্বডা আর্গুমেন্টটি পরীক্ষা করে দেখুন: "userচ্ছিক ব্যবহারকারী দ্বারা সরবরাহ করা ল্যাম্বদা ক্রম; ডিফল্টটি ন্যূনাল, এবং গ্ল্যামনেট তার নিজস্ব ক্রম চয়ন করে" " আপনার আগ্রহের
পরিধিটি

2

প্র 1) লাম্বদা কীভাবে বেছে নেবেন সে সম্পর্কে আমি নিশ্চিত নই। প্রশ্ন 2) আমি অন্য মডেল ফিট করার জন্য নন (।) ভেরিয়েবলগুলি ব্যবহার করব? আমার ক্ষেত্রে আমি যতটা সম্ভব ভেরিয়েবল রাখতে চাই।

@ বেনগোরেকের দুর্দান্ত উত্তর অনুসারে, আপনি সাধারণত পুরো ল্যাম্বড ক্রম ব্যবহার করতে দেন, তারপরে অনুকূল সহগগুলি বের করার সময় ল্যাম্বডা .১ মান ব্যবহার করুন (আপনি যা করেছেন তার বিপরীতে)।

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

  1. নিয়মিত কোফগুলি অর্থবহ হওয়ার জন্য, আপনি নিশ্চিত হয়ে নিন যে আপনি স্পষ্টরূপে ভেরিয়েবলের গড় এবং স্টাডিভিকে আগে স্বাভাবিক করেছিলেন scale(); উপর নির্ভর করে না glmnet(standardize=T)। ন্যায্যতার জন্য দেখুন লাসোর আগে মানদণ্ডের কি আসলেই প্রয়োজনীয়? ; মূলত বড় মানগুলির সাথে একটি ভেরিয়েবল নিয়মিতকরণে অন্যায়ভাবে শাস্তি পেতে পারে।

  2. পুনরুত্পাদনযোগ্য হতে, set.seedবেশ কয়েকটি এলোমেলো-বীজ সহ চালনা করুন এবং স্থায়িত্বের জন্য নিয়মিত সহগগুলি পরীক্ষা করুন।

  3. আপনি যদি কম কঠোর নিয়মিতকরণ করতে চান অর্থাৎ আরও বেশি ভেরিয়েবল অন্তর্ভুক্ত করতে চান তবে সাধারণ রিজের পরিবর্তে আলফা <1 (অর্থাত্ সঠিক ইলাস্টিক-নেট) ব্যবহার করুন। আমি আপনাকে আলফাটি 0 থেকে 1 পর্যন্ত স্যুইপ করার পরামর্শ দিচ্ছি যদি আপনি এটি করতে চলেছেন তবে হাইপারপ্যারামিটার আলফা এবং রিগ্রেশন ত্রুটির পরিমাণ বাড়াতে আপনাকে অবশ্যই ক্রসওয়েডিয়েশন ব্যবহার করতে হবে, অর্থাত্ cv.glmnet()সরল পরিবর্তে ব্যবহার করুন glmnet():

for (alpha in c(0,.1,.3,.5,.7,.9,1)) {
  fit <- cv.glmnet(..., alpha=alpha, nfolds=...)
  # Look at the CVE at lambda.1se to find the minimum for this alpha value...
}

আপনি যদি সিভি দিয়ে এমন গ্রিডসার্ক স্বয়ংক্রিয় করতে চান তবে আপনি নিজে কোডিং করতে পারেন বা গ্ল্যামনেটের শীর্ষে ক্যারেট প্যাকেজ ব্যবহার করতে পারেন; ক্যারেট এই ভাল করে। জন্য cv.glmnet nfoldsপ্যারামিটার মান, 3 (সর্বনিম্ন) যদি আপনার ডেটা সেটটি ছোট, অথবা 5 অথবা 10 বাছাই যদি এটা বড়।

Q3) আমি কীভাবে পি-মান জানি, অর্থাৎ কোন পরিবর্তনশীল উল্লেখযোগ্যভাবে প্রতিক্রিয়ার পূর্বাভাস দেয়?

না, তারা অর্থপূর্ণ নয় । যেমন বিশদভাবে ব্যাখ্যা করা হয়েছে যে গ্ল্যামনেট মডেল থেকে রিগ্রেশন সহগের জন্য পরিসংখ্যানের সংক্ষিপ্তসার তথ্য কেন অনাকাঙ্ক্ষিত?

কেবল cv.glmnet()স্বয়ংক্রিয়ভাবে পরিবর্তনশীল নির্বাচন করতে দিন । উপরের সাবধানতা সহ। এবং অবশ্যই প্রতিক্রিয়া ভেরিয়েবলের বিতরণ স্বাভাবিক হওয়া উচিত (ধরে নিচ্ছেন আপনি ব্যবহার করছেন family='gaussian')।


খুব সহায়ক মন্তব্যের জন্য ধন্যবাদ! আমি আরও অভিজ্ঞতা পেয়েছি যে ভেরিয়েবলগুলি মানীকৃত করা নিজেই গ্ল্যামনেট (মানক = টি) ব্যবহার না করে কাজ করে বলে মনে হয়।
মিশেল

আমার সিভিজিএলএমনেটের বিটা মানগুলি সম্পর্কে ফিরে আসার বিষয়ে @ এসএমসি একটি প্রশ্ন আছে। আমি বুঝতে পারি যে চেষ্টা করা ল্যাম্বদা মানগুলির প্রতিটি গ্রিড পয়েন্টে সেগুলি বিটা মান। তবে, প্রতিটি ল্যাম্বদা মান (১) 10 ভাঁজ থেকে গড় সহগের মানগুলি (আমি 10foldCV ধরে নিলাম) ধরে রেখেছি, (২) সেরা যথার্থতা দিয়েছে এমন ভাঁজ থেকে বিটা মানগুলি, বা (3) এর সহগগুলি পুরো ডেটাসেটে আবার মডেল চালাচ্ছেন?
মিশেল
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.