Les arbres de décision et les forêts aléatoires sont une partie importante de l'apprentissage automatique. Aujourd'hui, je parle principalement d'arbres de décision. Les arbres de décision sont divisés en arbres de décision traditionnels et en arbres de décision conditionnelle. Les arbres de décision traditionnels (implémentés par le package rpart) sont principalement basés sur: Gini Impurity ou Information Gain et d'autres standards Les nœuds sont divisés de manière récursive. L'arbre de décision conditionnelle sélectionnera la variable à utiliser dans le nœud divisé en fonction de la corrélation entre la variable de mesure de distribution conditionnelle et la valeur de réponse (classification), ce qui peut améliorer le problème de surajustement du package rpart. Aujourd'hui, nous parlerons principalement de l'arbre de décision conditionnelle. Si vous êtes directeur d'une banque et qu'un client vient vers vous pour un prêt, pour un client à forte capacité de remboursement (faible risque), vous êtes décidément prêt à lui prêter, mais faible capacité de remboursement Un client (à haut risque), vous n'êtes certainement pas disposé à lui prêter. Alors, comment évaluer l'évaluation des risques d'un client? Elle doit être basée sur des données passées pour évaluer sa profession, ses revenus, ses passifs, ses actifs, etc. C'est probablement une décision classifiée dans la figure suivante, notre arbre de décision Probablement c'est un principe de fonctionnement, qui équivaut à un algorithme machine vous aidant à prendre des décisions.
Aujourd'hui, nous utiliserons le propre ensemble de données de SPSS de 1500 cas de division du risque client bancaire pour créer un arbre de décision conditionnelle. Le langage R doit utiliser des packages partie, caret, pROC, étrangers et doit être téléchargé à l'avance. Importons
les données première. structure de données
library(foreign)
library(pROC)
library(party)
library(caret)
library(ggplot2)
bc <- read.spss("E:/r/test/bankloan_cs.sav",
use.value.labels=F, to.data.frame=T)
Les 3 premiers éléments sont des numéros d'identification et les 3 derniers éléments sont des probabilités et des poids prédits. Ignorons-les pour le moment. Jetons un coup d'œil aux indicateurs du projet intermédiaire: âge âge, niveau d'éducation, années d'emploi employeur, temps d'adresse vivant dans cet endroit revenu revenu, ratio dette-revenu dette, dette crédit, dette de carte de crédit, autres dettes, autres dettes, le dernier défaut est nous L'indicateur de résultat est de savoir s'il s'agit d'un client à haut risque.
Parmi eux, le niveau d'éducation et la valeur par défaut sont des variables catégorielles, nous devons convertir
bc$default<-as.factor(bc$default)
bc$ed<-as.factor(bc$ed)
Ensuite, divisez les données en un ensemble de prédictions et un ensemble de vérification (c'est-à-dire une modélisation et une vérification), et une graine doit être définie en premier, de sorte qu'il y ait répétabilité
###建立预测和验证集
sub<-sample(1:nrow(bc),round(nrow(bc)*2/3))
length(sub)
data_train<-bc[sub,]#取2/3的数据做训练集
data_test<-bc[-sub,]#取1/3的数据做测试集
###训练集建立模型
fit<-ctree(default ~age+ed+employ+address+income+debtinc+creddebt+othdebt,
data=data_train,controls = ctree_control(maxsurrogate = 3))
fit
plot(fit)
Les résultats suivants sont obtenus. Vous pouvez voir si le ratio d'endettement de la succursale de premier niveau est supérieur à 16. S'il n'est
pas facile à comprendre, il sera plus facile à comprendre si vous regardez l'image. Si le taux d'endettement est supérieur à 16, les années de travail sont divisées, soit moins de 6 ans, ce sont des groupes à haut risque, qui ne sont pas éligibles aux prêts.
Ensuite, nous effectuons une validation croisée pour évaluer la capacité de vérification du modèle, et commençons par générer la probabilité du modèle de prédiction dans l'ensemble de vérification.
ctree.predict = predict(fit,data_test)##验证集生成预测概率
bd<-table(ctree.predict,data_test$default)#以表格形式表示
bd
Nous pouvons voir que la prédiction de 0 est encore assez précise, et 1 est presque le même, et l'ASC et l'IC à 95% peuvent être calculés grâce à la matrice de confusion.
confusionMatrix(bd)##通过混淆矩阵来计算AUC
Nous pouvons également extraire la probabilité via la fonction treeresponse
tr = treeresponse(fit,newdata =data_test )##利用treeresponse提取概率
be<-do.call(rbind.data.frame,tr)##把列表变成数据框形式
colnames(be)<-c("yes","no")#数据太长,重新命名
roc2<-roc(data_test$default,be$no)##生成验证队列AUC,有人可能要问这里为什么用no,不用yes,其实都是一样的
round(auc(roc2),3)##AUC
round(ci(roc2),3)##95%CI
plot(1-roc2$specificities,roc2$sensitivities,col="red",
lty=1,lwd=2,type = "l",xlab = "specificities",ylab = "sensitivities")
abline(0,1)
legend(0.7,0.3,c("auc=0.753","ci:0.711-0.759"),lty=c(1),lwd=c(2),col="red",bty = "n")
Elle est similaire à l'AUC calculée par la matrice de confusion. Elle est un peu plus élevée. Je pense qu'elle est également un peu plus élevée. Personnellement, je pense que la probabilité d'extraction est plus précise. L'erreur de l'arbre de décision est légèrement plus élevée en raison à l'aléatoire.Nous pouvons le réduire en utilisant la forêt aléatoire.Erreur et modèle d'optimisation, la section suivante continuera à introduire la forêt aléatoire.
Pour des articles plus passionnants, veuillez prêter attention au numéro public: la recherche scientifique à base zéro