分类算法家族
决策树
ID.3、C4.5、C5.0
CART(Classification and Regression Tree, 分类回归树)
元模型
Bagging、Boosting、随机森林
贝叶斯
朴素贝叶斯、贝叶斯网络
懒惰算法
knn
决策树的庐山面目
根节点
一棵决策树只有一个根节点
叶节点
中间节点
二叉树和多叉树
二叉树:每个节点最多有两个分支
多叉树:每个节点不止有两个分支
体现了对样本数据不断分组过程
构建策略————有监督学习
有监督学习和无监督学习的区别
分类和聚类
样本分成两部分
训练数据集:用于建模
测试数据集:用于验证
决策树的构建
树的生长
采用分而治之的策略
选变量的顺序:如何从众多决策变量中选择一个当前最佳的决策变量;
最佳分离点在哪:如何从分组比变量的众多取值中找到一个最佳的分割点;
树的修剪
避免过度拟合:过于个性化、失去了一般化
算法分类
ID3
信息增益
没有修剪
C4.5
信息增益率
悲观剪枝法
C5.0
信息增益率
自适应增强
CART(分类回归树)
基尼指数
“代价复杂度”剪枝法
分裂指标
ID3
熵
分裂后的总熵
信息增益
C4.5
分裂信息
信息增益率
CART
基尼系数
准确性评价
评价模型的方式要考虑模型在所有分类中识别出某个分类的能力。对感兴趣的分类称为阳性(Positive)其它的类别称为阴性(negative)
混淆矩阵
指标
正确率、错误率
灵敏度(召回率、覆盖率)
特异性
ROC曲线和AUC
横轴:1-特异性
纵轴:灵敏度
对角线:完全瞎猜
AUC
曲线和对角线之间的面积
0.5-1之间
模型准确性的评估方式
简单验证
数据–>训练集–>导出分类法–>评估准确性
–>测试集–>
交叉验证
K折验证
Sys.getenv(‘JAVA_HOME’)
Sys.setenv(JAVA_HOME=‘d:/’)
library(rJava)
library(RWeka)
m=J48(Species~.,data=iris)
m
plot(m)
m2=J48(Species~.,data=iris,control=Weka_control(U=T))
m2
plot(m2)
#验证
cdata=read.csv(‘e:/credit.csv’,stringsAsFactors = T)
str(cdata)
set.seed(12345)
cdata_rand=cdata[order(runif(1000)),]
credit_train=cdata_rand[1:900,]
credit_test=cdata_rand[901:1000,]
cm=J48(default~.,data=credit_train,control=Weka_control(M=10,U=F))
cm
plot(cm)
credit_pred=predict(cm,credit_test)
credit_pred
credit_pred_prob=predict(cm,credit_test,type=‘prob’)
credit_pred_prob
library(gmodels)
CrossTable(credit_test$default,credit_pred,prop.chisq = F,prop.c=F,prop.r = F,dnn=c(‘实际’,‘预测’))
credit_pred_prob
#roc
library(pROC)
roc1=roc(cdata_test$default,credit_pred_prob[,1] ,plot=T, print.thres=T,print.auc=T)
plot(roc1,col=‘blue’,print.thres=T,print.auc=T)
plot(roc2,col=‘red’,add=T,auc.polygon=F,print.thres=T,print.auc=T)
plot.roc(roc1, print.auc=TRUE, auc.polygon=TRUE, grid=c(0.1, 0.2),
grid.col=c(“green”, “red”), max.auc.polygon=TRUE,
auc.polygon.col=“white”, print.thres=TRUE)
lines.roc(roc2,col=‘red’,print.auc=T,auc.polygon=TRUE, print.thres=TRUE)
roc.test(roc1,roc2)
#rpart CART算法
library(rpart.plot)
library(rpart)
head(iris,2)
ir.tr=rpart(Species~.,iris)
#直接从结果中看规则
ir.tr
par(mfrow=c(2,2))
rpart.plot(ir.tr,type=2,branch=1,extra=1)
rpart.plot(ir.tr,type=2,branch=1,extra=2)
rpart.plot(ir.tr,type=1,branch=1,extra=1)
rpart.plot(ir.tr,type=4,branch=1,extra=1)
par(mfrow=c(1,1))
#用fancyRpartPlot画树更好看
library(rattle)
fancyRpartPlot(ir.tr)
#输出成规则,用rattle程序包里面的asRules函数:tree和rpart两个包不能混用
asRules(ir.tr)
#可以用maptree来画
library(maptree)
draw.tree(ir.tr,nodeinfo=T)