Podczas zajêæ bêd± wykorzystywane pakiety HMisc
, MASS
, car
, caret
, PPROC
oraz ROCit
.
Najwa¿niejsz± ró¿nic± pomiêdzy zbiorami treningowymi, a surowymi danymi, które analizuje siê w pracy naukowej jest to, ¿e te drugie najczê¶ciej nie s± w formacie gotowym do wczytania i analizy. Przygotowanie danych do pracy mo¿e zajmowaæ nawet wiêcej czasu ni¿ sama analiza. Jednym z najczê¶ciej wystêpuj±cych problemów s± brakuj±ce obserwacje. W pakiecie R s± one oznaczane symbolem NA
. Aby sprawdziæ czy nasze dane zawieraj± brakuj±ce obserwacje nale¿y pos³u¿yæ siê funkcj± is.na()
.
# Przyk³ad 10.1
v <- c(2,-5,NA,3.5,NA)
is.na(v)
## [1] FALSE FALSE TRUE FALSE TRUE
which(is.na(v))
## [1] 3 5
df <- data.frame(a=1:5, b=c("jeden","dwa","trzy",NA,"piêæ"),c=v); df
## a b c
## 1 1 jeden 2.0
## 2 2 dwa -5.0
## 3 3 trzy NA
## 4 4 <NA> 3.5
## 5 5 piêæ NA
is.na(df)
## a b c
## [1,] FALSE FALSE FALSE
## [2,] FALSE FALSE FALSE
## [3,] FALSE FALSE TRUE
## [4,] FALSE TRUE FALSE
## [5,] FALSE FALSE TRUE
Brakuj±ce obserwacje z wektora mo¿na usun±æ funkcj± na.omit()
, natomiast do usuniêcia wierszy zawieraj±cych brakuj±ce obserwacje z ramki danych s³u¿y funkcja complete.cases()
.
# Przyk³ad 10.2
w <- na.omit(v); w
## [1] 2.0 -5.0 3.5
## attr(,"na.action")
## [1] 3 5
## attr(,"class")
## [1] "omit"
df2 <- df[complete.cases(df),]; df2
## a b c
## 1 1 jeden 2
## 2 2 dwa -5
Usuniêcie wierszy zawieraj±cych brakuj±ce obserwacje jest najprostszym rozwi±zaniem problemu, ale na pewno nie najlepszym. W wielu przypadkach po odsianiu takich wierszy zbiór danych mo¿e zmaleæ o kilkadziesi±t procent. Zamiast usuwaæ ca³e wiersze, zaleca siê aby w miejsce brakuj±cych pomiarów wstawiaæ (imputowaæ) sztuczne pomiary. Mo¿na do tego wykorzystaæ funkcjê inpute()
z biblioteki Hmisc
.
# Przyk³ad 10.3
library(Hmisc)
wekt <- c(4,2,NA,1,1,1,NA,5)
impute(wekt, median)
## 1 2 3 4 5 6 7 8
## 4.0 2.0 1.5* 1.0 1.0 1.0 1.5* 5.0
impute(wekt, mean)
## 1 2 3 4 5 6 7
## 4.000000 2.000000 2.333333* 1.000000 1.000000 1.000000 2.333333*
## 8
## 5.000000
impute(wekt, "random")
## 1 2 3 4 5 6 7 8
## 4 2 2* 1 1 1 1* 5
impute(wekt, 0)
## 1 2 3 4 5 6 7 8
## 4 2 0* 1 1 1 0* 5
Skalowanie polega na odjêciu od ka¿dej obserwacji ¶redniej i podzieleniu przez odchylenie standardowe z próby. W pakiecie R
s³u¿y do tego funkcja scale()
, przy czym za pomoc± parametrów center=TRUE/FALSE
i scale=TRUE/FALSE
mo¿na decydowaæ czy odejmowaæ warto¶æ ¶redni± i czy dzieliæ przez odchylenie standardowe.
# Przyk³ad 10.4
x <- rnorm(100, mean=3, sd=2)
x.scaled <- scale(x)
mean(x.scaled)
## [1] -6.125249e-17
sd(x.scaled)
## [1] 1
Inn± bardzo przydatn± funkcj± jest transform()
, która umo¿liwia transformacje wybranych zmiennych w ramce danych przy pomocy jednej komendy. Przetransformowane zmienne s± dodawane do ramki jako nowe kolumny.
# Przyk³ad 10.5
dane <- read.csv2("http://www.biecek.pl/R/dane/dane0.csv")
dane.trans <- transform(dane, logVEGF = log(VEGF), fNowotwor = factor(Nowotwor), cutWiek = cut(Wiek,4))
head(dane.trans)
## Wiek Rozmiar.guza Wezly.chlonne Nowotwor Receptory.estrogenowe
## 1 29 1 0 2 (-)
## 2 29 1 0 2 (++)
## 3 30 1 1 2 (-)
## 4 32 1 0 3 (++)
## 5 32 2 0 NA (-)
## 6 33 1 1 3 (-)
## Receptory.progesteronowe Niepowodzenia Okres.bez.wznowy VEGF logVEGF
## 1 (++) brak 22 914 6.817831
## 2 (++) brak 53 1118 7.019297
## 3 (+) brak 38 630 6.445720
## 4 (++) brak 26 1793 7.491645
## 5 (++) brak 19 963 6.870053
## 6 (++) wznowa 36 2776 7.928766
## fNowotwor cutWiek
## 1 2 (29,36]
## 2 2 (29,36]
## 3 2 (29,36]
## 4 3 (29,36]
## 5 <NA> (29,36]
## 6 3 (29,36]
Aby oszacowaæ skuteczno¶æ danego klasyfikatora (modelu predykcyjnego) niezbêdna jest do tego próba testowa, która powinna byæ rozdzielna z prób± ucz±c±. Przepuszczamy obserwacje z próby testowej przez model i odczytujemy przewidziane klasy dla tych obserwacji, a nastêpnie porównujemy je z rzeczywistymi klasami. W ten sposób mo¿emy skontruowaæ macierz pomy³ek (confusion matrix), której pola maj± nazwy jak na rysunku poni¿ej (numenklatura jest zwi±zana z testami medycznymi, maj±cymi na celu okre¶lenie nosicielstwa danej choroby).
sklasyfikowani jako CHORZY | sklasyfikowani jako ZDROWI | |
---|---|---|
faktycznie CHORZY | TRUE POSITIVE (TP) | FALSE NEGATIVE (FN) |
faktycznie ZDROWI | FALSE POSITIVE (FP) | TRUE NEGATIVE (TN) |
Wszystkie \(n=P+N\) przypadki dziel± siê na osobników chorych \(P=TP+FN\) i zdrowych \(N=TN+FP\). Na podstawie macierzy pomy³ek mo¿na zdefiniowaæ nastêpuj±ce wielko¶ci pomocne w porównywaniu klasyfikatorów:
\(\qquad TPR = \frac{TP}{P}\),
\(\qquad TNR = \frac{TN}{N}\),
\(\qquad PPV = \frac{TP}{TP+FP}\),
\(\qquad NPV = \frac{TN}{TN+FN}\)
\(\qquad ACC = \frac{TN + TP}{n}\),
\(\qquad F_1 = \frac{2 \cdot PPV \cdot TPR}{PPV + TPR} = \frac{2 TP}{2TP + FP + FN}\).
Dok³adno¶æ okre¶la na ile dobrze algorytm przewiduje dowoln± klasê. Czu³o¶æ i specyficzno¶æ s± prawdopodobieñstwami warunkowymi dobrej klasyfikacji, pod warunkiem, ¿e obiekt faktycznie nale¿y do danej klasy. Maj± one szczególne znaczenie, je¶li rozk³ad liczebno¶ci klas jest nierówny. Dla przyk³adu obliczmy powy¿sze miary dla modelu regresji logistycznej dla zbioru danych Pima
z biblioteki MASS
.
# Przyk³ad 10.6
library(MASS)
# Regresja liniowa oparta o statystycznie istotne czynniki: glu i ped
pima.lr <- glm(type~glu+ped, data=Pima.tr, family = binomial(link = "logit"))
# Predykcja
pima.predict <- predict(pima.lr, newdata = Pima.te, type = "response")
pima.result <- ifelse(pima.predict>0.50, "Yes", "No")
pima.true <- Pima.te[,8]
# Macierz pomy³ek
pima.cm <- table(pima.true,pima.result); pima.cm
## pima.result
## pima.true No Yes
## No 205 18
## Yes 50 59
TN <- pima.cm[1,1]
TP <- pima.cm[2,2]
FP <- pima.cm[1,2]
FN <- pima.cm[2,1]
P <- TP+FN
N <- TN+FP
# Czu³o¶æ
TP/P
## [1] 0.5412844
# Specyficzno¶æ
TN/N
## [1] 0.9192825
# Precyzja
TP/(TP+FP)
## [1] 0.7662338
# Warto¶æ predykcyjna ujemna
TN/(TN+FN)
## [1] 0.8039216
# Dok³adno¶æ
(TN+TP)/sum(pima.cm)
## [1] 0.7951807
# Miara F1
2*TP/(2*TP+FP+FN)
## [1] 0.6344086
Szybszym sposobem na policzenie powy¿szych warto¶ci jest skorzystanie z funkcji confusionMatrix()
z biblioteki caret
. Argumentami tej funkcji mo¿e byæ zarówno macierz wspó³wystêpowania zwracana przez funkcjê table
jak i wektory przynale¿no¶ci do klas (przewidywane i rzeczywiste).
# Przyk³ad 10.7
library(caret)
pima.conf <- confusionMatrix(as.factor(pima.result),pima.true, positive = "Yes"); pima.conf
## Confusion Matrix and Statistics
##
## Reference
## Prediction No Yes
## No 205 50
## Yes 18 59
##
## Accuracy : 0.7952
## 95% CI : (0.7477, 0.8373)
## No Information Rate : 0.6717
## P-Value [Acc > NIR] : 4.282e-07
##
## Kappa : 0.4979
##
## Mcnemar's Test P-Value : 0.0001704
##
## Sensitivity : 0.5413
## Specificity : 0.9193
## Pos Pred Value : 0.7662
## Neg Pred Value : 0.8039
## Prevalence : 0.3283
## Detection Rate : 0.1777
## Detection Prevalence : 0.2319
## Balanced Accuracy : 0.7303
##
## 'Positive' Class : Yes
##
Powy¿sza funkcja zwraca równie¿ przedzia³y ufno¶ci dla dok³adno¶ci i testuje hipotezê statystyczn± czy dok³adno¶æ jest wiêksza ni¿ "no information rate", który jest równy procentowemu udzia³owi liczniejszej klasy. Miara F1 nie jest domy¶lnie pokazana i trzeba siê do niej dostaæ przez pole byClass
.
pima.conf$byClass
## Sensitivity Specificity Pos Pred Value
## 0.5412844 0.9192825 0.7662338
## Neg Pred Value Precision Recall
## 0.8039216 0.7662338 0.5412844
## F1 Prevalence Detection Rate
## 0.6344086 0.3283133 0.1777108
## Detection Prevalence Balanced Accuracy
## 0.2319277 0.7302835
W powy¿szym przyk³adzie za³o¿yli¶my, ¿e progiem prawdopodobieñstwa, od którego uznajemy osobnika za diabetyka jest 0.5. W³a¶ciwszym podej¶ciem by³oby przetestowanie wielu progów i zbadanie czu³o¶ci i specyficzno¶ci dla ka¿dego z progów. Przy pomocy funkcji sapply
mo¿na policzyæ macierz pomy³ek dla dowolnej liczby progów, przy czym próg 0.04 jest minimalny, przy którym wystêpuj± obie klasy.
# Przyk³ad 10.8
progi <- seq(0.04,0.99,0.01)
roc <- sapply(progi, function(p)
confusionMatrix(as.factor(ifelse(pima.predict>p, "Yes", "No")), pima.true, positive = "Yes")$byClass[c("Sensitivity","Specificity")])
plot(1-roc["Specificity",], roc["Sensitivity",], xlab="1-specyficzno¶æ", ylab="czu³o¶æ", main="ROC", type = "l")
Powy¿sza krzywa nosi nazwê ROC (Receiver Operating Characteristic) i ilustruje ona jako¶æ klasyfikatora. Optymalny punkt podzia³u to ten, który maksymalizuje Indeks Youdena, dany wzorem \(YI = TPR + TNR - 1\). Istnieje wiele bibliotek, które s³u¿± pomoc± przy wykre¶laniu krzywej ROC, a nawet obliczaj± optymalny punkt podzia³u i AUC (Area Under Curve), czyli pole pod wykresem krzywej ROC.
# Przyk³ad 10.9
library(PRROC)
pima.true <- ifelse(Pima.te[,8]=="Yes", 1, 0)
prroc.obj <- roc.curve(scores.class0 = pima.predict, weights.class0 = pima.true, curve=TRUE)
plot(prroc.obj)
library(ROCit)
rocit.obj <- rocit(score=pima.predict,class=Pima.te[,8])
summary(rocit.obj)
##
## Empirical ROC curve
## Number of postive responses : 109
## Number of negative responses : 223
## Area under curve : 0.824453861027687
plot(rocit.obj)
Niestety maksymalny Indeks Youdena nie jest przechowywany w obiekcie rocit
, ale mo¿emy ³atwo go obliczyæ.
best.yi.index <- which.max(rocit.obj$TPR-rocit.obj$FPR)
best.cutoff <- rocit.obj$Cutoff[best.yi.index]
best.tpr <- rocit.obj$TPR[best.yi.index]
best.fpr <- rocit.obj$FPR[best.yi.index]
sprintf("Best Cutoff = %.2f (TPR = %.3f, FPR = %.3f)", best.cutoff, best.tpr, best.fpr)
## [1] "Best Cutoff = 0.23 (TPR = 0.862, FPR = 0.359)"
Klasyczna walidacja modelu polega na podzieleniu zbioru danych na dwa roz³±czne podzbiory: zbiór ucz±cy i zbiór treningowy. Podzia³ ten mo¿na w prosty sposób wykonaæ przy pomocy funkcji createDataPartition()
z biblioteki caret
.
# Przyk³ad 10.10
data("swiss")
# Dane dotycz± p³odno¶ci w 47 prowincjach Szwajcarii w roku 1888
head(swiss)
## Fertility Agriculture Examination Education Catholic
## Courtelary 80.2 17.0 15 12 9.96
## Delemont 83.1 45.1 6 9 84.84
## Franches-Mnt 92.5 39.7 5 5 93.40
## Moutier 85.8 36.5 12 7 33.77
## Neuveville 76.9 43.5 17 15 5.16
## Porrentruy 76.1 35.3 9 7 90.57
## Infant.Mortality
## Courtelary 22.2
## Delemont 22.2
## Franches-Mnt 20.2
## Moutier 20.3
## Neuveville 20.6
## Porrentruy 26.6
set.seed(123) # Ustawiamy ziarno generatora liczb losowych
swiss.samples <- createDataPartition(swiss$Fertility, p = 0.8, list = FALSE)
swiss.train <- swiss[swiss.samples,]
swiss.test <- swiss[-swiss.samples,]
swiss.lm <- lm(Fertility ~., data = swiss.train)
swiss.predict <- predict(swiss.lm, newdata=swiss.test)
data.frame(R2 = R2(swiss.predict, swiss.test$Fertility),
RMSE = RMSE(swiss.predict, swiss.test$Fertility),
MAE = MAE(swiss.predict, swiss.test$Fertility))
## R2 RMSE MAE
## 1 0.5946201 6.410914 5.651552
W powy¿szym przyk³adzie wykorzystali¶my trzy miary oszacowania b³êdu: wspó³czynnik \(R^2\), pierwiastek b³êdu ¶redniokwadratowego (RMSE, Root Mean Squared Error) oraz ¶redni b³±d bezwglêdny (MAE, Mean Absolute Error). Je¶li dysponujemy bardzo du¿ym zbiorem danych, klasyczna walidacja powinna byæ wystarczaj±ca do oszacowania skuteczno¶ci modelu. Je¶li jednak zebranych danych nie jest wiele, ka¿da obserwacja jest cenna i mo¿e wp³yn±æ na charakterystykê modelu i dlatego wy³±czanie czê¶ci obserwacji ze zbioru treningowego nie jest wskazane. W takich sytuacjach stosuje siê walidacjê krzy¿ow± (ang. cross validation) w jednej z czterech odmian:
Bootstrap - polega na generowaniu wielu podzbiorów testowych poprzez losowanie ze zwracaniem z oryginalnego zbioru. Zwykle generuje siê setki lub tysi±ce takich podzbiorów i dla ka¿dego liczy siê skuteczno¶æ modelu. Wynik koñcowy jest u¶rednieniem (lub inn± funkcj±) wszystkich obliczonych skuteczno¶ci.
Leave one out cross validation (LOOCV) - polega na wybraniu tylko jednej obserwacji do zbioru testowego. Pozosta³e obserwacje s± wykorzystywane do wytrenowania modelu. Operacja ta jest powtórzona dla wszystkich obserwacji ze zbioru, a koñcowa skuteczno¶æ jest ¶redni± wszystkich obliczonych skuteczno¶ci.
K-krotna walidacja krzy¿owa (CV, K-fold cross validation) - dzielimy zbiór danych na K losowych podzbiorów, nastêpnie uczymy i testujemy model K razy, za ka¿dym razem wybieraj±c inny podzbiór jako próbê testow±, a pozosta³e jako próbê ucz±c±.
K-krotna walidacja krzy¿owa z potwórzeniami (RCV, Repeated K-fold cross validation) - polega na wielokrotnym wykonaniu K-krotnej walidacji krzy¿owej, przy czym za ka¿dym razem losuje siê inne K podzbiory.
W bibliotece caret
jest zaimplementowana funkcja train()
bêd±ca wrapperem do ponad dwustu ró¿nych modeli statystycznych i pozwalaj±ca na wykonanie walidacji krzy¿owej w ³atwy sposób.
# Przyk³ad 10.11
library(caret)
# Wypisanie modeli kompatybilnych z funkcj± train()
names(getModelInfo())
## [1] "ada" "AdaBag" "AdaBoost.M1"
## [4] "adaboost" "amdai" "ANFIS"
## [7] "avNNet" "awnb" "awtan"
## [10] "bag" "bagEarth" "bagEarthGCV"
## [13] "bagFDA" "bagFDAGCV" "bam"
## [16] "bartMachine" "bayesglm" "binda"
## [19] "blackboost" "blasso" "blassoAveraged"
## [22] "bridge" "brnn" "BstLm"
## [25] "bstSm" "bstTree" "C5.0"
## [28] "C5.0Cost" "C5.0Rules" "C5.0Tree"
## [31] "cforest" "chaid" "CSimca"
## [34] "ctree" "ctree2" "cubist"
## [37] "dda" "deepboost" "DENFIS"
## [40] "dnn" "dwdLinear" "dwdPoly"
## [43] "dwdRadial" "earth" "elm"
## [46] "enet" "evtree" "extraTrees"
## [49] "fda" "FH.GBML" "FIR.DM"
## [52] "foba" "FRBCS.CHI" "FRBCS.W"
## [55] "FS.HGD" "gam" "gamboost"
## [58] "gamLoess" "gamSpline" "gaussprLinear"
## [61] "gaussprPoly" "gaussprRadial" "gbm_h2o"
## [64] "gbm" "gcvEarth" "GFS.FR.MOGUL"
## [67] "GFS.LT.RS" "GFS.THRIFT" "glm.nb"
## [70] "glm" "glmboost" "glmnet_h2o"
## [73] "glmnet" "glmStepAIC" "gpls"
## [76] "hda" "hdda" "hdrda"
## [79] "HYFIS" "icr" "J48"
## [82] "JRip" "kernelpls" "kknn"
## [85] "knn" "krlsPoly" "krlsRadial"
## [88] "lars" "lars2" "lasso"
## [91] "lda" "lda2" "leapBackward"
## [94] "leapForward" "leapSeq" "Linda"
## [97] "lm" "lmStepAIC" "LMT"
## [100] "loclda" "logicBag" "LogitBoost"
## [103] "logreg" "lssvmLinear" "lssvmPoly"
## [106] "lssvmRadial" "lvq" "M5"
## [109] "M5Rules" "manb" "mda"
## [112] "Mlda" "mlp" "mlpKerasDecay"
## [115] "mlpKerasDecayCost" "mlpKerasDropout" "mlpKerasDropoutCost"
## [118] "mlpML" "mlpSGD" "mlpWeightDecay"
## [121] "mlpWeightDecayML" "monmlp" "msaenet"
## [124] "multinom" "mxnet" "mxnetAdam"
## [127] "naive_bayes" "nb" "nbDiscrete"
## [130] "nbSearch" "neuralnet" "nnet"
## [133] "nnls" "nodeHarvest" "null"
## [136] "OneR" "ordinalNet" "ordinalRF"
## [139] "ORFlog" "ORFpls" "ORFridge"
## [142] "ORFsvm" "ownn" "pam"
## [145] "parRF" "PART" "partDSA"
## [148] "pcaNNet" "pcr" "pda"
## [151] "pda2" "penalized" "PenalizedLDA"
## [154] "plr" "pls" "plsRglm"
## [157] "polr" "ppr" "PRIM"
## [160] "protoclass" "qda" "QdaCov"
## [163] "qrf" "qrnn" "randomGLM"
## [166] "ranger" "rbf" "rbfDDA"
## [169] "Rborist" "rda" "regLogistic"
## [172] "relaxo" "rf" "rFerns"
## [175] "RFlda" "rfRules" "ridge"
## [178] "rlda" "rlm" "rmda"
## [181] "rocc" "rotationForest" "rotationForestCp"
## [184] "rpart" "rpart1SE" "rpart2"
## [187] "rpartCost" "rpartScore" "rqlasso"
## [190] "rqnc" "RRF" "RRFglobal"
## [193] "rrlda" "RSimca" "rvmLinear"
## [196] "rvmPoly" "rvmRadial" "SBC"
## [199] "sda" "sdwd" "simpls"
## [202] "SLAVE" "slda" "smda"
## [205] "snn" "sparseLDA" "spikeslab"
## [208] "spls" "stepLDA" "stepQDA"
## [211] "superpc" "svmBoundrangeString" "svmExpoString"
## [214] "svmLinear" "svmLinear2" "svmLinear3"
## [217] "svmLinearWeights" "svmLinearWeights2" "svmPoly"
## [220] "svmRadial" "svmRadialCost" "svmRadialSigma"
## [223] "svmRadialWeights" "svmSpectrumString" "tan"
## [226] "tanSearch" "treebag" "vbmpRadial"
## [229] "vglmAdjCat" "vglmContRatio" "vglmCumulative"
## [232] "widekernelpls" "WM" "wsrf"
## [235] "xgbDART" "xgbLinear" "xgbTree"
## [238] "xyf"
# Bootstrap
train.control <- trainControl(method="boot", number=100)
swiss.boot <- train(Fertility ~ ., data = swiss, method = "lm", trControl = train.control)
print(swiss.boot)
## Linear Regression
##
## 47 samples
## 5 predictors
##
## No pre-processing
## Resampling: Bootstrapped (100 reps)
## Summary of sample sizes: 47, 47, 47, 47, 47, 47, ...
## Resampling results:
##
## RMSE Rsquared MAE
## 8.437493 0.5887206 6.772303
##
## Tuning parameter 'intercept' was held constant at a value of TRUE
# Leave one out cross validation (LOOCV)
train.control <- trainControl(method = "LOOCV")
swiss.loocv <- train(Fertility ~ ., data = swiss, method = "lm", trControl = train.control)
print(swiss.loocv)
## Linear Regression
##
## 47 samples
## 5 predictors
##
## No pre-processing
## Resampling: Leave-One-Out Cross-Validation
## Summary of sample sizes: 46, 46, 46, 46, 46, 46, ...
## Resampling results:
##
## RMSE Rsquared MAE
## 7.738618 0.6128307 6.116021
##
## Tuning parameter 'intercept' was held constant at a value of TRUE
# 10-krotna walidacja krzy¿owa
train.control <- trainControl(method = "cv", number=10)
swiss.cv <- train(Fertility ~ ., data = swiss, method = "lm", trControl = train.control)
print(swiss.cv)
## Linear Regression
##
## 47 samples
## 5 predictors
##
## No pre-processing
## Resampling: Cross-Validated (10 fold)
## Summary of sample sizes: 42, 42, 42, 43, 44, 42, ...
## Resampling results:
##
## RMSE Rsquared MAE
## 7.250739 0.6888443 6.10417
##
## Tuning parameter 'intercept' was held constant at a value of TRUE
# 10-krotna walidacja krzy¿owa powtórzona 3 razy
train.control <- trainControl(method = "repeatedcv", number=10, repeats=3)
swiss.repeatedcv <- train(Fertility ~ ., data = swiss, method = "lm", trControl = train.control)
print(swiss.repeatedcv)
## Linear Regression
##
## 47 samples
## 5 predictors
##
## No pre-processing
## Resampling: Cross-Validated (10 fold, repeated 3 times)
## Summary of sample sizes: 42, 43, 42, 43, 43, 42, ...
## Resampling results:
##
## RMSE Rsquared MAE
## 7.380158 0.6771845 6.139392
##
## Tuning parameter 'intercept' was held constant at a value of TRUE
Wczytaj zbiór danych Greene
z biblioteki carData
i zapoznaj siê z nim. Potraktuj zmienn± decision
jako odpowied¼, a pozosta³e zmienne za wyj±tkiem kolumny success
jako zmienne wyja¶niaj±ce. Podziel zbiór na podzbiór ucz±cy (75%) i treningowy (25%). Wykonaj regresjê logistyczn± a nastêpnie wykre¶l krzyw± ROC. Znajd¼ optymalny punkt podzia³u i wykonaj dla niego macierz pomy³ek oraz oblicz skuteczno¶æ klasyfikacji.
##
## Empirical ROC curve
## Number of postive responses : 28
## Number of negative responses : 67
## Area under curve : 0.823560767590618
## Confusion Matrix and Statistics
##
## Reference
## Prediction no yes
## no 43 3
## yes 24 25
##
## Accuracy : 0.7158
## 95% CI : (0.614, 0.8036)
## No Information Rate : 0.7053
## P-Value [Acc > NIR] : 0.4613237
##
## Kappa : 0.4389
##
## Mcnemar's Test P-Value : 0.0001186
##
## Sensitivity : 0.8929
## Specificity : 0.6418
## Pos Pred Value : 0.5102
## Neg Pred Value : 0.9348
## Prevalence : 0.2947
## Detection Rate : 0.2632
## Detection Prevalence : 0.5158
## Balanced Accuracy : 0.7673
##
## 'Positive' Class : yes
##