当我们检验分类变量时,会立刻想到用卡方检验,但卡方检验无法对连续性自变量进行检验;而传统的模型框架下,加权最小二乘法不适用于二分类因变量。
当因变量为分类因变量或发生的概率时,此时就要用到Logistic回归。
Logit变换与Logistic回归
- odds=p/(1-p) 比值或优势,取对数ln(odds) 这就是Logit变换 ,odds是以0.5为对称点,分布在0-1分为内,那么ln(odds)的范围就算正负无穷。大量实践证明ln(odds)往往和自变量呈线性关系,即概率和自变量间的S型曲线关系往往就符合Logit函数关系。
- 结果变量是类别型的(二值)模型假设Y服从二项分布 Π=μy是y的条件均值(即y=1的概率) Π/(1- Π)为y=1的优势,ln( Π/(1- Π)) 对数优势(即进行logit变换),为连接函数,概率分布为二项分布:
- 适用条件:1.因变量为二分类变量或某事发生的概率;2.自变量与ln(odds)之间为线性关系;3.残差合计为0,且服从二项分布;4.各观测间相互独立。
R语句形式为:glm(Y~x1+X2+x3,family=binomial(link="logit"),date=mydata)
案例实践:预测消费者行为
数据预处理
数据集:Advertsing
各列以及含义:
- #'Daily Time Spent on Site': consumer time on site in minutes
- #'Age': cutomer age in years
- #'Area Income': Avg. Income of geographical area of consumer
- #'Daily Internet Usage': Avg. minutes a day consumer is on the internet
- #'Ad Topic Line': Headline of the advertisement
- #'City': City of consumer
- #'Male': Whether or not consumer was male
- #'Country': Country of consumer
- #'Timestamp': Time at which consumer clicked on Ad or closed window
- #'Clicked on Ad': 0 or 1 indicated clicking on Ad
部分数据预览:
接下来对数据进行预处理,具体包括:
- 简化列名,各列名变为:"Site_time","Age","Income","Internet_time","Topic","City","Gender","Country","Timestamp","Click"
- 删除不需要的列(第5,6,8,9列)
- 查看各列数据属性(各列均为数值型),将Gender改为因子型
- 查看缺失值(此数据各列无缺失值)
经过一番处理后,得到我们要分析的数据表。
回归模型
接下来是回归分析过程,首先按照4:1划分训练数据集和验证数据集,使用随机抽样的方式抽出800条数据作为训练数据集,其余200条数据作为验证数据集。
model<-glm(Click~.,family = binomial(),data = train_data)
5个自变量中仅有Gender不显著,各自变量回归系数β及对应的P值如下表所示:
回归模型可表示为:
ln(p/(1-p))=-0.19897*Site_time + 0.18252*Age – 0.00015*Income – 0.06288*Internet_time
其中P为点击广告的概率
模型解释
上表中不仅列出了回归系数β,还列出了exp(β),这主要是为了更好理解结果。
- Logitstic回归模型的左边是优势(odds)取对数,回归系数b表示,x每变化一个单位,odds变化量的对数,即ln(odds2)-ln(odds1)=ln(odds2/odds1),即优势比的对数。
- 那么对系数exp()之后,左边就变成了优势odds,此时右边exp(β)的变化带来的是左边odds变化的倍数。这样把系数exp指数化后,更好理解一些。
因此,本模型的解释为,Site_time每增加一分钟,点击广告的优势(=点击的概率/不点击的概率)变为原来的81.96%;年龄每增加一岁,点击广告的优势变为原来的120.02%。
数据预测
- 使用上述回归模型,首先验证train_data中的预测准确率
- y_pre_train<-predict(model,newdata = train_data,type = "response")
- 这里我们默认以0.5为分界点,如果y_pre_train>0.5取值为1,否则取值为0.
- y_bio_train<-ifelse(y_pre_train>0.5,1,0)
- 查看预测值与实际值的差异并计算准确率,得出准确率为97.4%:
- table(train_data$Click,y_bio_train)
- Accuracy<-1-sum(y_bio_train!=train_data$Click)/800
事实上,分界点取值多少最合理,可以通过ROC曲线的最大AUC值找到。下面通过pROC包自动标出最优临界,使用train_data找出的临界值为0.6,即如果y_pre_train>0.6,取值为1,否则取值为0。AUC值为0.992,具备较高的预测价值。
- modelroc<-roc(train_data$Click,y_pre_train)
- 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)
我们以0.6为分界点,预测test_data的准确率,准确率为96%。
- y_pre_test<-predict(model,newdata = test_data,type = "response")
- y_bio_test<-ifelse(y_pre_test>0.6,1,0)
- table(test_data$Click,y_bio_test)
- Accuracy<-1-sum(y_bio_test!=test_data$Click)/200
关于ROC曲线与AUC值
横坐标:1-Specificity,伪正类率(False positive rate, FPR),预测为正但实际为负的样本占所有负例样本的比例;
纵坐标:Sensitivity,真正类率(True positive rate, TPR),预测为正且实际为正的样本占所有正例样本的比例。
在一个二分类模型中,假设采用逻辑回归分类器,其给出针对每个实例为正类的概率,那么通过设定一个阈值如0.6,概率大于等于0.6的为正类,小于0.6的为负类。对应的就可以算出一组(FPR,TPR),在平面中得到对应坐标点。随着阈值的逐渐减小,越来越多的实例被划分为正类,但是这些正类中同样也掺杂着真正的负实例,即TPR和FPR会同时增大。阈值最大时,对应坐标点为(0,0),阈值最小时,对应坐标点(1,1)。
AUC (Area Under Curve) 被定义为ROC曲线下的面积,显然这个面积的数值不会大于1。又由于ROC曲线一般都处于y=x这条直线的上方,所以AUC的取值范围一般在0.5和1之间。简单说:AUC值越大的分类器,正确率越高,可以根据AUC最大值来确定分类边界。但也有观点认为,AUC大,但预测正确率不一定高,正确率和AUC之间,应该选择AUC。如果您有其他的理解,欢迎一起讨论。
参考资料:
- 《R语言实战》Chapter13广义线性模型
- 《SPSS统计分析高级教程》第10章二分类Logistic回归模型
- 数据来源:Kaggle, https://www.kaggle.com/fayomi/advertising
R详细源码详见公众号,欢迎关注一起学习交流~
【R语言】Logistic回归——消费者点击广告行为预测mp.weixin.qq.com