17.09.2018
Найбільш зрозумілий показник - "точність" моделі. Однак досить часто дає замало інформації про якість моделі. \[ Accuracy = \frac{TP + TN}{TP+TN+FP+FN} \]
Скільки об'єктів модель правильно віднесла до позитивного класу із загальної чисельності віднесених до позитивного класу об'єктів. Ця метрика дозволяє нам не записувати все в один клас. \[ Precision = \frac{TP}{TP+FP} \]
Здатність моделі в принципі виявляти позитивний клас. Частка об'єктів вірно виявлених як "позитивних", відносно загальної чисельності об'єктів, які є в дійсності належними до позитивного класу. \[ Recall\ Sensetivity = \frac{TP}{TP+FN} \]
Здатність моделі виявляти негативний клас. Частка об'єктів, які модель правильно віднесла до негативного класу із загальної чисельності віднесених до негативного класу об'єктів. \[ Specificity = \frac{TN}{TN+FP} \]
Комбінована метрика, що поєднує precision i recall. \[ F1\ score = \frac{2TP}{2TP+FP+FN} = 2 \times \frac{precision \times recall}{precision + recall} \]
Середнє значення між sensitivity i specifity. \[ Balanced\ Accuracy = \frac{Sensitivity+Specificity}{2} \]
Частка вірно виявлених "позитивних" об'єктів. \[ Detection\ Rate = \frac{TP}{TP+TN+FP+FN} \] Наскільки представлений у дійсності позитивний клас. \[ Detection\ Prevalence = \frac{TP+FN}{TP+TN+FP+FN} \]
diamonds$c <- as.numeric(diamonds$cut == "Ideal") train <- diamonds %>% slice(1:30000) %>% select(-cut)
## Warning: package 'bindrcpp' was built under R version 3.4.4
test <- diamonds %>% slice(30001:53940) %>% select(-cut) fit <- glm(c~., train, family = binomial)
## Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
pred <- predict(fit, test, type = "response") truth <- test$c xtab <- table(ifelse(pred<0.5,0,1), truth) output <- caret::confusionMatrix(xtab)
| metrics | value |
|---|---|
| Accuracy | 0.7827068 |
| Precision | 0.7778686 |
| Recall | 0.8254732 |
| Sensitivity | 0.8254732 |
| Specificity | 0.7345471 |
| F1 | 0.8009642 |
| Detection Rate | 0.4372180 |
| Detection Prevalence | 0.5620718 |
Логістична функція втрат. Її особливість у великому "штрафі" за надмірну впевненість моделі у неправильній відповіді. \[ logloss=-\frac{1}{n}(y_i\times log(\hat{y_i}) + (1-y_i) \times log(1-\hat{y_i})) \]
logLoss = function(pred, truth){
pred <- as.numeric(pred)
truth <- as.numeric(truth)
-1*mean(log(pred[model.matrix(~ truth + 0) - pred > 0]))
}
logLoss(pred, truth)
## [1] 0.5300419
ROC-крива отримується наступним чином: для кожного значення порога відсікання, яке змінюється від 0 до 1 з кроком x (наприклад, 0.01) розраховуються значення Sensitivity і Specificity. Будується графік залежності: по осі Y відкладається чувствітельность Sensitivity, по осі X - (1 - Specificity).
## Area under the curve: 0.8707