আর ব্যবহার করে রিজ রিগ্রেশনের জন্য কে-ফোল্ড বা হোল্ড-আউট ক্রস বৈধকরণ


9

আমি 200 সাবজেক্ট এবং 1000 ভেরিয়েবলের সাথে আমার ডেটা পূর্বাভাসের ক্রস-বৈধকরণের কাজ করছি। আমি আগ্রহী রিজ রিগ্রেশনটি ভেরিয়েবলের সংখ্যা হিসাবে (আমি ব্যবহার করতে চাই) নমুনার সংখ্যার চেয়ে বেশি। সুতরাং আমি সঙ্কুচিত অনুমানকারী ব্যবহার করতে চাই। নীচে উদাহরণস্বরূপ ডেটা তৈরি করা হয়েছে:

 #random population of 200 subjects with 1000 variables 
    M <- matrix(rep(0,200*100),200,1000)
    for (i in 1:200) {
    set.seed(i)
      M[i,] <- ifelse(runif(1000)<0.5,-1,1)
    }
    rownames(M) <- 1:200

    #random yvars 
    set.seed(1234)
    u <- rnorm(1000)
    g <- as.vector(crossprod(t(M),u))
    h2 <- 0.5 
    set.seed(234)
    y <- g + rnorm(200,mean=0,sd=sqrt((1-h2)/h2*var(g)))

    myd <- data.frame(y=y, M)
myd[1:10,1:10]

y X1 X2 X3 X4 X5 X6 X7 X8 X9
1   -7.443403 -1 -1  1  1 -1  1  1  1  1
2  -63.731438 -1  1  1 -1  1  1 -1  1 -1
3  -48.705165 -1  1 -1 -1  1  1 -1 -1  1
4   15.883502  1 -1 -1 -1  1 -1  1  1  1
5   19.087484 -1  1  1 -1 -1  1  1  1  1
6   44.066119  1  1 -1 -1  1  1  1  1  1
7  -26.871182  1 -1 -1 -1 -1  1 -1  1 -1
8  -63.120595 -1 -1  1  1 -1  1 -1  1  1
9   48.330940 -1 -1 -1 -1 -1 -1 -1 -1  1
10 -18.433047  1 -1 -1  1 -1 -1 -1 -1  1

আমি ক্রস বৈধতার জন্য নিম্নলিখিতগুলি করতে চাই -

(1) ডেটা দুটি ভাগে বিভক্ত করুন - প্রথমার্ধটি প্রশিক্ষণ হিসাবে এবং দ্বিতীয়ার্ধটি পরীক্ষা হিসাবে ব্যবহার করুন

(২) কে-ফোল্ড ক্রস বৈধতা (আমার মামলার জন্য 10 টি ভাঁজ বা অন্য কোনও উপযুক্ত ভাঁজ সম্পর্কে পরামর্শ স্বাগত)

আমি কেবল ডেটাটি দুটি (লাভ এবং পরীক্ষা) এর মধ্যে নমুনা করতে পারি এবং সেগুলি ব্যবহার করতে পারি:

# using holdout (50% of the data) cross validation 
training.id <- sample(1:nrow(myd), round(nrow(myd)/2,0), replace = FALSE)
test.id <- setdiff(1:nrow(myd), training.id)

 myd_train <- myd[training.id,]
 myd_test  <- myd[test.id,]   

আমি আর প্যাকেজ lm.ridgeথেকে ব্যবহার করছি MASS

library(MASS)
out.ridge=lm.ridge(y~., data=myd_train, lambda=seq(0, 100,0.001))
plot(out.ridge)
select(out.ridge)

lam=0.001
abline(v=lam)

out.ridge1 =lm.ridge(y~., data=myd_train, lambda=lam)
hist(out.ridge1$coef)
    out.ridge1$ym
hist(out.ridge1$xm)

আমার দুটি প্রশ্ন আছে -

(1) আমি কীভাবে পরীক্ষার সেটটি পূর্বাভাস দিতে পারি এবং নির্ভুলতার গণনা করতে পারি (ভবিষ্যদ্বাণী বনাম বাস্তবের পারস্পরিক সম্পর্ক হিসাবে)?

(২) আমি কী-ভাঁজ বৈধতা কীভাবে সম্পাদন করতে পারি? বলুন 10-ভাঁজ?


1
এই প্রশ্নটি সহায়ক, আংশিক - stats.stackexchange.com/Qestions/23548/…
রাম শর্মা

4
আপনি আর তাকান পারে rmsপ্যাকেজ ols, calibrateএবং validateদ্বিঘাত দণ্ডনীয়তা (শৈলশিরা রিগ্রেশন) সঙ্গে ফাংশন।
ফ্র্যাঙ্ক হ্যারেল

@ ফ্র্যাঙ্কহারেল আমি সবার উপকারের জন্য উত্তর হিসাবে আপনার পরামর্শটি প্রসারিত করার চেষ্টা করেছি। তাকাও এখানে !
রাম শর্মা

উত্তর:


2

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

ডেটাতে সহজ বিভাজনের জন্য:

set.seed(107)
# stratified random split of the data
inTrain <- createDataPartition(y = myd$y, p = .5,list = FALSE)
training <- myd[ inTrain,]
testing <- myd[-inTrain,]

কে-ফোল্ড বৈধতা এবং ডিফল্ট বুট সহ সিভির অন্যান্য ধরণের জন্য

ridgeFit1 <- train(y ~ ., data = training,method = 'ridge', 
preProc = c("center", "scale"), metric = "ROC")
plot(ridgeFit1)

এখানেtrain ফাংশনটি কীভাবে ব্যবহার করবেন সে সম্পর্কে আলোচনা করা হচ্ছে । নোট করুন রিজ পদ্ধতিটি প্যাকেজ elasticnetফাংশনের উপর নির্ভর করে (এবং এর উপর নির্ভরতা lars, ইনস্টল করা উচিত বা হওয়া দরকার)। সিস্টেমে ইনস্টল না থাকলে আপনি এটি করতে চান কিনা জিজ্ঞাসা করবে।

পুনঃনির্মাণের ধরণটি ব্যবহৃত হয়, সাধারণ বুটস্ট্র্যাপটি ডিফল্টরূপে ব্যবহৃত হয় the পুনরায় মডেলিং পদ্ধতিটি পরিবর্তন করতে, একটি ট্রেনসন্ট্রোল ফাংশন ব্যবহৃত হয়

বিকল্প পদ্ধতি পুনরায় মডেলিংয়ের ধরণ এবং "বুট" এ ডিফল্ট নিয়ন্ত্রণ করে। পুনরাবৃত্ত কে – ভাঁজ ক্রস – যাচাইকরণ (এবং আর্গুমেন্ট পুনরাবৃত্তি পুনরাবৃত্তির সংখ্যা নিয়ন্ত্রণ করে) নির্দিষ্ট করার জন্য আরেকটি পদ্ধতি, "রিডেন্টসিভি" ব্যবহৃত হয়। কে সংখ্যাটি আর্গুমেন্ট এবং 10 এ ডিফল্ট দ্বারা নিয়ন্ত্রিত হয়।

 ctrl <- trainControl(method = "repeatedcv", repeats = 5)

 ridgeFit <- train(y ~ ., data = training,method = 'ridge',
preProc = c("center", "scale"),trControl = ctrl, metric = "ROC")

plot(ridgefit)

পূর্বাভাসের জন্য:

plsClasses <- predict(ridgeFit, newdata = testing)

4

মন্তব্যগুলিতে এটি ফ্রাঙ্কের পরামর্শকে বাড়ানো। ডঃ হ্যারেল দয়া করে আমি ভুল হলে সংশোধন করুন (সংশোধনের প্রশংসা করুন)।

আপনার তথ্য:

#random population of 200 subjects with 1000 variables 
    M <- matrix(rep(0,200*100),200,1000)
    for (i in 1:200) {
    set.seed(i)
      M[i,] <- ifelse(runif(1000)<0.5,-1,1)
    }
    rownames(M) <- 1:200

    #random yvars 
    set.seed(1234)
    u <- rnorm(1000)
    g <- as.vector(crossprod(t(M),u))
    h2 <- 0.5 
    set.seed(234)
    y <- g + rnorm(200,mean=0,sd=sqrt((1-h2)/h2*var(g)))

    myd <- data.frame(y=y, M)

rmsপ্যাকেজ ইনস্টল করুন এবং এটি লোড করুন।

require(rms)

ols সাধারণ স্বল্প স্কোয়ার ব্যবহার করে লিনিয়ার মডেল অনুমানের জন্য ফাংশন ব্যবহৃত হয় যেখানে পেনাল্টি শব্দটি নির্দিষ্ট করতে পারে।

মতামত নীচে প্রস্তাবিত হিসাবে আমি petraceফাংশন যুক্ত। এই ফাংশনটি এআইসি এবং বিআইসি বনাম দণ্ডের সন্ধান করে।

# using holdout (50% of the data) cross validation 
training.id <- sample(1:nrow(myd), round(nrow(myd)/2,0), replace = FALSE)
test.id <- setdiff(1:nrow(myd), training.id)

 myd_train <- myd[training.id,]
 myd_test  <- myd[test.id,] 

frm <- as.formula(paste("y~",paste(names(myd_train)[2:100],collapse="+")))

গুরুত্বপূর্ণ দ্রষ্টব্য আমি ভেরিয়েবলের সংখ্যা 100 এর বেশি হলে প্রোগ্রামটির অভিযোগ হিসাবে আমি সমস্ত 1000 ভেরিয়েবলগুলি ব্যবহার করতে পারিনি Also এছাড়াও y~.সূত্রের পদবি টাইপ করে না টাইপ করুন। সুতরাং একই সূত্র অবজেক্টটি তৈরি করার উপরের উপায়টি দেখুনfrm

f <- ols(frm, data = myd_train, method="qr", x=TRUE, y=TRUE)


p <- pentrace(f, seq(.2,1,by=.05))

Error in array(x, c(length(x), 1L), if (!is.null(names(x))) list(names(x),  : 
'data' must be of a vector type, was 'NULL'

 plot(p)

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

calibrateফাংশনটি মডেল ক্যালিব্রেশন পুনরায় মডেলিংয়ের জন্য এবং বুটস্ট্র্যাপিং বা ক্রস-বৈধকরণ ব্যবহার করে পূর্বাভাস বনাম পর্যায়ক্রমে পূর্বাভাসকে অন্তর্বর্তীকরণের উপর ভিত্তি করে পর্যবেক্ষণ করা মানগুলির বায়াস-সংশোধন (ওভারফিটিং-সংশোধন) অনুমান পেতে। validateফাংশন একটি রিগ্রেশন মডেল বৈধতা রীস্যাম্পেলিং নেই সহ বা অনগ্রসর পদক্ষেপ-ডাউন পরিবর্তনশীল মুছে ফেলার ছাড়া। খ = পুনরাবৃত্তির সংখ্যা। পদ্ধতির জন্য = "ক্রসওয়েডেশন", বাদ দেওয়া পর্যবেক্ষণগুলির গোষ্ঠীর সংখ্যা

cal <- calibrate(f, method = "cross validation", B=20)  
plot(cal)

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


ভাল লাগছে। এছাড়াও pentraceফাংশন ব্যবহার করুন।
ফ্রাঙ্ক হ্যারেল

@ ফ্র্যাঙ্কহারেল দেখার জন্য ধন্যবাদ। দয়া করে আমার বর্তমান সংস্করণটি একবার দেখুন, penetranceফাংশন সম্পাদন করার সময় আমি ত্রুটি সহ কয়েকটি বিষয় হিট করেছি
রাম শর্মা

আপনি নির্দিষ্ট করেন নি x=TRUE, y=TRUEকরার ols। কিন্তু pentraceযখন মডেল সম্পূর্ণরূপে ওভারফিট (শূন্যের ত্রুটি ডিএফ) হয় তখন একটি সমস্যা রয়েছে যা একটি আনপেনালাইজড pentraceমডেলটি পরীক্ষা করার চেষ্টা করে, যা রয়েছেআর2=1.0। পরবর্তী প্রকাশের জন্য rmsআমি একটি নতুন যুক্তি যুক্ত করেছি pentrace: noaddzero=TRUEচেষ্টা করার জন্য জরিমানার তালিকায় শূন্য যুক্ত না করা। নোট করুন যে সর্বোত্তম জরিমানা হিসাবে আপনার উদাহরণটি সর্বোত্তম নয়
ফ্রাঙ্ক হ্যারেল

3

আর প্যাকেজ glmnet( ভিগনেট ) এর একটি মোড়ক ফাংশন রয়েছে যা আপনি যা চান ঠিক তাই করে, ডকcv.glmnet ( ডক )। আমি গতকাল এটি ব্যবহার করেছি, এটি স্বপ্নের মতো কাজ করে।


এই প্যাকেজে আমরা কীভাবে সাধারণ রৈখিক প্রতিরোধ করতে পারি?
rdorlearn

রৈখিক রিগ্রেশনের জন্য, সেখানে cv.lmpackage:DAAG, এবং একটি GLM জন্য আছে cv.glmমধ্যে package:boot। তবে, আমি ঠিক বুঝতে পেরেছি ফ্র্যাঙ্ক হ্যারেল প্রস্তাবিত rms। মূলত তিনি যা বলেন তা আপনার করা উচিত। এটি যেহেতু আমি যেভাবেই প্রস্তাব করছি সেটির চেয়ে এটি আরও সাধারণ কাঠামোর মতো বলে মনে হচ্ছে।
শ্যাডটালকার

glmnetআকর্ষণীয় প্যাকেজ বলে মনে হচ্ছে, তথ্যের জন্য ধন্যবাদ
rdorlearn

1
@rdorlearn লিনিয়ার রিগ্রেশন হ'ল একটি GLM একটি পরিচয় লিঙ্ক ফাংশন সহ।
জো
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.