library(corrplot)
library(class)
library(caret) ## machine learning package
library(rpart)
library(rpart.plot)
library(magrittr)
library(plotly)
library(ggplot2)x_train<-read.csv("/Volumes/Mac/files/x_train.csv",sep=";")
y_train<-read.csv("/Volumes/Mac/files/y_train.csv",sep=";",header =FALSE,col.names = c("ytrain") )
x_test<-read.csv("/Volumes/Mac/files/x_test.csv",sep=";")
data<-cbind(x_train,y_train)
summary(data)## maxPlayerLevel numberOfAttemptedLevels attemptsOnTheHighestLevel
## Min. : 0.00 Min. : 1.00 Min. : 1.000
## 1st Qu.: 4.00 1st Qu.: 3.00 1st Qu.: 1.000
## Median : 11.00 Median : 8.00 Median : 1.000
## Mean : 18.42 Mean : 12.42 Mean : 3.508
## 3rd Qu.: 27.00 3rd Qu.: 16.00 3rd Qu.: 3.000
## Max. :146.00 Max. :142.00 Max. :186.000
## totalNumOfAttempts averageNumOfTurnsPerCompletedLevel
## Min. : 1.00 Min. : 0.00
## 1st Qu.: 4.00 1st Qu.: 8.40
## Median : 12.00 Median :14.56
## Mean : 26.84 Mean :13.33
## 3rd Qu.: 31.00 3rd Qu.:17.72
## Max. :563.00 Max. :40.00
## doReturnOnLowerLevels numberOfBoostersUsed fractionOfUsefullBoosters
## Min. :0.0000 Min. : 0.000 Min. :0.0000
## 1st Qu.:0.0000 1st Qu.: 0.000 1st Qu.:0.0000
## Median :0.0000 Median : 2.000 Median :0.6190
## Mean :0.1524 Mean : 4.901 Mean :0.5348
## 3rd Qu.:0.0000 3rd Qu.: 6.000 3rd Qu.:1.0000
## Max. :1.0000 Max. :81.000 Max. :1.0000
## totalScore totalBonusScore totalStarsCount
## Min. : 0 Min. : 0 Min. : 0.00
## 1st Qu.: 483000 1st Qu.: 575 1st Qu.: 6.00
## Median : 1700000 Median : 1500 Median : 18.00
## Mean : 2884268 Mean : 2138 Mean : 26.88
## 3rd Qu.: 3890000 3rd Qu.: 2875 3rd Qu.: 37.00
## Max. :31338000 Max. :24275 Max. :319.00
## numberOfDaysActuallyPlayed ytrain
## Min. : 1.000 Min. :0.0000
## 1st Qu.: 1.000 1st Qu.:0.0000
## Median : 1.000 Median :0.0000
## Mean : 2.725 Mean :0.2882
## 3rd Qu.: 3.000 3rd Qu.:1.0000
## Max. :14.000 Max. :1.0000
m<-cor(data)
corrplot(m, method = "number", type = "lower",tl.col = "black", order = "hclust",tl.cex=0.5,tl.srt = 45)Дата мэдээллийн хувьд нийт 13 хувьсагч бүхий 25289 тоглогчийн мэдээлэл байна. Нийт 28289 тоглогчдын дата мэдээлэл дээр график байгуулж харахад 18001 тоглогч ахин тоглоогүй ,7288 тоглогч ахин тоглох эсэх юм. Дата мэдээлэлд өгөгдсөнөөр хамааран хувьсагч бол дараагийн 14 хоногт тухайн харилцагч уг тоглоомыг ахин тоглоно эсэх юм. Корреляцийн матрицаас харахад хамааран хувьсагч болон тайлбарлан хувьсагчдын хоорондын коррялци нь (0.1-0.58) хооронд байгаа нь бага корреялци хамааралтай харагдаж байна.
Machine learning проецесс дээрх зурганд харуулсан үе шатуудын дагуу явагддаг. Дата мэдээлэлд өгөгдсөнөөр train data дээр үндэслэн classfication алгоритмууд ашиглан загвараа байгуулах бөгөөд, байгуулсан загвараа ашиглан test датагаа таамаглаж болно.Харин дугуйлсан хэсэг болох загварын тохирол,манай загвар хэдэн хувийн зөв таамаглаж байгаа,аль загвар нь илүү таамаглаж байгаа зэргийг тодорхойлох боломжгүй байна.Учир нь бид эдгээр үр дүнг харахын тулд x_test-н таамагласан үр дүнгээ бодит үр дүн буюу(y_test) дататайгаа жиших ёстой билээ.
\[Чанарын \ утга \ бүхий \ Y-ийн \ хувьд \ ямар \ нэг \ тохиох \ магадлалыг \ тодорхойлоход \\ ашигладаг.\ Жишээ \ нь \ орон \ сууцтай \ эсэх, \ эрсдэлтэй\ зээлдэгч \ эсвэл\ эрсдэлгүй \ зээлдэгч\]
\[p(Y = 1|X)=g(\theta^TX )=\dfrac{1}{1+e^(-\theta^TX) }\ (1)\]
\[\theta^TX=\theta_0+\theta_1X_1+\theta_2X_2...+\theta_nX_n \ (2)\] \[\theta^TX \ нь \ утгаа \ авахад\ P(i) \ нь \ (0,1)\ хооронд\ утагаа\ авч \ байдаг \ функц \ юм.\]
\[p(Y = 0|X)=1-g(-\theta^TX )=\dfrac{e^(\theta^TX)}{1+e^(-\theta^TX) }\ (3)\] Машин сургалтын caret package-ийн train функцийг ашиглан ложистик регрессийн загварыг байгуулья.Дата мэдээлэлд өгөгдсөнөөр хамааран хувьсагч бол дараагийн 14 хоногт тухайн харилцагч уг тоглоомыг ахин тоглох эсэх юм. Ложистик регрессийн хувьд тархалт нь бином тархалттай учир зааж өгөв
data$ytrain<-ifelse(data$ytrain > 0, "тоглоно", "тоглохгүй")
logit_model <- train(ytrain~ ., method = "glm",data = data,family = binomial() )
logit_model## Generalized Linear Model
##
## 25289 samples
## 12 predictor
## 2 classes: 'тоглоно', 'тоглохгүй'
##
## No pre-processing
## Resampling: Bootstrapped (25 reps)
## Summary of sample sizes: 25289, 25289, 25289, 25289, 25289, 25289, ...
## Resampling results:
##
## Accuracy Kappa
## 0.8238233 0.5328666
##
## Call: NULL
##
## Coefficients:
## (Intercept) maxPlayerLevel
## 3.349e+00 -1.375e-02
## numberOfAttemptedLevels attemptsOnTheHighestLevel
## -1.000e-02 3.671e-04
## totalNumOfAttempts averageNumOfTurnsPerCompletedLevel
## -2.189e-03 -6.213e-02
## doReturnOnLowerLevels numberOfBoostersUsed
## 2.943e-01 5.360e-02
## fractionOfUsefullBoosters totalScore
## -1.170e-02 -2.834e-08
## totalBonusScore totalStarsCount
## 1.415e-03 -1.175e-01
## numberOfDaysActuallyPlayed
## -3.612e-01
##
## Degrees of Freedom: 25288 Total (i.e. Null); 25276 Residual
## Null Deviance: 30370
## Residual Deviance: 20170 AIC: 20200
Ложистик регрессийн загварын үр дүнгээс үзэхэд - doReturnOnLowerLevels – өмнө давж байсан үеээ ахин тоглох - totalBonusScore – нийт бонус оноо - attemptsOnTheHighestLevel – хамгийн сүүлийн үеийг хэдэн удаа оролдсон - numberOfBoostersUsed – нийт ашиглсан booster-н тоо зэрэг хувьсагчдын утга нэмэгдэхэд тоглогч дараагийн 14 хоногт тоглох магадлал буурах буюу эдгээр хувьсагч нь тоглогч дараагийн 14 хоногт тоглох магадлалд сөрөг нөлөөтэй хувьсагч байна. Accuracy =0.8223609 энэ нь байгуулсан загвар дэээрээ ахин x_train датаг таамаглаад гарсан үр дүнг нь бодит y_train дататай жишсэн үзүүлэлт юм. Байгуулсан загвар дээрээ x_train дата мэдээллийг таамаглахад 82%-тай таамаглаж байна гэсэн үг. Доорх кодон дээр өөр байдлаар бичин гаргав.
#Байгуулсан загвар дээрээ x_train датагаа үнэлэх
predic <- predict(logit_model, x_train)
y<-as.factor(predic)
data$ytrain<-as.factor(data$ytrain)
#Үнэлсэн датагаа бодит y_train дататай харьцуулах
confusionMatrix(y,data$ytrain )## Confusion Matrix and Statistics
##
## Reference
## Prediction тоглоно тоглохгүй
## тоглоно 4056 1260
## тоглохгүй 3232 16741
##
## Accuracy : 0.8224
## 95% CI : (0.8176, 0.8271)
## No Information Rate : 0.7118
## P-Value [Acc > NIR] : < 2.2e-16
##
## Kappa : 0.5291
##
## Mcnemar's Test P-Value : < 2.2e-16
##
## Sensitivity : 0.5565
## Specificity : 0.9300
## Pos Pred Value : 0.7630
## Neg Pred Value : 0.8382
## Prevalence : 0.2882
## Detection Rate : 0.1604
## Detection Prevalence : 0.2102
## Balanced Accuracy : 0.7433
##
## 'Positive' Class : тоглоно
##
## .
## тоглоно тоглохгүй
## 5250 20039
Байгуулсан logit_model загвар дээр x_test датаг үнэлэн 14 хоногт тухайн харилцагч уг тоглоомыг ахин тоглох эсэхийг таамаглан үзүүлэв.Таамаглалаас үзэхэд нийт 25289 тоглогчийн 5250 ахин тоглоно ,20039 ахин тоглохгүй гэж таамагласан байна.
Тодорхой бус үр дүнг тооцон шийдвэрийн үр дүнг дэс дараалсан байдлаар харуулдаг. Энэ нь анхдагч үзэгдэл буюу анхны шийдвэрээс эхлэн төрөл бүрийн арга зам болон гарч болох үзэгдлийн үр дүнг загварчилна. Шийдвэрийн мод нь хувилбарууд дотроос хамгийн үр дүнтэй чиглэлийг сонгоход ашиглагддаг. Шийдвэрийн мод нь хувилбар тус бүрээр үр дүнг жиших, түүнийг байж болох магадлалуудаар нь засч залруулах, дараа нь харьцуулж, оновчтойг нь сонгон шийдвэр гаргах боломж олгодог.
data$ytrain<-factor(data$ytrain)
decision.model <- train(ytrain~ ., method = "rpart", data = data )
decision.model## CART
##
## 25289 samples
## 12 predictor
## 2 classes: 'тоглоно', 'тоглохгүй'
##
## No pre-processing
## Resampling: Bootstrapped (25 reps)
## Summary of sample sizes: 25289, 25289, 25289, 25289, 25289, 25289, ...
## Resampling results across tuning parameters:
##
## cp Accuracy Kappa
## 0.007546652 0.8267566 0.5609836
## 0.024835346 0.8195483 0.5573636
## 0.354006586 0.7417494 0.1788575
##
## Accuracy was used to select the optimal model using the largest value.
## The final value used for the model was cp = 0.007546652.
## n= 25289
##
## node), split, n, loss, yval, (yprob)
## * denotes terminal node
##
## 1) root 25289 7288 тоглохгүй (0.2881885 0.7118115)
## 2) numberOfDaysActuallyPlayed>=2.5 8246 2833 тоглоно (0.6564395 0.3435605)
## 4) totalNumOfAttempts>=45.5 4291 874 тоглоно (0.7963179 0.2036821) *
## 5) totalNumOfAttempts< 45.5 3955 1959 тоглоно (0.5046776 0.4953224)
## 10) numberOfDaysActuallyPlayed>=3.5 2041 821 тоглоно (0.5977462 0.4022538) *
## 11) numberOfDaysActuallyPlayed< 3.5 1914 776 тоглохгүй (0.4054336 0.5945664) *
## 3) numberOfDaysActuallyPlayed< 2.5 17043 1875 тоглохгүй (0.1100158 0.8899842) *
## .
## тоглоно тоглохгүй
## 6272 19017
Шийдвэрийн модны загвараас харахад нийт тоглосон хоногийн тоо 3 аас их бол ахин тоглох магадлал нь 33% тай байна. Нийт тоглосон хоногийн тоо 3 аас бага бол тоглохгүй байх магадлал нь 67% тай байна.Нийт тоглосон хоногийн тоо 3 аас их ба нийт оролдлогын тоо 46 аас их бол ахин тоглох магадлал 17 % тай байна.Нийт оролдлогын тоо 46 өөс бага ба тоглосон хоногийн тоо 4 өөс бага бол тоглохгүй байх магадлал 8% байна. Нийт оролдлогын тоо 46 аас бага ба тоглосон хоногийн тоо 4өөс их бол тоглох магадлал 8% байна.
Naive Bayes алгоритм нь Bayes-ийн томьёог ашигладаг бөгөөд A болон B үзэгдлийн нөхцөлт магадлалыг дараах томьёогоор олно.
\[P(A \cup B)=P(A,B)=P(A)P(B|A) =P(B)P(A|B)\] \[P(B|A)=\dfrac{P(B)P(A|B)}{P(A)}\]
Bayes-ийн нөхцөлт магадлал нь А үзэгдэл илрэхэд В үзэгдлийн илэрэх магадлал юм. Naive Bayes алгоритм дээр энэхүү нөхцөлт магадлалыг өргөтгсөн байдлаар авч үзэн тооцоолдог.
\[ n \ ширхэг \ X_1,X_2,...X_n \ таамаглан \ хувьсагч \ өгөгдөхөд \ гаралтын \ үр \ дүнд \ харгалзах \\ C_1,C_2...C_k \ хүртэлх \ к \ ширхэг \ нөхцөлт \ ангилал \ үүснэ. Өргөтгөсөн\\ нөхцөлт \ магадлалын \ теором \ нь \ дараах \ байдалтай \ бичигдэнэ \] \[P(C_k|x_1,x_2,....,x_n)=\dfrac{P(C_k)P(x_1,x_2,....,x_n|C_k)}{P(x_1,x_2,....,x_n)}\]
bayes.model = train(ytrain~ .,
method="nb",
data = data,
trControl=trainControl(method='cv',number=2)
)
table(predict(bayes.model,x_train))##
## тоглоно тоглохгүй
## 5796 19493
Naive Bayes загварын таамаглалаас үзэхэд нийт тоглогчийн 5796 ахин тоглон 19493 ахин тоглохгүй гэж таамагласан байна.
kfoldcv <- trainControl(method="cv", number=2)
performance_metric <- "Accuracy"
logit_model <- train(ytrain~ ., method = "glm", data = data,family = binomial(), metric=performance_metric,trControl=kfoldcv)
decision.model <- train(ytrain~ ., method = "rpart",data = data, metric=performance_metric ,trControl=kfoldcv)
bayes.model = train(ytrain~ ., method="nb",data = data, metric=performance_metric,trControl=kfoldcv)
results <- resamples(list(nb=bayes.model,rpart=decision.model,glm=logit_model))
summary(results)##
## Call:
## summary.resamples(object = results)
##
## Models: nb, rpart, glm
## Number of resamples: 2
##
## Accuracy
## Min. 1st Qu. Median Mean 3rd Qu. Max. NA's
## nb 0.8180308 0.8189368 0.8198427 0.8198427 0.8207486 0.8216545 0
## rpart 0.8268090 0.8273394 0.8278699 0.8278699 0.8284003 0.8289307 0
## glm 0.8215755 0.8217371 0.8218988 0.8218988 0.8220605 0.8222222 0
##
## Kappa
## Min. 1st Qu. Median Mean 3rd Qu. Max. NA's
## nb 0.5290342 0.5307005 0.5323668 0.5323668 0.5340331 0.5356994 0
## rpart 0.5595591 0.5597709 0.5599827 0.5599827 0.5601945 0.5604063 0
## glm 0.5256891 0.5269692 0.5282494 0.5282494 0.5295295 0.5308097 0
Эдгээр 3 загвар нь загварыг байгуулахад оролцсон x_train датаг энэ 3 загвар дээр таамаглаад бодит y_train дататай жишин загварын нарийвчлалын хувийг гаргахад caret package-ийн Decision tree(Шийдвэрийн мод ) загвар нь хамгийн өндөр хувьтай таамаглаж байна.
Next:: y_test,test_Accuracy score,AUC plot,Optimal model