Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Warsztaty Caret: Odp. do zadania 3 #5

Open
jacekkotowski opened this issue Apr 20, 2017 · 2 comments
Open

Warsztaty Caret: Odp. do zadania 3 #5

jacekkotowski opened this issue Apr 20, 2017 · 2 comments

Comments

@jacekkotowski
Copy link

jacekkotowski commented Apr 20, 2017

Witajcie.
Nie umiałem wypełnić wszystkich wymagań (lift curve, AUC). Bardzo proszę o uwagi, poprawki i komentarze.
Oto moje rozwiązanie:

###Zad3 zrobic dobra klasyfikacje u coxik (podzial zbioru 2:1) miara dobroci AUC, narysowac krzywa LIFT.
###źródła:
###użyłem https://www.r-bloggers.com/the-5th-tribe-support-vector-machines-and-caret/
###zastanawiałem się nad imbalanced data: np: https://www.r-bloggers.com/handling-class-imbalance-with-r-and-caret-an-introduction/

library(tidyverse)
set.seed(123)
data(cox2)
coxik<-cbind.data.frame(cox2Descr,cox2Class)
glimpse(coxik)

trainIndex <- createDataPartition(coxik$cox2Class, p = .66,
list = FALSE,
times = 1)
coxik_train <- coxik[ trainIndex,]
coxik_test <- coxik[-trainIndex,]

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

svm.tune <- train(cox2Class ~ ., data = coxik_train,
method = "svmRadial", # Radial kernel
tuneLength = 9, # 9 values of the cost function
preProc = c("center","scale", "nzv","pca"), # Center and scale data
metric="Accuracy",
trControl=fitControl)

svm.tune$bestTune

#sigma C
#0.02004159 2

#Szukam wokół tych parametrów.

grid <- expand.grid(sigma = seq(0.015,0.025,by=0.00125),
C = seq(2.8,3.5,by=0.125))

svm.tune <- train(cox2Class ~ ., data = coxik_train,
method = "svmRadial",
preProc = c("center","scale", "nzv","pca"),
metric="Accuracy",
tuneGrid = grid,
trControl=fitControl)

svm.tune$bestTune

#sigma C
#0.01625 3.3

#Sprawdzam na zbiorze testowym:

plot(svm.tune) # bardzo czuły na sigmę, trzeba dalej stroić?

head(varImp(svm.tune, scale = FALSE)$importance,n=10)

myMetrics <- table(predict(svm.tune, coxik_test), coxik_test$cox2Class)

######## Active Inactive
#Active 10 6
#Inactive 20 120
myAccuracy <- sum(diag(myMetrics)/sum(myMetrics))

#0.8333333

@jacekkotowski jacekkotowski changed the title Odp. do zadania 3 Warsztaty Caret: Odp. do zadania 3 Apr 20, 2017
@rudask
Copy link

rudask commented Apr 20, 2017

Kod wygląda, bardzo ok. Jeśli chodzi o krzywą lift i AUC zamieszczam moje rozwiązanie. lift robimy tak jak pokazywałem na warsztatach, jeśli chodzi o AUC wykorzystujemy funkcję twoClassSummary zbiór który jest używany składa się z kolumny obs, która zawiera prawdziwe zmienne odpowiedzi, Active i Inactive, które zawierają pstwa przydzielenia do danej klasy i kolumnę pred z proponowanymi predykcjami (prognoza przyjmowała konkretną wartość, jeśli pstwo tej wartości było powyżej 0.5.

data(cox2)
coxik<-data.table(cox2Descr)
cox2Class
coxik[,ACTIVITY:=cox2Class]

preProcValues<-preProcess(coxik, method = c("nzv"))
coxik<-predict(preProcValues, coxik)
ncol(coxik)

descrCor <- cor(coxik[,-229,with = FALSE])
colscor<-findCorrelation(descrCor, cutoff = .75)
coxik <- coxik[,-colscor,with = FALSE]
trainIndex <- createDataPartition(coxik$ACTIVITY, p = .66,
list = FALSE,
times = 1)

coxik_train <- coxik[ trainIndex,]
coxik_test <- coxik[-trainIndex,]

ctrl <- trainControl(method = "cv", classProbs = TRUE,
summaryFunction = twoClassSummary)

lda_lift <- train(ACTIVITY ~ ., data = coxik_train,
method = "lda", metric = "ROC",
trControl = ctrl)

lift_results <- data.frame(ACTIVITY = coxik_test$ACTIVITY)
lift_results$LDA <- predict(lda_lift, coxik_test, type = "prob")[,"Active"]

lift_obj <- lift(ACTIVITY ~ LDA, data = lift_results)
plot(lift_obj, values = 60, auto.key = list(columns = 2,
lines = TRUE,
points = FALSE))

lift_results$Inactive <- predict(lda_lift, coxik_test, type = "prob")[,"Inactive"]
lift_results$pred <- factor(ifelse(lift_results$LDA >= .5, "Active", "Inactive"))
setnames(lift_results,"LDA","Active")
lift_results<-data.table(lift_results)
setkey(lift_results,"ACTIVITY")
setnames(lift_results,"ACTIVITY","obs")
AUC<-twoClassSummary(lift_results, lev = levels(lift_results$obs))

@smudap
Copy link
Member

smudap commented Apr 24, 2017

Czy Krzysiek dał Ci wystarczającą odpowiedź? Można zamknąć issue?

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

3 participants