आर में बहुपद प्रतिगमन (चरण दर चरण)


बहुपद प्रतिगमन एक ऐसी तकनीक है जिसका उपयोग हम तब कर सकते हैं जब एक पूर्वसूचक चर और एक प्रतिक्रिया चर के बीच संबंध अरेखीय होता है।

इस प्रकार का प्रतिगमन निम्न रूप लेता है:

वाई = β 0 + β 1 एक्स + β 2 एक्स 2 + … + β एच

जहाँ h बहुपद की “डिग्री” है।

यह ट्यूटोरियल आर में बहुपद प्रतिगमन कैसे करें इसका चरण-दर-चरण उदाहरण प्रदान करता है।

चरण 1: डेटा बनाएं

इस उदाहरण के लिए, हम एक डेटासेट बनाएंगे जिसमें 50 छात्रों की कक्षा के लिए अध्ययन किए गए घंटों की संख्या और अंतिम परीक्षा ग्रेड शामिल होगा:

 #make this example reproducible
set.seed(1)

#create dataset
df <- data.frame(hours = runif (50, 5, 15), score=50)
df$score = df$score + df$hours^3/150 + df$hours* runif (50, 1, 2)

#view first six rows of data
head(data)

      hours score
1 7.655087 64.30191
2 8.721239 70.65430
3 10.728534 73.66114
4 14.082078 86.14630
5 7.016819 59.81595
6 13.983897 83.60510

चरण 2: डेटा को विज़ुअलाइज़ करें

डेटा में एक प्रतिगमन मॉडल फिट करने से पहले, आइए पहले अध्ययन किए गए घंटों और परीक्षा स्कोर के बीच संबंध की कल्पना करने के लिए एक स्कैटरप्लॉट बनाएं:

 library (ggplot2)

ggplot(df, aes (x=hours, y=score)) +
  geom_point() 

हम देख सकते हैं कि डेटा में थोड़ा द्विघात संबंध है, जो दर्शाता है कि बहुपद प्रतिगमन सरल रैखिक प्रतिगमन की तुलना में डेटा को बेहतर ढंग से फिट कर सकता है।

चरण 3: बहुपद प्रतिगमन मॉडल फ़िट करें

इसके बाद, हम डिग्री h = 1…5 के साथ पांच अलग-अलग बहुपद प्रतिगमन मॉडल फिट करेंगे और प्रत्येक मॉडल के लिए MSE परीक्षण की गणना करने के लिए k = 10 बार के-गुना क्रॉस-सत्यापन का उपयोग करेंगे:

 #randomly shuffle data
df.shuffled <- df[ sample ( nrow (df)),]

#define number of folds to use for k-fold cross-validation
K <- 10 

#define degree of polynomials to fit
degree <- 5

#create k equal-sized folds
folds <- cut( seq (1, nrow (df.shuffled)), breaks=K, labels= FALSE )

#create object to hold MSE's of models
mse = matrix(data=NA,nrow=K,ncol=degree)

#Perform K-fold cross validation
for (i in 1:K){
    
#define training and testing data
testIndexes <- which (folds==i,arr.ind= TRUE )
    testData <- df.shuffled[testIndexes, ]
    trainData <- df.shuffled[-testIndexes, ]
    
#use k-fold cv to evaluate models
for (j in 1:degree){
        fit.train = lm (score ~ poly (hours,d), data=trainData)
        fit.test = predict (fit.train, newdata=testData)
        mse[i,j] = mean ((fit.test-testData$score)^2) 
    }
}

#find MSE for each degree 
colMeans(mse)

[1] 9.802397 8.748666 9.601865 10.592569 13.545547

परिणाम से हम प्रत्येक मॉडल के लिए एमएसई परीक्षण देख सकते हैं:

  • डिग्री एच = 1: 9.80 के साथ एमएसई परीक्षण
  • डिग्री एच = 2: 8.75 के साथ एमएसई परीक्षण
  • डिग्री एच = 3: 9.60 के साथ एमएसई परीक्षण
  • डिग्री एच = 4: 10.59 के साथ एमएसई परीक्षण
  • डिग्री एच = 5: 13.55 के साथ एमएसई परीक्षण

सबसे कम परीक्षण एमएसई वाला मॉडल डिग्री एच = 2 के साथ बहुपद प्रतिगमन मॉडल बन गया।

यह मूल स्कैटरप्लॉट से हमारे अंतर्ज्ञान से मेल खाता है: एक द्विघात प्रतिगमन मॉडल डेटा के लिए सबसे उपयुक्त है।

चरण 4: अंतिम मॉडल का विश्लेषण करें

अंत में, हम सर्वोत्तम प्रदर्शन करने वाले मॉडल के गुणांक प्राप्त कर सकते हैं:

 #fit best model
best = lm (score ~ poly (hours,2, raw= T ), data=df)

#view summary of best model
summary(best)

Call:
lm(formula = score ~ poly(hours, 2, raw = T), data = df)

Residuals:
    Min 1Q Median 3Q Max 
-5.6589 -2.0770 -0.4599 2.5923 4.5122 

Coefficients:
                         Estimate Std. Error t value Pr(>|t|)    
(Intercept) 54.00526 5.52855 9.768 6.78e-13 ***
poly(hours, 2, raw = T)1 -0.07904 1.15413 -0.068 0.94569    
poly(hours, 2, raw = T)2 0.18596 0.05724 3.249 0.00214 ** 
---
Significant. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

परिणाम से, हम देख सकते हैं कि अंतिम फिट मॉडल है:

स्कोर = 54.00526 – 0.07904*(घंटे) + 0.18596*(घंटे) 2

हम इस समीकरण का उपयोग यह अनुमान लगाने के लिए कर सकते हैं कि किसी छात्र को अध्ययन किए गए घंटों की संख्या के आधार पर कितना स्कोर मिलेगा।

उदाहरण के लिए, एक छात्र जो 10 घंटे पढ़ाई करता है उसे 71.81 का ग्रेड मिलना चाहिए:

स्कोर = 54.00526 – 0.07904*(10) + 0.18596*(10) 2 = 71.81

हम फिट किए गए मॉडल को यह देखने के लिए भी प्लॉट कर सकते हैं कि यह कच्चे डेटा में कितनी अच्छी तरह फिट बैठता है:

 ggplot(df, aes (x=hours, y=score)) + 
          geom_point() +
          stat_smooth(method=' lm ', formula = y ~ poly (x,2), size = 1) + 
          xlab(' Hours Studied ') +
          ylab(' Score ') 

आर में बहुपद प्रतिगमन

आप इस उदाहरण में प्रयुक्त पूरा आर कोड यहां पा सकते हैं।

एक टिप्पणी जोड़ने

आपका ईमेल पता प्रकाशित नहीं किया जाएगा. आवश्यक फ़ील्ड चिह्नित हैं *