【数据科学原理与实践】基本建模方法
数据准备
step 1:加载数据
d <- read.table(filename,header=F,sep='\t')//header:要不要表头
step 2:数据划分:两类划分——训练集合测试集,通过重复划分进行验证/交叉验证估计过拟合(度量标准:AUC)
set.seed(65536) #设置随机种子,使复现时出现相同结果
d$rgroup<-runif(dim(d)[[1]])
dTrainAll<-subset(d,rgroup<=0.9)
dTest<-subset(d,rgroup>0.9) #将数据集划分为训练集和测试集,二者比例9:1
#训练集分一部分作为验证集
useForCal<-rbinom(n=dim(dTrainAll)[[1]],size=1,prob=0.1)>0 #采用伯努利采样划分训练集和验证集
dCal<-subset(dTrainAll,useForCal)
dTrain<-subset(dTrainAll,!useForCal)
构建单变量模型
类别型特征建模:透视表(讲一个特征变量的类别值转换成一个新的数据列)、列联表
数值型特征建模:范围划分,使用范围标签作为一个新的类别型变量
构建多变量模型
变量选择
使用决策树建模
决策树是一种描述对实例进行分类的树形结构:由结点有向边组成。
平均信息量=期望
H(X)=-sum(p(xi)*log(p(xi)))
类别1 | 类别2 | ... | 类别n | |
---|---|---|---|---|
类别概率 | p(x1) | p(x2) | ... | p(xn) |
信息量 | -log(p(x1)) | -log(p(x2)) | ... | -log(p(xn)) |
决策树是分类问题中最常用的模型之一,能够接受类别型的特征。决策树的中间结点是决策步骤,叶子结点是决策结果/类别标签
如何创建决策树?
使用封装程序包构建决策树,用挑选出来的变量进行建模。
f<-paste(outcome,'>0 ~ ',paste(selVars,collapse='+'),sep='')
tmodel<-rpart(f,data=dTrain,control=part.control(cp=0.001,minsplit=1000,minbucket=1000,maxdepth=5))
print(calcAUC(predict(tmodel,newdata=dTrain),dTrain[,outcome]))
print(calcAUC(predict(tmodel,newdata=dTest),dTest[,outcome]))
print(calcAUC(predict(tmodel,newdata=dCal),dCal[,outcome]))
#绘制决策树
par(cex=0.7)
plot(tmodel)
text(tmodel)
使用最邻近法建模
k-近邻(kNN)方法通过查找距离目标样本最接近的k个训练样本,然后利用它们的结果均值作为该样本的得分。
算法原理:对每个测试样本x,在训练集中找到离x最近的K个训练样本,根据这K个样本多类别标签投票,多数标签作为x的预测标签。
KNN的时空代价都很高
算法流程
- 为判别未知样本点所属的类别,应以所有已知类别的实例作为参照
- 选择参数K,通常不大于20
- 计算待测样本点与所有已知类别的样本点之间的距离
- 排序,选择最近K个已知样本点
- 对上述K个最近邻的样本点类别进行投票,决定待测样本点所属的类别
K值选择:
- 较小的K值,:相当于用邻域中的训练实例进行预测
- 学习的近似误差会减小,只有与输入实例较近的训练实例才会对预测结果起作用
- 学习的估计误差会增大,预测结果会对近邻的实例点非常敏感,如果邻近的实例点恰巧是噪声,预测就会出错,换句话说,k值的减小就意味着整体模型变得负责,容易发生过拟合。
- 较大的K值:相当于用较大邻域中的训练实例及逆行预测
- 可以减少学习的估计误差
- 学习的近似误差会增大,这时候与输入实例较远的训练实例也会对预测起作用,使预测发生错误,K值增大意味着整体模型变 得更简单。
library('class')
nK<-200
knnTrain<-dTrain[,selVars]
knnCl<-dTrain[,outcome]==pos
knnPred<-function(df){
knnDecision<-knn(knnTrain,df,knnCl,k=nK,prob=T)
ifelse(knnDecision==TRUE,attributes(knnDecision)&prob,1-(attributes(knnDecision)&prob))
}
print(calcAUC(knnPred(dTrain[,selVars]),dTrain[,outcome]))
print(calcAUC(knnPred(dCal[,selVars]),dCal[,outcome]))
print(calcAUC(knnPred(dTest[,selVars]),dTest[,outcome]))
dCal$kpred<-knnPred(dCal[,selVars])
ggplot(data=dCal)+geom_density(aes(x=kpred,color=as.factor(churn),linetype=as.factor(churn)))
朴素贝叶斯建模
朴素贝叶斯通过记住每个训练变量与结果变量的相关性,将每个变量的条件概率相乘进行预测。
总结
决策树、最近邻和朴素贝叶斯模型简单存储了数据概要
- 单变量模型可以认为是对训练数据的简单概要。
- 决策树模型的决策是累计训练数据子集的概要。
- kNN预测基于训练数据的k个点的概要进行打分,通常需要存储所有的原始训练数据,因此其真正地记住了训练数据。
- 朴素贝叶斯模型通过中间特征值记住了部分训练数据。