R में GLM: उदाहरण के साथ सामान्यीकृत रैखिक मॉडल

विषय - सूची:

Anonim

लॉजिस्टिक रिग्रेशन क्या है?

लॉजिस्टिक रिग्रेशन का उपयोग एक वर्ग, यानी एक संभावना की भविष्यवाणी करने के लिए किया जाता है। लॉजिस्टिक रिग्रेशन बाइनरी परिणाम की सटीक भविष्यवाणी कर सकता है।

कल्पना कीजिए कि आप भविष्यवाणी करना चाहते हैं कि कई विशेषताओं के आधार पर ऋण से इनकार / स्वीकार किया गया है या नहीं। लॉजिस्टिक रिग्रेशन 0/1 फॉर्म का है। y = 0 यदि कोई ऋण अस्वीकार किया जाता है, तो y = 1 यदि स्वीकार किया जाता है।

एक लॉजिस्टिक रिग्रेशन मॉडल दो तरीकों से रैखिक रिग्रेशन मॉडल से भिन्न होता है।

  • सबसे पहले, लॉजिस्टिक रिग्रेशन केवल डिपोटोमस (बाइनरी) इनपुट को एक आश्रित चर (यानी, 0 और 1 का वेक्टर) के रूप में स्वीकार करता है।
  • दूसरे, परिणाम को एस-आकार के कारण निम्नलिखित संभावित लिंक फ़ंक्शन द्वारा सिग्मॉइड कहा जाता है :

फ़ंक्शन का आउटपुट हमेशा 0 और 1. चेक इमेज के बीच होता है

सिग्मॉइड फ़ंक्शन 0 से 1 तक मान देता है। वर्गीकरण कार्य के लिए, हमें 0 या 1 के असतत आउटपुट की आवश्यकता होती है।

निरंतर प्रवाह को असतत मान में बदलने के लिए, हम 0.5 पर एक निर्णय तय कर सकते हैं। इस सीमा से ऊपर के सभी मानों को 1 के रूप में वर्गीकृत किया गया है

इस ट्यूटोरियल में, आप सीखेंगे

  • लॉजिस्टिक रिग्रेशन क्या है?
  • सामान्यीकृत लाइनर मॉडल (GLM) कैसे बनाएं
  • चरण 1) निरंतर चर की जाँच करें
  • चरण 2) कारक चर की जाँच करें
  • चरण 3) फ़ीचर इंजीनियरिंग
  • चरण 4) सारांश आँकड़ा
  • चरण 5) ट्रेन / परीक्षण सेट
  • चरण 6) मॉडल बनाएँ
  • चरण 7) मॉडल के प्रदर्शन का आकलन करें

सामान्यीकृत लाइनर मॉडल (GLM) कैसे बनाएं

लॉजिस्टिक रिग्रेशन का वर्णन करने के लिए सेट किए गए वयस्क डेटा का उपयोग करते हैं । "वयस्क" वर्गीकरण कार्य के लिए एक महान डेटासेट है। उद्देश्य यह अनुमान लगाना है कि क्या किसी व्यक्ति की डॉलर में वार्षिक आय 50.000 से अधिक होगी। डेटासेट में 46,033 अवलोकन और दस विशेषताएं हैं:

  • उम्र: व्यक्ति की उम्र। संख्यात्मक
  • शिक्षा: व्यक्ति का शैक्षिक स्तर। कारक।
  • marital.status: व्यक्ति की वैवाहिक स्थिति। फैक्टर यानी कभी शादीशुदा, विवाहित-पति-पत्नी,…
  • लिंग: व्यक्ति का लिंग। कारक अर्थात पुरुष या स्त्री
  • आय: लक्ष्य चर। 50K से ऊपर या नीचे की आय। कारक अर्थात> 50K, <= 50K

दूसरों के बीच

library(dplyr)data_adult <-read.csv("https://raw.githubusercontent.com/guru99-edu/R-Programming/master/adult.csv")glimpse(data_adult)

आउटपुट:

Observations: 48,842Variables: 10$ x  1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15,… $ age  25, 38, 28, 44, 18, 34, 29, 63, 24, 55, 65, 36, 26… $ workclass  Private, Private, Local-gov, Private, ?, Private,… $ education  11th, HS-grad, Assoc-acdm, Some-college, Some-col… $ educational.num  7, 9, 12, 10, 10, 6, 9, 15, 10, 4, 9, 13, 9, 9, 9,… $ marital.status  Never-married, Married-civ-spouse, Married-civ-sp… $ race  Black, White, White, Black, White, White, Black,… $ gender  Male, Male, Male, Male, Female, Male, Male, Male,… $ hours.per.week  40, 50, 40, 40, 30, 30, 40, 32, 40, 10, 40, 40, 39… $ income  <=50K, <=50K, >50K, >50K, <=50K, <=50K, <=50K, >5… 

हम इस प्रकार आगे बढ़ेंगे:

  • चरण 1: निरंतर चर की जाँच करें
  • चरण 2: कारक चर की जाँच करें
  • चरण 3: फ़ीचर इंजीनियरिंग
  • चरण 4: सारांश आँकड़ा
  • चरण 5: ट्रेन / परीक्षण सेट
  • चरण 6: मॉडल बनाएँ
  • चरण 7: मॉडल के प्रदर्शन का आकलन करें
  • चरण 8: मॉडल में सुधार करें

आपका कार्य यह अनुमान लगाना है कि किस व्यक्ति का राजस्व 50K से अधिक होगा।

इस ट्यूटोरियल में, प्रत्येक कदम एक वास्तविक डेटासेट पर विश्लेषण करने के लिए विस्तृत होगा।

चरण 1) निरंतर चर की जाँच करें

पहले चरण में, आप निरंतर चर का वितरण देख सकते हैं।

continuous <-select_if(data_adult, is.numeric)summary(continuous)

कोड स्पष्टीकरण

  • निरंतर <- select_if (data_adult, is.numeric): केवल संख्यात्मक कॉलम का चयन करने के लिए dplyr लाइब्रेरी से फ़ंक्शन select_if () का उपयोग करें
  • सारांश (निरंतर): सारांश को प्रिंट करें

आउटपुट:

## X age educational.num hours.per.week## Min. : 1 Min. :17.00 Min. : 1.00 Min. : 1.00## 1st Qu.:11509 1st Qu.:28.00 1st Qu.: 9.00 1st Qu.:40.00## Median :23017 Median :37.00 Median :10.00 Median :40.00## Mean :23017 Mean :38.56 Mean :10.13 Mean :40.95## 3rd Qu.:34525 3rd Qu.:47.00 3rd Qu.:13.00 3rd Qu.:45.00## Max. :46033 Max. :90.00 Max. :16.00 Max. :99.00

उपरोक्त तालिका से, आप देख सकते हैं कि डेटा में पूरी तरह से भिन्न पैमाने हैं और घंटे हैं।

आप इसके लिए दो चरणों का पालन कर सकते हैं:

  • 1: घंटे का वितरण प्लॉट करें
  • 2: निरंतर चर का मानकीकरण करें
  1. वितरण को प्लॉट करें

चलो घंटों के वितरण पर करीब से देखें

# Histogram with kernel density curvelibrary(ggplot2)ggplot(continuous, aes(x = hours.per.week)) +geom_density(alpha = .2, fill = "#FF6666")

आउटपुट:

चर में बहुत सारे आउटलेयर हैं और अच्छी तरह से परिभाषित वितरण नहीं है। आप प्रति सप्ताह शीर्ष 0.01 प्रतिशत घंटे हटाकर इस समस्या से आंशिक रूप से निपट सकते हैं।

क्वांटाइल का मूल सिंटैक्स:

quantile(variable, percentile)arguments:-variable: Select the variable in the data frame to compute the percentile-percentile: Can be a single value between 0 and 1 or multiple value. If multiple, use this format: `c(A,B,C,… )- `A`,`B`,`C` and `… ` are all integer from 0 to 1.

हम शीर्ष 2 प्रतिशत प्रतिशत की गणना करते हैं

top_one_percent <- quantile(data_adult$hours.per.week, .99)top_one_percent

कोड स्पष्टीकरण

  • quantile (data_adult $ hours.per.week, .99): काम के समय के 99 प्रतिशत के मूल्य की गणना करें

आउटपुट:

## 99%## 80 

98 प्रतिशत आबादी प्रति सप्ताह 80 घंटे से कम काम करती है।

आप इस सीमा से ऊपर की टिप्पणियों को छोड़ सकते हैं। आप dplyr लाइब्रेरी से फ़िल्टर का उपयोग करें।

data_adult_drop <-data_adult %>%filter(hours.per.week

आउटपुट:

## [1] 45537 10 
  1. निरंतर चर का मानकीकरण करें

आप प्रत्येक कॉलम को प्रदर्शन में सुधार करने के लिए मानकीकृत कर सकते हैं क्योंकि आपके डेटा में समान पैमाने नहीं हैं। आप dplyr लाइब्रेरी से फ़ंक्शन mutate_if का उपयोग कर सकते हैं। मूल वाक्यविन्यास है:

mutate_if(df, condition, funs(function))arguments:-`df`: Data frame used to compute the function- `condition`: Statement used. Do not use parenthesis- funs(function): Return the function to apply. Do not use parenthesis for the function

आप निम्न के रूप में संख्यात्मक कॉलम को मानकीकृत कर सकते हैं:

data_adult_rescale <- data_adult_drop % > %mutate_if(is.numeric, funs(as.numeric(scale(.))))head(data_adult_rescale)

कोड स्पष्टीकरण

  • mutate_if (is.numeric, funs (स्केल)): हालत केवल संख्यात्मक कॉलम है और फ़ंक्शन स्केल है

आउटपुट:

## X age workclass education educational.num## 1 -1.732680 -1.02325949 Private 11th -1.22106443## 2 -1.732605 -0.03969284 Private HS-grad -0.43998868## 3 -1.732530 -0.79628257 Local-gov Assoc-acdm 0.73162494## 4 -1.732455 0.41426100 Private Some-college -0.04945081## 5 -1.732379 -0.34232873 Private 10th -1.61160231## 6 -1.732304 1.85178149 Self-emp-not-inc Prof-school 1.90323857## marital.status race gender hours.per.week income## 1 Never-married Black Male -0.03995944 <=50K## 2 Married-civ-spouse White Male 0.86863037 <=50K## 3 Married-civ-spouse White Male -0.03995944 >50K## 4 Married-civ-spouse Black Male -0.03995944 >50K## 5 Never-married White Male -0.94854924 <=50K## 6 Married-civ-spouse White Male -0.76683128 >50K

चरण 2) कारक चर की जाँच करें

इस कदम के दो उद्देश्य हैं:

  • प्रत्येक श्रेणीबद्ध कॉलम में स्तर की जाँच करें
  • नए स्तरों को परिभाषित करें

हम इस चरण को तीन भागों में विभाजित करेंगे:

  • श्रेणीबद्ध कॉलम चुनें
  • सूची में प्रत्येक कॉलम के बार चार्ट को स्टोर करें
  • रेखांकन प्रिंट करें

हम नीचे दिए गए कोड के साथ कारक कॉलम का चयन कर सकते हैं:

# Select categorical columnfactor <- data.frame(select_if(data_adult_rescale, is.factor))ncol(factor)

कोड स्पष्टीकरण

  • data.frame (select_if (data_adult, is.factor)): हम कारक कॉलम को डेटा फ़्रेम प्रकार में संग्रहीत करते हैं। लाइब्रेरी ggplot2 में डेटा फ्रेम ऑब्जेक्ट की आवश्यकता होती है।

आउटपुट:

## [1] 6 

डेटासेट में 6 श्रेणीबद्ध चर होते हैं

दूसरा चरण अधिक कुशल है। आप डेटा फ़्रेम फैक्टर में प्रत्येक कॉलम के लिए एक बार चार्ट प्लॉट करना चाहते हैं। यह प्रक्रिया को स्वचालित करने के लिए अधिक सुविधाजनक है, विशेष रूप से स्थिति में बहुत सारे कॉलम हैं।

library(ggplot2)# Create graph for each columngraph <- lapply(names(factor),function(x)ggplot(factor, aes(get(x))) +geom_bar() +theme(axis.text.x = element_text(angle = 90)))

कोड स्पष्टीकरण

  • lapply (): डेटासेट के सभी कॉलम में फंक्शन पास करने के लिए फंक्शन lapply () का उपयोग करें। आप आउटपुट को किसी सूची में संग्रहीत करते हैं
  • function (x): फंक्शन को प्रत्येक x के लिए प्रोसेस किया जाएगा। यहाँ x कॉलम है
  • ggplot (कारक, anes (get (x))) + geom_bar () + विषय (axis.text.x = element_text (कोण = 90)): प्रत्येक x तत्व के लिए एक बार चार्ट बनाएँ। ध्यान दें, x को एक कॉलम के रूप में वापस करने के लिए, आपको इसे गेट के अंदर शामिल करना होगा ()

अंतिम चरण अपेक्षाकृत आसान है। आप 6 ग्राफ़ मुद्रित करना चाहते हैं।

# Print the graphgraph

आउटपुट:

## [[1]]

## ## [[2]]

## ## [[3]]

## ## [[4]]

## ## [[5]]

## ## [[6]]

नोट: अगले बटन का उपयोग करके अगले ग्राफ़ पर जाएँ

चरण 3) फ़ीचर इंजीनियरिंग

शिक्षा का पुनर्गठन करें

ऊपर दिए गए ग्राफ़ से, आप देख सकते हैं कि चर शिक्षा के 16 स्तर हैं। यह पर्याप्त है, और कुछ स्तरों में अपेक्षाकृत कम संख्या में अवलोकन हैं। यदि आप इस चर से प्राप्त जानकारी को बेहतर बनाना चाहते हैं, तो आप इसे उच्च स्तर पर पुनः प्राप्त कर सकते हैं। अर्थात्, आप समान स्तर की शिक्षा के साथ बड़े समूह बनाते हैं। उदाहरण के लिए, शिक्षा का निम्न स्तर ड्रॉपआउट में परिवर्तित हो जाएगा। उच्च स्तर की शिक्षा को मास्टर में बदल दिया जाएगा।

यहाँ विस्तार है:

पुराना स्तर

नया स्तर

पूर्वस्कूली

ड्रॉप आउट

10 वीं

ड्रॉप आउट

11 वीं

ड्रॉप आउट

12 वीं

ड्रॉप आउट

1-4

ड्रॉप आउट

5 वीं 6

ड्रॉप आउट

7 वां -8 वां

ड्रॉप आउट

9

ड्रॉप आउट

एचएस-ग्रैड

हाईग्रैड

कुछ कॉलेज

समुदाय

असोक-अकाम

समुदाय

असोक-स्वर

समुदाय

स्नातक

स्नातक

मास्टर्स

मास्टर्स

स्कूल में प्रो

मास्टर्स

डॉक्टर की उपाधि

पीएचडी

recast_data <- data_adult_rescale % > %select(-X) % > %mutate(education = factor(ifelse(education == "Preschool" | education == "10th" | education == "11th" | education == "12th" | education == "1st-4th" | education == "5th-6th" | education == "7th-8th" | education == "9th", "dropout", ifelse(education == "HS-grad", "HighGrad", ifelse(education == "Some-college" | education == "Assoc-acdm" | education == "Assoc-voc", "Community",ifelse(education == "Bachelors", "Bachelors",ifelse(education == "Masters" | education == "Prof-school", "Master", "PhD")))))))

कोड स्पष्टीकरण

  • हम dplyr लाइब्रेरी से वर्ब म्यूट का उपयोग करते हैं। हम बयान के साथ शिक्षा के मूल्यों को बदलते हैं

नीचे दी गई तालिका में, आप यह देखने के लिए एक सारांश आँकड़ा बनाते हैं कि औसतन, बैचलर, मास्टर या पीएचडी तक पहुँचने के लिए कितने साल की शिक्षा (जेड-वैल्यू) लगती है।

recast_data % > %group_by(education) % > %summarize(average_educ_year = mean(educational.num),count = n()) % > %arrange(average_educ_year)

आउटपुट:

## # A tibble: 6 x 3## education average_educ_year count##   ## 1 dropout -1.76147258 5712## 2 HighGrad -0.43998868 14803## 3 Community 0.09561361 13407## 4 Bachelors 1.12216282 7720## 5 Master 1.60337381 3338## 6 PhD 2.29377644 557

वैराग्य-स्थिति

वैवाहिक स्थिति के लिए निम्न स्तर बनाना भी संभव है। निम्नलिखित कोड में आप निम्न स्तर बदलते हैं:

पुराना स्तर

नया स्तर

शादी कभी नहीं की

अविवाहित

विवाहित-जीवनसाथी-अनुपस्थित

अविवाहित

विवाहित- AF- जीवनसाथी

शादी हो ग

विवाहित-पति-पत्नी

अलग किए

अलग किए

तलाकशुदा

विधवाओं

विधवा

# Change level marryrecast_data <- recast_data % > %mutate(marital.status = factor(ifelse(marital.status == "Never-married" | marital.status == "Married-spouse-absent", "Not_married", ifelse(marital.status == "Married-AF-spouse" | marital.status == "Married-civ-spouse", "Married", ifelse(marital.status == "Separated" | marital.status == "Divorced", "Separated", "Widow")))))
आप प्रत्येक समूह के भीतर व्यक्तियों की संख्या की जांच कर सकते हैं।
table(recast_data$marital.status)

आउटपुट:

## ## Married Not_married Separated Widow## 21165 15359 7727 1286 

चरण 4) सारांश आँकड़ा

यह हमारे लक्ष्य चर के बारे में कुछ आंकड़ों की जांच करने का समय है। नीचे दिए गए ग्राफ़ में, आप उन व्यक्तियों के प्रतिशत को गिनते हैं, जिन्होंने अपना लिंग दिया 50k से अधिक कमा रहे हैं।

# Plot gender incomeggplot(recast_data, aes(x = gender, fill = income)) +geom_bar(position = "fill") +theme_classic()

आउटपुट:

अगला, जांचें कि क्या व्यक्ति की उत्पत्ति उनकी कमाई को प्रभावित करती है।

# Plot origin incomeggplot(recast_data, aes(x = race, fill = income)) +geom_bar(position = "fill") +theme_classic() +theme(axis.text.x = element_text(angle = 90))

आउटपुट:

लिंग द्वारा काम करने की संख्या।

# box plot gender working timeggplot(recast_data, aes(x = gender, y = hours.per.week)) +geom_boxplot() +stat_summary(fun.y = mean,geom = "point",size = 3,color = "steelblue") +theme_classic()

आउटपुट:

बॉक्स प्लॉट पुष्टि करता है कि काम के समय का वितरण अलग-अलग समूहों में फिट बैठता है। बॉक्स प्लॉट में, दोनों लिंगों में सजातीय अवलोकन नहीं है।

आप शिक्षा के प्रकार से साप्ताहिक कामकाजी समय के घनत्व की जांच कर सकते हैं। डिस्ट्रीब्यूशन के कई अलग-अलग विकल्प हैं। यह शायद अमेरिका में अनुबंध के प्रकार द्वारा समझाया जा सकता है।

# Plot distribution working time by educationggplot(recast_data, aes(x = hours.per.week)) +geom_density(aes(color = education), alpha = 0.5) +theme_classic()

कोड स्पष्टीकरण

  • ggplot (recast_data, anes (x = hours.per.week)): एक घनत्व प्लॉट में केवल एक ही चर की आवश्यकता होती है
  • geom_density (एन्स (रंग = शिक्षा), अल्फा = 0.5): घनत्व को नियंत्रित करने के लिए ज्यामितीय वस्तु

आउटपुट:

अपने विचारों की पुष्टि करने के लिए, आप एक-तरफ़ा एनोवा परीक्षण कर सकते हैं:

anova <- aov(hours.per.week~education, recast_data)summary(anova)

आउटपुट:

## Df Sum Sq Mean Sq F value Pr(>F)## education 5 1552 310.31 321.2 <2e-16 ***## Residuals 45531 43984 0.97## ---## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

एनोवा परीक्षा समूहों के बीच औसत के अंतर की पुष्टि करती है।

गैर linearity

मॉडल को चलाने से पहले, आप देख सकते हैं कि काम किए गए घंटों की संख्या उम्र से संबंधित है या नहीं।

library(ggplot2)ggplot(recast_data, aes(x = age, y = hours.per.week)) +geom_point(aes(color = income),size = 0.5) +stat_smooth(method = 'lm',formula = y~poly(x, 2),se = TRUE,aes(color = income)) +theme_classic()

कोड स्पष्टीकरण

  • ggplot (recast_data, anes (x = age, y = hours.per.week)): ग्राफ का सौंदर्य निर्धारित करें
  • geom_point (एन्स (रंग = आय), आकार = 0.5): डॉट प्लॉट का निर्माण
  • stat_smooth (): निम्न तर्कों के साथ ट्रेंड लाइन जोड़ें:
    • विधि = 'एलएम': रैखिक रिग्रेशन होने पर फिटेड प्लॉट को प्लॉट करें
    • सूत्र = y ~ पाली (x, 2): एक बहुपद प्रतिगमन को फ़िट करें
    • se = TRUE: मानक त्रुटि जोड़ें
    • एन्स (रंग = आय): आय द्वारा मॉडल को तोड़ें

आउटपुट:

संक्षेप में, आप साप्ताहिक कामकाजी समय और अन्य सुविधाओं के बीच गैर-रैखिकता प्रभाव को लेने के लिए मॉडल में बातचीत की शर्तों का परीक्षण कर सकते हैं। यह पता लगाना महत्वपूर्ण है कि किस स्थिति में काम करने का समय अलग है।

सह - संबंध

अगला चेक चर के बीच सहसंबंध की कल्पना करना है। आप कारक स्तर प्रकार को सांख्यिक में परिवर्तित करते हैं ताकि आप एक हीट मैप को प्लॉट कर सकें, जिसमें सहसंबंध का गुणांक हो, जो कि स्पाइडरमैन विधि के साथ गणना की गई हो।

library(GGally)# Convert data to numericcorr <- data.frame(lapply(recast_data, as.integer))# Plot the graphggcorr(corr,method = c("pairwise", "spearman"),nbreaks = 6,hjust = 0.8,label = TRUE,label_size = 3,color = "grey50")

कोड स्पष्टीकरण

  • data.frame (lapply (recast_data, as.integer)): डेटा को संख्यात्मक में कनवर्ट करें
  • ggcorr () निम्नलिखित तर्कों के साथ हीट मैप को प्लॉट करता है:
    • विधि: सहसंबंध की गणना करने की विधि
    • nbreaks = 6: ब्रेक की संख्या
    • hjust = 0.8: प्लॉट में वैरिएबल नाम की नियंत्रण स्थिति
    • लेबल = TRUE: खिड़कियों के केंद्र में लेबल जोड़ें
    • लेबल_साइज़ = 3: आकार लेबल
    • color = "grey50"): लेबल का रंग

आउटपुट:

चरण 5) ट्रेन / परीक्षण सेट

किसी भी पर्यवेक्षित मशीन लर्निंग कार्य को ट्रेन सेट और परीक्षण सेट के बीच डेटा को विभाजित करने की आवश्यकता होती है। आप ट्रेन / परीक्षण सेट बनाने के लिए अन्य पर्यवेक्षित शिक्षण ट्यूटोरियल में बनाए गए "फ़ंक्शन" का उपयोग कर सकते हैं।

set.seed(1234)create_train_test <- function(data, size = 0.8, train = TRUE) {n_row = nrow(data)total_row = size * n_rowtrain_sample <- 1: total_rowif (train == TRUE) {return (data[train_sample, ])} else {return (data[-train_sample, ])}}data_train <- create_train_test(recast_data, 0.8, train = TRUE)data_test <- create_train_test(recast_data, 0.8, train = FALSE)dim(data_train)

आउटपुट:

## [1] 36429 9
dim(data_test)

आउटपुट:

## [1] 9108 9 

चरण 6) मॉडल बनाएँ

यह देखने के लिए कि एल्गोरिथ्म कैसे प्रदर्शन करता है, आप glm () पैकेज का उपयोग करते हैं। सामान्यीकृत लीनियर मॉडल मॉडल का एक संग्रह है। मूल वाक्यविन्यास है:

glm(formula, data=data, family=linkfunction()Argument:- formula: Equation used to fit the model- data: dataset used- Family: - binomial: (link = "logit")- gaussian: (link = "identity")- Gamma: (link = "inverse")- inverse.gaussian: (link = "1/mu^2")- poisson: (link = "log")- quasi: (link = "identity", variance = "constant")- quasibinomial: (link = "logit")- quasipoisson: (link = "log")

आप सुविधाओं के एक सेट के बीच आय स्तर को विभाजित करने के लिए लॉजिस्टिक मॉडल का अनुमान लगाने के लिए तैयार हैं।

formula <- income~.logit <- glm(formula, data = data_train, family = 'binomial')summary(logit)

कोड स्पष्टीकरण

  • सूत्र <- आय ~!: फिट करने के लिए मॉडल बनाएँ
  • logit <- glm (सूत्र, डेटा = डेटा_ट्रेन, परिवार = 'द्विपद'): डेटा_ट्रेन डेटा के साथ एक लॉजिस्टिक मॉडल (परिवार = 'द्विपद') को फ़िट करें।
  • सारांश (लॉगिट): मॉडल का सारांश प्रिंट करें

आउटपुट:

#### Call:## glm(formula = formula, family = "binomial", data = data_train)## ## Deviance Residuals:## Min 1Q Median 3Q Max## -2.6456 -0.5858 -0.2609 -0.0651 3.1982#### Coefficients:## Estimate Std. Error z value Pr(>|z|)## (Intercept) 0.07882 0.21726 0.363 0.71675## age 0.41119 0.01857 22.146 < 2e-16 ***## workclassLocal-gov -0.64018 0.09396 -6.813 9.54e-12 ***## workclassPrivate -0.53542 0.07886 -6.789 1.13e-11 ***## workclassSelf-emp-inc -0.07733 0.10350 -0.747 0.45499## workclassSelf-emp-not-inc -1.09052 0.09140 -11.931 < 2e-16 ***## workclassState-gov -0.80562 0.10617 -7.588 3.25e-14 ***## workclassWithout-pay -1.09765 0.86787 -1.265 0.20596## educationCommunity -0.44436 0.08267 -5.375 7.66e-08 ***## educationHighGrad -0.67613 0.11827 -5.717 1.08e-08 ***## educationMaster 0.35651 0.06780 5.258 1.46e-07 ***## educationPhD 0.46995 0.15772 2.980 0.00289 **## educationdropout -1.04974 0.21280 -4.933 8.10e-07 ***## educational.num 0.56908 0.07063 8.057 7.84e-16 ***## marital.statusNot_married -2.50346 0.05113 -48.966 < 2e-16 ***## marital.statusSeparated -2.16177 0.05425 -39.846 < 2e-16 ***## marital.statusWidow -2.22707 0.12522 -17.785 < 2e-16 ***## raceAsian-Pac-Islander 0.08359 0.20344 0.411 0.68117## raceBlack 0.07188 0.19330 0.372 0.71001## raceOther 0.01370 0.27695 0.049 0.96054## raceWhite 0.34830 0.18441 1.889 0.05894 .## genderMale 0.08596 0.04289 2.004 0.04506 *## hours.per.week 0.41942 0.01748 23.998 < 2e-16 ***## ---## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1## ## (Dispersion parameter for binomial family taken to be 1)## ## Null deviance: 40601 on 36428 degrees of freedom## Residual deviance: 27041 on 36406 degrees of freedom## AIC: 27087#### Number of Fisher Scoring iterations: 6

हमारे मॉडल के सारांश से दिलचस्प जानकारी का पता चलता है। एक लॉजिस्टिक रिग्रेशन के प्रदर्शन का मूल्यांकन विशिष्ट कुंजी मैट्रिक्स के साथ किया जाता है।

  • AIC (Akaike Information Criteria): यह लॉजिस्टिक रिग्रेशन में R2 के बराबर है । यह फिट बैठता है जब मापदंडों की संख्या पर जुर्माना लगाया जाता है। छोटे AIC मान इंगित करते हैं कि मॉडल सत्य के करीब है।
  • अशक्त विचलन: मॉडल को केवल अवरोधन के साथ फिट करता है। स्वतंत्रता की डिग्री n-1 है। हम इसे ची-स्क्वायर मान (वास्तविक मूल्य परिकल्पना परीक्षण से अलग फिट किए गए मूल्य) के रूप में व्याख्या कर सकते हैं।
  • अवशिष्ट विचलन: सभी चर के साथ मॉडल। इसे ची-स्क्वायर परिकल्पना परीक्षण के रूप में भी समझा जाता है।
  • फिशर स्कोरिंग पुनरावृत्तियों की संख्या: अभिसरण से पहले पुनरावृत्तियों की संख्या।

Glm () फ़ंक्शन का आउटपुट एक सूची में संग्रहीत होता है। नीचे दिए गए कोड, लॉजिस्टिक चर में उपलब्ध सभी वस्तुओं को दिखाते हैं, जिनका निर्माण हमने लॉजिस्टिक रिग्रेशन का मूल्यांकन करने के लिए किया था।

# सूची बहुत लंबी है, केवल पहले तीन तत्वों को प्रिंट करें

lapply(logit, class)[1:3]

आउटपुट:

## $coefficients## [1] "numeric"#### $residuals## [1] "numeric"#### $fitted.values## [1] "numeric"

प्रत्येक मूल्य को मेट्रिक्स के नाम से $ साइन फॉलो के साथ निकाला जा सकता है। उदाहरण के लिए, आपने मॉडल को लॉगिट के रूप में संग्रहीत किया है। AIC मापदंड निकालने के लिए, आप का उपयोग करें:

logit$aic

आउटपुट:

## [1] 27086.65

चरण 7) मॉडल के प्रदर्शन का आकलन करें

असमंजस का जाल

भ्रम मैट्रिक्स वर्गीकरण प्रदर्शन विभिन्न मीट्रिक आप पहले देखा था के साथ तुलना में मूल्यांकन करने के लिए एक बेहतर विकल्प है। सामान्य विचार यह है कि संख्या को गिनना सही है उदाहरणों को वर्गीकृत किया गया है जो गलत हैं।

भ्रम मैट्रिक्स की गणना करने के लिए, आपको सबसे पहले भविष्यवाणियों का एक सेट होना चाहिए ताकि उनकी तुलना वास्तविक लक्ष्यों से की जा सके।

predict <- predict(logit, data_test, type = 'response')# confusion matrixtable_mat <- table(data_test$income, predict > 0.5)table_mat

कोड स्पष्टीकरण

  • भविष्यवाणी (लॉगिट, डेटा_टेस्ट, टाइप = 'प्रतिक्रिया'): परीक्षण सेट पर भविष्यवाणी की गणना करें। प्रतिक्रिया संभावना की गणना करने के लिए सेट प्रकार = 'प्रतिक्रिया'।
  • तालिका (data_test $ आय, पूर्वानुमान> 0.5): भ्रम मैट्रिक्स की गणना करें। पूर्वानुमान> ०.५ का अर्थ है कि यह १ लौटाता है यदि अनुमानित संभावना ०.५ से अधिक हो, तो ०।

आउटपुट:

#### FALSE TRUE## <=50K 6310 495## >50K 1074 1229

एक भ्रम मैट्रिक्स में प्रत्येक पंक्ति एक वास्तविक लक्ष्य का प्रतिनिधित्व करती है, जबकि प्रत्येक कॉलम एक अनुमानित लक्ष्य का प्रतिनिधित्व करता है। इस मैट्रिक्स की पहली पंक्ति 50k (झूठी श्रेणी) से कम आय पर विचार करती है: 6241 को 50k ( सच्चा नकारात्मक ) से कम आय वाले व्यक्तियों के रूप में सही ढंग से वर्गीकृत किया गया था, जबकि शेष को गलत तरीके से 50k ( गलत सकारात्मक ) से ऊपर वर्गीकृत किया गया था । दूसरी पंक्ति 50k से ऊपर की आय पर विचार करती है, सकारात्मक वर्ग 1229 ( ट्रू पॉजिटिव ) था, जबकि ट्रू नेगेटिव 1074 था।

आप कुल अवलोकन पर वास्तविक सकारात्मक + वास्तविक नकारात्मक को जोड़कर मॉडल सटीकता की गणना कर सकते हैं

accuracy_Test <- sum(diag(table_mat)) / sum(table_mat)accuracy_Test

कोड स्पष्टीकरण

  • sum (diag (table_mat)): विकर्ण का योग
  • sum (table_mat): मैट्रिक्स का योग।

आउटपुट:

## [1] 0.8277339 

मॉडल एक समस्या से ग्रस्त दिखाई देता है, यह झूठी नकारात्मक की संख्या को कम कर देता है। इसे सटीकता परीक्षण विरोधाभास कहा जाता है । हमने कहा कि सटीकता कुल मामलों की सही भविष्यवाणी का अनुपात है। हमारे पास अपेक्षाकृत उच्च सटीकता हो सकती है लेकिन एक बेकार मॉडल है। यह तब होता है जब एक प्रमुख वर्ग होता है। यदि आप भ्रम मैट्रिक्स को देखते हैं, तो आप देख सकते हैं कि अधिकांश मामलों को सच्चे नकारात्मक के रूप में वर्गीकृत किया गया है। अब कल्पना कीजिए, मॉडल ने सभी वर्गों को नकारात्मक (यानी 50k से कम) के रूप में वर्गीकृत किया है। आपके पास 75 प्रतिशत (6718/6718 + 2257) की सटीकता होगी। आपका मॉडल बेहतर प्रदर्शन करता है, लेकिन सच्चे सकारात्मक को वास्तविक नकारात्मक से अलग करने के लिए संघर्ष करता है।

ऐसी स्थिति में, अधिक संक्षिप्त मीट्रिक रखना बेहतर होता है। हम यहां देख सकते हैं:

  • परिशुद्धता = टीपी / (टीपी + एफपी)
  • याद करें = टीपी / (टीपी + एफएन)

सटीक बनाम याद

परिशुद्धता सकारात्मक भविष्यवाणी की सटीकता को देखती है। स्मरण सकारात्मक उदाहरणों का अनुपात है जो सही ढंग से क्लासिफायरियर द्वारा पहचाना जाता है;

आप इन दो मैट्रिक्स की गणना करने के लिए दो कार्यों का निर्माण कर सकते हैं

  1. सटीक निर्माण
precision <- function(matrix) {# True positivetp <- matrix[2, 2]# false positivefp <- matrix[1, 2]return (tp / (tp + fp))}

कोड स्पष्टीकरण

  • मैट [1,1]: डेटा फ़्रेम के पहले कॉलम की पहली सेल लौटाएं, यानी सही पॉज़िटिव
  • चटाई [1,2]; डेटा फ़्रेम के दूसरे कॉलम की पहली सेल लौटाएं, यानी गलत पॉज़िटिव
recall <- function(matrix) {# true positivetp <- matrix[2, 2]# false positivefn <- matrix[2, 1]return (tp / (tp + fn))}

कोड स्पष्टीकरण

  • मैट [1,1]: डेटा फ़्रेम के पहले कॉलम की पहली सेल लौटाएं, यानी सही पॉज़िटिव
  • चटाई [2,1]; डेटा फ़्रेम के पहले कॉलम की दूसरी सेल लौटाएँ, यानी गलत ऋणात्मक

आप अपने कार्यों का परीक्षण कर सकते हैं

prec <- precision(table_mat)precrec <- recall(table_mat)rec

आउटपुट:

## [1] 0.712877## [2] 0.5336518

जब मॉडल कहता है कि यह 50k से ऊपर का व्यक्ति है, तो यह केवल 54 प्रतिशत मामले में सही है, और 72 प्रतिशत मामले में 50k से ऊपर के व्यक्तियों का दावा कर सकता है।

आप जिसका अर्थ यह कम मूल्यों के लिए अधिक वजन देता है इन दो मीट्रिक का हरात्मक माध्य है।

f1 <- 2 * ((prec * rec) / (prec + rec))f1

आउटपुट:

## [1] 0.6103799 

प्रेसिजन बनाम रिकॉल ट्रेडऑफ़

उच्च परिशुद्धता और उच्च रिकॉल दोनों का होना असंभव है।

यदि हम सटीकता बढ़ाते हैं, तो सही व्यक्ति की बेहतर भविष्यवाणी की जाएगी, लेकिन हम उनमें से बहुतों को याद करेंगे (कम याद)। कुछ स्थिति में, हम रिकॉल की तुलना में अधिक सटीक पसंद करते हैं। परिशुद्धता और याद के बीच एक अवतल संबंध है।

  • कल्पना कीजिए, आपको यह अनुमान लगाने की आवश्यकता है कि क्या रोगी को कोई बीमारी है। आप यथासंभव सटीक होना चाहते हैं।
  • यदि आपको चेहरे की पहचान के माध्यम से गली में संभावित धोखाधड़ी करने वाले लोगों का पता लगाने की आवश्यकता है, तो परिशुद्धता कम होने के बावजूद धोखाधड़ी करने वाले कई लोगों को पकड़ना बेहतर होगा। गैर-धोखाधड़ी करने वाले व्यक्ति को पुलिस रिहा कर सकेगी।

ROC वक्र

अभिग्राही प्रचालन विशेषता वक्र द्विआधारी वर्गीकरण के साथ प्रयोग किया एक आम उपकरण है। यह परिशुद्धता / रिकॉल वक्र के समान है, लेकिन सटीक बनाम रिकॉल की साजिश रचने के बजाय, आरओसी वक्र झूठी सकारात्मक दर के विपरीत वास्तविक सकारात्मक दर (यानी, याद) को दर्शाता है। झूठी सकारात्मक दर नकारात्मक उदाहरणों का अनुपात है जिन्हें गलत तरीके से सकारात्मक रूप में वर्गीकृत किया गया है। यह एक नकारात्मक ऋणात्मक दर के बराबर है। सही नकारात्मक दर को विशिष्टता भी कहा जाता है । इसलिए आरओसी वक्र प्लॉट संवेदनशीलता (याद) बनाम 1-विशिष्टता

आरओसी वक्र की साजिश करने के लिए, हमें आरओआरसी नामक एक पुस्तकालय स्थापित करना होगा। हम कोंडा लाइब्रेरी में पा सकते हैं। आप कोड टाइप कर सकते हैं:

conda install -cr r-rocr - अयस

हम भविष्यवाणी () और प्रदर्शन () कार्यों के साथ आरओसी की साजिश कर सकते हैं।

library(ROCR)ROCRpred <- prediction(predict, data_test$income)ROCRperf <- performance(ROCRpred, 'tpr', 'fpr')plot(ROCRperf, colorize = TRUE, text.adj = c(-0.2, 1.7))

कोड स्पष्टीकरण

  • भविष्यवाणी (भविष्यवाणी, data_test $ आय): ROCR पुस्तकालय को इनपुट डेटा को बदलने के लिए एक भविष्यवाणी वस्तु बनाने की आवश्यकता है
  • प्रदर्शन (ROCRpred, 'tpr', 'fpr'): ग्राफ़ में उत्पादन करने के लिए दो संयोजनों को लौटाएँ। यहाँ, tpr और fpr का निर्माण किया जाता है। कथानक सटीक और एक साथ याद करते हैं, "पूर्व", "आरईसी" का उपयोग करें।

आउटपुट:

चरण 8) मॉडल में सुधार करें

आप बीच की बातचीत के साथ मॉडल में गैर-रैखिकता को जोड़ने का प्रयास कर सकते हैं

  • उम्र और घंटे
  • लिंग और घंटे।

दोनों मॉडल की तुलना करने के लिए आपको स्कोर टेस्ट का उपयोग करना होगा

formula_2 <- income~age: hours.per.week + gender: hours.per.week + .logit_2 <- glm(formula_2, data = data_train, family = 'binomial')predict_2 <- predict(logit_2, data_test, type = 'response')table_mat_2 <- table(data_test$income, predict_2 > 0.5)precision_2 <- precision(table_mat_2)recall_2 <- recall(table_mat_2)f1_2 <- 2 * ((precision_2 * recall_2) / (precision_2 + recall_2))f1_2

आउटपुट:

## [1] 0.6109181 

स्कोर पिछले वाले से थोड़ा अधिक है। आप डेटा पर काम कर सकते हैं ताकि स्कोर को हरा सकें।

सारांश

हम नीचे तालिका में लॉजिस्टिक प्रतिगमन को प्रशिक्षित करने के लिए फ़ंक्शन को संक्षेप में प्रस्तुत कर सकते हैं:

पैकेज

उद्देश्य

समारोह

बहस

-

ट्रेन / परीक्षण डेटासेट बनाएं

create_train_set ()

डेटा, आकार, ट्रेन

चमक

एक सामान्यीकृत मॉडल को प्रशिक्षित करें

चमक ()

सूत्र, डेटा, परिवार *

चमक

मॉडल को सारांशित करें

सारांश()

फिट मॉडल

आधार

भविष्यवाणी करना

भविष्यवाणी ()

फिट मॉडल, डाटासेट, प्रकार = 'प्रतिक्रिया'

आधार

एक उलझन मैट्रिक्स बनाएँ

तालिका ()

y, भविष्यवाणी ()

आधार

सटीकता स्कोर बनाएं

योग (डायग (तालिका)) / योग (तालिका)

ROCR

ROC बनाएँ: चरण 1 भविष्यवाणी बनाएँ

भविष्यवाणी ()

भविष्यवाणी (), y

ROCR

ROC बनाएँ: चरण 2 प्रदर्शन बनाएँ

प्रदर्शन()

भविष्यवाणी (), 'tpr', 'fpr'

ROCR

ROC बनाएं: चरण 3 प्लॉट ग्राफ

भूखंड()

प्रदर्शन()

अन्य GLM प्रकार के मॉडल हैं:

- द्विपद: (लिंक = "लॉगिट")

- गॉसियन: (लिंक = "पहचान")

- गामा: (लिंक = "उलटा")

- उलटा

- कविता: (लिंक = "लॉग")

- अर्ध: (लिंक = "पहचान", विचरण = "स्थिर")

- क्वासिबिनोमियल: (लिंक = "लॉजिट")

- क्वासिपोइसन: (लिंक = "लॉग")