大家好,今天小编来为大家解答以下的问题,关于Theis can be done from within Surveycraft via the Util...,15.071x The Analytics Edge:Logistic Regression这个很多人还不知道,现在让我们一起来看看吧!
读取数据集:framingham=read.csv("framingham.csv")。
建立逻辑回归模型,先安装,再加载caTools库:library(caTools)
划分数据集为训练集train和测试集test:
先设置随机种子,比如set.seed(1000);set.seed()与sample.split()配套使用才会保证每次结果不变化。
split=sample.split(framingham$TenYearCHD,SplitRatio=0.65),其中TenYearCHD为预建立模型的因变量;65%的数据集作为训练集,35%的为测试集;
train=subset(framingham,split==TRUE);
test=subset(framingham,split==FALSE)。
建立模型:使用glm()函数,“glm”意为“广义线性模型”,train中的TenYearCHD~.表示TenYearCHD作为因变量,其余变量为自变量,需要添加family=binomial参数。
framinghamLog=glm(TenYearCHD~.,data=train,family=binomial);
总结模型,查看各个变量前系数以及变量对模型重要性和模型AIC:summary(framinghamLog)。AIC相当于线性回归中的AdjustedR-squared,更好的模型通常有更小的AIC。
在测试集上做预测:
predictTest=predict(framinghamLog,type="response",newdata=test),predictTest为测试集上每个对象对应的概率;可使用summary(predictTest)查看变量统计学信息;。type="response"是使模型给出我们概率。
使用混淆矩阵评估模型:
混淆矩阵:table(test$TenYearCHD,predictTest>0.5);
准确率:(1069+11)/(1069+6+187+11)
基线模型准确率:(1069+6)/(1069+6+187+11)
计算Sensitivity和specificity:(高阈值t:lowersensitivity(真阳性率)andahigherspecificity;低阈值:ahighersensitivityandalowerspecificity.)
计算测试集的AUC,先安装加载ROCR包:
ROCRpred=prediction(predictTest,test$TenYearCHD)
as.numeric(performance(ROCRpred,"auc")@y.values)
使用quality.csv数据集,读取数据quality=read.csv("quality.csv")
split=sample.split(quality$PoorCare,SplitRatio=0.75)
qualityTrain=subset(quality,split==TRUE)
qualityTest=subset(quality,split==FALSE)
QualityLog=glm(PoorCare~StartedOnCombination+ProviderCount,data=qualityTrain,family=binomial)
predictTrain=predict(QualityLog,type="response")
在训练集上分析预测结果predictions:
tapply(predictTrain,qualityTrain$PoorCare,mean):输出结果:0:0.19;1:0.44。即实际为poorcare(1)的平均概率0.44;实际为goodcare(0)的平均概率0.19。
table(qualityTrain$PoorCare,predictTrain>0.5),0.5为设置的阈值t,阈值t的选择基于error,两类error之间不存在偏好时,则选择t=0.5;选择阈值的好办法是在训练集上计算然后画ROC曲线,选择合适的阈值。
在训练集上计算然后画ROC曲线,选择合适的阈值(不一定是0.5):
先加载ROCR库,library(ROCR)。
ROCRpred=prediction(predictTrain,qualityTrain$PoorCare)
ROCRperf=performance(ROCRpred,"tpr","fpr")
画图ROC图,colorize=TRUE控制颜色,print.cutoffs.at=seq(0,1,by=0.1)增加阈值标签。
plot(ROCRperf,colorize=TRUE,print.cutoffs.at=seq(0,1,by=0.1),text.adj=c(-0.2,1.7))
predictTest=predict(QualityLog,type="response",newdata=qualityTest)
ROCRpredTest=prediction(predictTest,qualityTest$PoorCare)
auc=as.numeric(performance(ROCRpredTest,"auc")@y.values)
选择阈值t,应该尽量使真阳性率更大,即sensitivity大,假阳性率更小。
处理缺失值问题:使用mice库,将缺失值根据合理的信息填充,即观察对象数目没变。install.packages("mice")
那么遇到缺失值如何处理?是填充还是移除?
移除后,数据会不会太少?移除数据后会不会对模型产生偏见?(可以subset(),看缺失值的观察对象具体有多少,然后查看有缺失值的观察的相关统计量与整个数据集是否有较大差别,如无较大差别,移除不会产生偏见。一般使用填充缺失值的方法。)见课程TheAnalyticsEdge第三周的第三个Assignment。
查看数据集统计学信息、是否有缺失值summary(polling)
polling的Rasmussen,SurveyUSA两个变量有缺失值,使用mice()函数,还有set.seed()
simple=polling[c("Rasmussen","SurveyUSA")]
imputed=complete(mice(simple))
polling$Rasmussen=imputed$Rasmussen
polling$SurveyUSA=imputed$SurveyUSA
polling数据集已经没有缺失值了!
写成csv文件查看!
write.csv(polling,"Polling1.csv")
符号函数sign():sign(20)=1;sign(-10)=-1;sign(0)=0
smartbaselinemodel:table(sign(Train$Rasmussen));table(Train$Republican,sign(Train$Rasmussen))
二分类中的Odds:(poorcare:y=1;goodcare:y=0)
log(Odds)=beta0+beta1*x1+……+betan*xn,betai为正,增加Odds;log(Odds)称为“Logits",Logits越大,p(y=1)越大。
以parole.csv数据集为例,parole=read.csv("parole.csv"),其中state和crime为parole数据集的至少3个level的两个unorderfactorvarible。先使用as.factor()函数转为factorvarible。
state:acodefortheparolee'sstate.2isKentucky,3isLouisiana,4isVirginia,and1isanyotherstate.Thethreestateswereselectedduetohavingahighrepresentationinthedataset.
crime:acodefortheparolee'smaincrimeleadingtoincarceration.2islarceny,3isdrug-relatedcrime,4isdriving-relatedcrime,and1isanyothercrime.
parole$state=as.factor(parole$state)
parole$crime=as.factor(parole$crime)
split=sample.split(parole$violator,SplitRatio=0.7)
train=subset(parole,split==TRUE)
test=subset(parole,split==FALSE)
mod=glm(violator~.,data=train,family="binomial")
summary(mod)的输出结果:
log(odds)=-4.2411574+0.3869904*male+0.8867192*race-0.0001756*age+0.4433007*state2+0.8349797*state3-3.3967878*state4-0.1238867*time.served+0.0802954*max.sentence+1.6119919*multiple.offenses+0.6837143*crime2-0.2781054*crime3-0.0117627*crime4.
ifaparoleewhoismale,ofwhiterace,aged50yearsatprisonrelease,fromthestateofMaryland,served3months,hadamaximumsentenceof12months,didnotcommitmultipleoffenses,andcommittedalarceny
Thisparoleehasmale=1,race=1,age=50,state2=0,state3=0,state4=0,time.served=3,max.sentence=12,multiple.offenses=0,crime2=1,crime3=0,crime4=0.Weconcludethatlog(odds)=-1.700629.
Therefore,theoddsratioisexp(-1.700629)=0.183,andthepredictedprobabilityofviolationis1/(1+exp(1.700629))=0.154.
以loans.csv文件为例(完整代码):
missing=subset(loans,is.na(log.annual.inc)|is.na(days.with.cr.line)|is.na(revol.util)|is.na(inq.last.6mths)|is.na(delinq.2yrs)|is.na(pub.rec))
vars.for.imputation=setdiff(names(loans),"not.fully.paid")
imputed=complete(mice(loans[vars.for.imputation]))
loans[vars.for.imputation]=imputed
spl=sample.split(loans$not.fully.paid,0.7)
mod=glm(not.fully.paid~.,data=train,family="binomial")
test$predicted.risk=predict(mod,newdata=test,type="response")
table(test$not.fully.paid,test$predicted.risk>0.5)
pred=prediction(test$predicted.risk,test$not.fully.paid)
as.numeric(performance(pred,"auc")@y.values)
#模型的auc与选择的阈值t有关。TheAUCdealswithdifferentiatingbetweenarandomlyselectedpositiveand#negativeexample.Itisindependentoftheregressioncutoffselected.
Theis can be done from within Surveycraft via the Util...的介绍就聊到这里吧,感谢你花时间阅读本站内容,更多关于15.071x The Analytics Edge:Logistic Regression、Theis can be done from within Surveycraft via the Util...的信息别忘了在本站进行查找哦。