首先需要明确一点是logistics回归和线性回归的区别:
1线性回归的因变量Y是连续性变量,而logistics回归是分类变量。
2线性回归最后可以通过函数y=a1x1+a2x2...去描述,而logistics的方程是这样的
好吧,大学数学忘了差不多了,反正可以理解为是一个概率函数吧。所以logistics回归的因变量y的值是在0-1之间的,得到的数值y可以看做属于类别1的概率,当0.5≤y≤1,则说明是类别1,不然则是类别0。
Logistics主要会用做二分类的问题,典型的一个场景比如说:
分类问题示例:信用卡
从x1:职业,x2:收入,x3:年龄等等信用卡申请人不同的信息维度,来判断y:是否发放信用卡,发放哪一类信用卡
这里这次探究的数据来自于《谁说菜鸟不会数据分析-spss篇》中的华南区商户续约数据,数据大体有这么些维度:
根据注册市场,营业收入,成本等维度可以去预测这家商户是否还会继续续约。
在SPSS中方法是比较简单的,直接通过分析--二元Logistics回归即可
输出的总体正确率为73.1%,其中对角线上的300和797分别表示“未续约”和“续约”的预测正确个数。
而且三个特征以及常量的显著性均小于0.01,说明都具有极其显著的统计学意义,应纳入Logistics模型中。那实际上就可以得到方程式
logit(P)=-2.287+0.099*注册时长+0.014*营业收入-0.184*成本。
通过这个方程式计算概率的话就可以得到预测的分类到底是续约还是不续约。
接下来对比一下在python中用Logistics回归得到的结果会是如何?数据源链接如下(CSV格式):
主要还是用numpy,pandas以及scikit-learn三件套为主。
import pandas
sc=pandas.read_csv('D:\\SC-sales.csv',encoding='utf-8')
sc.info()
pandas导入后通过info看到共1500行数据,无空值,可以直接开始后面的操作
import sklearn
import numpy as np
from sklearn import linear_model
lm=linear_model.LogisticRegression() #这里使用LogisticRegression的默认参数
features=['注册时长','营业收入','成本']
x=sc[features]
y=sc['续约']
from sklearn.model_selection import cross_val_score
#logistic中的scoring参数指定为accuracy
scores=cross_val_score(lm,x,y,cv=5,scoring='accuracy') #cv=5即是5折交叉检验
print(np.mean(scores)) #求平均的交叉检验的值
#结果输出为0.728015363134
可以看到这个结果基本上和SPSS做出来是一样的,关于交叉检验在引用一下说明顺便也当复习一下。在机器学习中,交叉检验常被用来检验模型好坏,本质上好处是可以从有限的数据中获得尽可能多的有效信息,从而可以从多个角度去学习样本,避免陷入局部的极值。在这个过程中,无论是训练样本还是测试样本都得到了尽可能多的学习。
一般检验方法常见的有:k-folds 交叉验证法(常见用5折或者10折),leave-one-out 法(留一法)k-folds交叉验证法: 也叫k折交叉验证法,将初始数据集分割成 k 份,其中1份被保留作为验证模型的数据,其他 k-1 份用来训练。交叉验证重复 k 次,每份数据作为验证集验证一次,平均 k 次的结果或者使用其它结合方式,最终得到一个单一估测
leave-one-out 法:也叫留一交叉验证法,只使用原本样本中的一项来当做验证集, 而剩余的则留下来当做训练集。 这个步骤一直持续到每个样本都被当做一次验证数据
所以当k取n时实际上两者是等价的。
综上来看,用LR进行预测总体来说并不是特别好,下一步可以考虑用决策树和随机森林再来进行尝试。