চলক নির্বাচনের জন্য আর-এ লার্স (বা গ্ল্যামনেট) প্যাকেজ থেকে ল্যাসো ব্যবহার করা Using


39

দুঃখিত যদি এই প্রশ্নটি কিছুটা মৌলিক জুড়ে আসে।

আমি আরে একাধিক লিনিয়ার রিগ্রেশন মডেলের জন্য ল্যাসো ভেরিয়েবল নির্বাচনটি ব্যবহার করতে চাইছি I আমার এবং সেট করার পরে আমি নিম্নলিখিত কমান্ডগুলি ব্যবহার করব:yxy

model = lars(x, y)
coef(model)

আমার সমস্যাটি যখন আমি ব্যবহার করি coef(model)। এটি 15 টি সারি সহ একটি ম্যাট্রিক্স প্রত্যাবর্তন করে, প্রতিবার একটি অতিরিক্ত অনুমানকারী যুক্ত করা হয় added তবে কোন মডেলটি বেছে নেবেন সে সম্পর্কে কোনও পরামর্শ নেই। আমি কিছু মিস করেছি? আমি মাত্র একটি " সেরা " মডেল ফিরে পাওয়ার জন্য লার্স প্যাকেজটি পাওয়ার কী উপায় আছে ?

glmnetপরিবর্তে অন্যান্য পোস্ট ব্যবহার করার পরামর্শ দিচ্ছে তবে এটি আরও জটিল বলে মনে হচ্ছে। একই এবং ব্যবহার করে একটি প্রচেষ্টা নিম্নরূপ । আমি কি এখানে কিছু মিস করেছি ?: yxy

cv = cv.glmnet(x, y)
model = glmnet(x, y, type.gaussian="covariance", lambda=cv$lambda.min)
predict(model, type="coefficients")

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

নেই

type.gaussian="covariance" 

যে glmnetএকাধিক লিনিয়ার রিগ্রেশন ব্যবহার করে তা নিশ্চিত করুন ?

ভেরিয়েবলগুলির স্বয়ংক্রিয় নর্মালাইজেশনটি সহগগুলি কী আদৌ প্রভাবিত করে? কোনও লাসো পদ্ধতিতে ইন্টারঅ্যাকশন শর্তাদি অন্তর্ভুক্ত করার কোনও উপায় আছে কি?

আমি এই প্রক্রিয়াটিকে আরও বেশি প্রমাণ করতে চাইছি যে কোনও মডেলের তুলনায় লাসো কীভাবে ব্যবহার করা যেতে পারে যা যদি কোনও পরিবর্তন হয় তবে বাস্তবে কোনও গুরুত্বপূর্ণ অনুমান / পূর্বাভাসের জন্য ব্যবহৃত হবে।

এটি পড়তে সময় দেওয়ার জন্য আপনাকে ধন্যবাদ। লাসো / লার্স / গ্ল্যামনেট সম্পর্কে যে কোনও সাধারণ মন্তব্যও প্রশংসিত হবে।


4
পার্শ্বের মন্তব্য হিসাবে, আপনি যদি ফলাফলটি ব্যাখ্যা করতে চান তবে লাসো দ্বারা নির্বাচিত ভেরিয়েবলগুলির সেটটি স্থিতিশীল তা প্রদর্শন করা নিশ্চিত করুন। এটি মন্টি কার্লো সিমুলেশন ব্যবহার করে বা আপনার নিজস্ব ডেটাসেট বুটস্ট্র্যাপ করে করা যেতে পারে।
ফ্রাঙ্ক হ্যারেল

উত্তর:


28

glmnetআপনি http://web.stanford.edu/~hastie/glmnet/glmnet_alpha.html এর চমৎকার ভিগনেটের ধন্যবাদ জানার পরে এটি ব্যবহার করা সত্যিই সহজ ( সেরা ল্যাম্বডা হিসাবে glmnet, থাম্ব নিয়ম ব্যবহার করা হয়

cvfit <- glmnet::cv.glmnet(x, y)
coef(cvfit, s = "lambda.1se")

পরিবর্তে lambda.min

একই কাজ larsকরতে আপনাকে এটি হাতে হাতে করতে হবে। এখানে আমার সমাধান

cv <- lars::cv.lars(x, y, plot.it = FALSE, mode = "step")
idx <- which.max(cv$cv - cv$cv.error <= min(cv$cv))
coef(lars::lars(x, y))[idx,]

মনে রাখবেন যে এটি হুবহু এক নয়, কারণ এটি কোনও পর্যায়ে পরিবর্তে লাসো গিঁটে (যখন কোনও ভেরিয়েবল প্রবেশ করবে) থামছে।

দয়া করে নোট করুন যে glmnetএটি এখন পছন্দসই প্যাকেজ, এটি সক্রিয়ভাবে রক্ষণাবেক্ষণ করা হয়, এর চেয়ে আরও বেশি larsএবং এর আগে উত্তর glmnetবনাম সম্পর্কে প্রশ্ন রয়েছে lars(এলগোরিদম পৃথক পৃথক ব্যবহৃত) used

আপনার ভেরিয়েবলগুলি চয়ন করতে এবং তারপরে ওএলএস ফিট করার জন্য লাসো ব্যবহার করার প্রশ্নে এটি একটি চলমান বিতর্ক। গুগল ওএলএস পোস্টের জন্য লাসো এবং এই বিষয় নিয়ে কিছু কাগজপত্র রয়েছে। এমনকি পরিসংখ্যান শিক্ষার উপাদানগুলির লেখকরা এটি সম্ভব বলে স্বীকার করেছেন।

সম্পাদনা : এখানে কোড আরো নিখুঁতভাবে কি নকল করা হয় glmnetমধ্যে আছেlars

  cv <- lars::cv.lars(x, y, plot.it = FALSE)
  ideal_l1_ratio <- cv$index[which.max(cv$cv - cv$cv.error <= min(cv$cv))]
  obj <- lars::lars(x, y)
  scaled_coefs <- scale(obj$beta, FALSE, 1 / obj$normx)
  l1 <- apply(X = scaled_coefs, MARGIN = 1, FUN = function(x) sum(abs(x)))
  coef(obj)[which.max(l1 / tail(l1, 1) > ideal_l1_ratio),]

+1 দুর্দান্ত উত্তর! আপনি বা কেউ সম্ভবত ল্যাম্বডা.মিনের পরিবর্তে ল্যাম্বদা .১০ এর থাম্বের বিধি কেন ব্যাখ্যা করতে পারেন?
এরোজেনিন

এটি লেখার 4 বছর পরে (এবং কিছুক্ষণের জন্য লাসো ব্যবহার না করে) আমার স্মৃতিটি কেবল হারিয়ে গেল। দুঃখিত!
জুয়ানসেন্ট্রো

8

আমি সঠিক প্রশ্নের সমাধান করেছি বলে আমি মনে করি যেহেতু আমি এই প্রশ্নটিতে ফিরে আসছি।

এখানে এম্টকার্স ডেটাসেট ব্যবহার করে একটি প্রতিলিপি দেওয়া হয়েছে:

library(glmnet)
`%ni%`<-Negate(`%in%')
data(mtcars)

x<-model.matrix(mpg~.,data=mtcars)
x=x[,-1]

glmnet1<-cv.glmnet(x=x,y=mtcars$mpg,type.measure='mse',nfolds=5,alpha=.5)

c<-coef(glmnet1,s='lambda.min',exact=TRUE)
inds<-which(c!=0)
variables<-row.names(c)[inds]
variables<-variables[variables %ni% '(Intercept)']

'ভেরিয়েবল' আপনাকে ভেরিয়েবলের তালিকা দেয় যা সেরা সমাধানটি সমাধান করে।


1
আমি কোডটির দিকে চেয়ে ছিলাম এবং আমি দেখতে পেয়েছি যে "টেস্টিং" এখনও সংজ্ঞায়িত করা হয়নি এবং তাই কোডটি: "ফাইনাল.লিস্ট <টেস্টিং [-মরেভড] # রিমুভিং ভেরিয়েবল" ত্রুটি দেয়: অবজেক্টটি পাওয়া যায় নি তাই কোডের দিকে চেয়ে দেখছি I মনে করুন যে "টেস্টিং" ব্যবহারের পরিবর্তে এটি "সিপি.লিস্ট" ব্যবহার করা উচিত যাতে কোডটি হবে: ফাইনাল.লিস্ট <-cp.list [-সরানো] # পরিবর্তনশীল চূড়ান্ত। ফাইনাল.লিস্ট <-c (ফাইনাল.লিস্ট, ডুপ্লিকেট) # এই দুটি ওয়ারে যোগ করা হয়েছে যা উভয়ই মুছে ফেলা হয়েছে পরে যুক্ত করা হয়েছে আমাকে

3
`% এন%` <-Negate ( `% এন%`); ## ভুল দেখাচ্ছে। যখন `% নি%%` <-নিগেট (% in এ% in); ## ঠিক দেখাচ্ছে। আমার মনে হয় স্ট্যাকএক্সচেঞ্জের ফর্ম্যাটরটি এতে গণ্ডগোল করেছে ...
ক্রিস

আপনি সম্প্রসারিত করতে পারেন কিভাবে আপনি বেছে নেওয়া হয়েছে nfolds=5এবং alpha=0.5পরামিতি?
কলিন

7

ফরোয়ার্ড সিলেকশন ধাপে ধাপে রিগ্রেশন সঙ্গে তুলনা সাহায্য করবে (কোনও এক লেখকের সাইটের নীচের লিঙ্কটি দেখুন http://www-stat.stanford.edu/~tibs/lasso/simple.html)। এটি স্ট্যাটিস্টিকাল লার্নিং এর উপাদানগুলির অধ্যায় 3.4.4-এ ব্যবহৃত হয়েছে (বিনামূল্যে অনলাইনে উপলব্ধ)। আমি ভেবেছিলাম যে বইয়ের Chapter. Chapter অধ্যায়টি ন্যূনতম স্কোয়ার, সেরা উপসেট এবং লাসো (আরও কয়েকটি পদ্ধতির কয়েকটি) মধ্যে সম্পর্ক বুঝতে সহায়তা করেছে। আমি সহগ, টি (কোফ (মডেল)) এবং রাইটিং সিএসভি ট্রান্সপোজ নেওয়াও সহায়ক বলে মনে করি, যাতে আমি পাশের প্লট (মডেল) এর একটি অনুলিপি সহ এক্সলে খুলতে পারি। আপনি সর্বশেষ কলামটি অনুসারে বাছাই করতে চাইতে পারেন, যার মধ্যে কমপক্ষে স্কোয়ারের প্রাক্কলন রয়েছে। তারপরে আপনি স্পষ্ট দেখতে পাচ্ছেন যে প্রতিটি পরিবর্তনশীল প্রতিটি টুকরোয় ধাপে কীভাবে যুক্ত হয় এবং ফলস্বরূপ সহগ কী পরিবর্তন হয় change অবশ্যই এটি পুরো গল্প নয়, তবে আশা করি এটি একটি শুরু হবে।


3

larsএবং glmnetকাঁচা ম্যাট্রিকগুলিতে পরিচালনা করুন। মিথস্ক্রিয়া শর্তাদি অন্তর্ভুক্ত করার জন্য, আপনাকে ম্যাট্রিকগুলি নিজেই তৈরি করতে হবে। তার অর্থ ইন্টারঅ্যাকশন প্রতি এক কলাম (আপনার উপাদানগুলি যদি প্রতিটি ফ্যাক্টর প্রতি স্তর হয়)। দেখব lm()দেখতে কিভাবে এটি এটা আছে (সতর্কতা: সেখানে ড্রাগন হতে)।

এখনই এটি করার জন্য, এমন কিছু করুন: ম্যানুয়ালি একটি ইন্টারঅ্যাকশন শব্দটি তৈরি করতে, আপনি করতে পারেন (তবে সম্ভবত এটি করা উচিত নয় , কারণ এটি ধীর):

int = D["x1"]*D["x2"]
names(int) = c("x1*x2")
D = cbind(D, int)

তারপরে লার্সে এটি ব্যবহার করতে (ধরে নিবেন আপনার yচারপাশে লাথি মারছে ):

lars(as.matrix(D), as.matrix(y))

আমি আশা করি অন্য প্রশ্নগুলির সাথে আপনাকে আরও সহায়তা করতে পারতাম। আমি এটি পেয়েছি কারণ লার্স আমাকে শোক দিচ্ছে এবং এটিতে এবং ওয়েবে ডকুমেন্টেশন খুব পাতলা।


2
"সতর্কতা: সেখানে ড্রাগন থাকতে হবে" এটি সহ বেশ সহজ model.matrix()
গ্রেগর

2

LARS পুরো সমাধানের সমাধান করে। সমাধানের পথটি বিভক্ত রৈখিক - এখানে একটি সীমাবদ্ধ সংখ্যা রয়েছে "খাঁজ" পয়েন্টগুলি (যেমন, নিয়মিতকরণের প্যারামিটারের মান) যেখানে সমাধান পরিবর্তিত হয়।

সুতরাং সমাধানগুলির ম্যাট্রিক্স হ'ল সমস্ত সম্ভাব্য সমাধান। যে তালিকাটি এটি ফিরে আসে তাতে এটি আপনাকে নিয়মিতকরণের প্যারামিটারের মানও দেয়।


আপনার উত্তর করার জন্য আপনাকে ধন্যবাদ। নিয়মিতকরণ প্যারামিটারের মানগুলি প্রদর্শনের কোনও উপায় আছে কি? অতিরিক্তভাবে এই প্যারামিটারের উপর ভিত্তি করে সমাধানগুলির মধ্যে চয়ন করার কোনও উপায় আছে? (প্যারামিটার ল্যাম্বদাও কি?)
জেমস

নোট করুন যে টুকরোখের-রেখাযুক্তির অর্থ এই নয় যে লাইনগুলি অনুভূমিক, এবং সুতরাং লাম্বদা সহ সমাধানটি সর্বদা পরিবর্তন হয়। উদাহরণস্বরূপ, ভবিষ্যদ্বাণীপূর্ণ উদ্দেশ্যে এক না শুধুমাত্র ল্যামডা মূল্যবোধের একটি গ্রিড হবে কিন্তু মধ্যবর্তী নট। এটি বেশ সম্ভব যে নটগুলির মধ্যে কিছু পয়েন্ট সবচেয়ে ভাল ভবিষ্যদ্বাণীপূর্ণ পারফরম্যান্স দেয়।
রিচার্ড হার্ডি
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.