step1 線性回歸ROC與AUC的實現(xiàn)
rm(list = ls())
# BiocManager::install('ROCR')
library(ROCR)
# 載入AER包,使用包中的Affairs數(shù)據(jù)集
# BiocManager::install('AER')
library(AER)
data(Affairs,package="AER")
# 將'affaris'特征進行因子化處理,作為新增加的一列'ynaffairs'
Affairs$ynaffair[Affairs$affairs > 0] <- 1
Affairs$ynaffair[Affairs$affairs== 0] <- 0
Affairs$ynaffair <-factor(Affairs$ynaffair,levels=c(0,1),labels=c("No","Yes"))
# 構建Logistics模型
myfit <- glm(ynaffair ~ gender + age + yearsmarried + children + religiousness + education + occupation + rating, data=Affairs,family=binomial())
pre <- predict(myfit,type='response')
pred <- prediction(pre,Affairs$ynaffair)
# 計算AUC值
performance(pred,'auc')@y.values
perf <- performance(pred,'tpr','fpr')
plot(perf)
這是計算affair的一個數(shù)據(jù)集
summary(myfit) ### 得到擬合公式
step2 繪圖強大的一個包——pROC
雖然ROCR包可以滿足我們的需要,但在功能上還是有些單一,繪制的圖也比較粗糙彼水。因此接下來我們學習R中更為強大的一個包——pROC,該包不僅作圖美觀螟加,還可以在同一幅圖上繪制多條ROC曲線杂数,方便我們比較兩個分類器的性能優(yōu)劣年叮。
# BiocManager::install('pROC')
library(pROC)
# 同樣使用上一節(jié)中的myfit模型
pre <- predict(myfit,type='response')
modelroc <- roc(Affairs$ynaffair,pre)
modelroc
# 可視化展示,同時給出AUC的面積與最優(yōu)的臨界點
plot(modelroc, print.auc=TRUE, auc.polygon=TRUE, grid=c(0.1, 0.2), grid.col=c("green", "red"), max.auc.polygon=TRUE, auc.polygon.col="skyblue", print.thres=TRUE)
step3 支持向量機法SVM
svm命令的R包 下載
# 以下為之前的logistics模型
pre_1 <- predict(myfit,type='response')
modelroc_1 <- roc(Affairs$ynaffair,pre_1)
# 使用支持向量機算法對同樣的數(shù)據(jù)進行預測
library(e1071) ###### 這個包里面有svm
svm_model <- svm(ynaffair ~ gender + age + yearsmarried + children + religiousness + education + occupation + rating, data=Affairs)
# 提取模型預測值并進行格式處理
pred_2 <- as.factor(svm_model$decision.values)
pred_2 <- as.ordered(pred_2)
modelroc_2 <- roc(Affairs$ynaffair,pred_2)
modelroc_2
# 可視化展示,使用add=TRUE將第二個模型添加到圖形中
plot.roc(modelroc_2, add=TRUE, col="green",print.thres=TRUE)
plot(modelroc_1, print.auc=TRUE, auc.polygon=TRUE, grid=c(0.1, 0.2), grid.col=c("green", "red"), max.auc.polygon=TRUE, auc.polygon.col="skyblue", print.thres=TRUE,col='blue')
plot.roc(modelroc_2, add=TRUE, col="green",print.thres=TRUE)