一、logistic回归的引出
1. 关于多重回归的虚拟因变量分析
- 表面上看,多重回归也可以用来分析一个值为0或1的二分因变量,回归系数针对虚拟因变量的解释是有意义的——自变量每变化一个单位,回归系数可以解释为有某种特性或经历某事件的概率升高或者降低,即他们显示了自变量每变化一个单位,预测到因变量值为1的受访者所占的比例。研究人员在熟悉了比例和概率后,就会对这样的解释得心应手。
- 因变量只能取0或1,但通过回归预测的值是控制了自变量后得出的平均比例或者概率。预测值或者条件平均数越高,自变量上取特定分数的人就可能更具有某种特征或者经历某个事件。线性回归的假设就是,条件比例或概率与X的值的关系呈一条直线。
- For example:全国民意调查机构(NORC)在1994年的综合社会调查(GSS)中让受访者回答他们是否吸烟,将吸烟者记为1而非吸烟者记为0从而创造了一个虚拟因变量。因变量吸烟(S)用教育年限(E)和虚拟变量性别(G)(女性记为1)的函数表示,在回归方程中为:S=0.661−0.29∗E+0.004∗G, 教育的回归系数便是教育每增长一年,吸烟的概率下降了0.029,没有接受过教育的受访者吸烟的概率是0.661(截距)。一个接受了十年教育的男性中有37%吸烟。在没有接受过教育的情况下,女性的吸烟概率是0.665(0.661+0.004)
- 尽管有一个虚拟变量做因变量,回归系数的结束并不复杂,但这样的回归估计面临两个问题,一种问题的本质是概念性的,另一种问题的本质是统计性的,在用普通线性回归来处理定性的因变量时,这两个问题已经严重到需要我们寻求其他方式来处理定性问题的因变量。
2.函数形式的问题
- 概念性的问题来自在含有虚拟因变量的线性回归中,概率的最大值本应该是1,最小值本应该是0,根据定义名概率机概率的比例不应该超过1或小于0,可是在线性回归中,当自变量的值无限增加时,它可以向上趋向与正无穷;当自变量无限减小的时候,线性回归可以向下限趋向于负无穷。根据斜率和观察到的X值,线性回归到模型可以让因变量的预测值超过1或者小于0,这样的值是没有意义的,而且基本没有预测的价值。
- 几张图可以说明这个问题:
在图a中,两个连续变量正常的散点图呈现云状图,一条穿过这些点中间的直线能使得方差最小,而且,至少从理论上来讲,当X向更高或者更低的值延续的时候,Y也如此。同一直线在X的值比较大的时候可以预测对应的Y值,也可以在X值中等或较小时预测Y的值,然而,一个虚拟因变量产生的散点图,如图b所示,并不是云状的散点,它呈现两个平行的图样的点集。在这里虚拟一条直线似乎不合适,任何直线最终都会超过1或者小于0。
二、逻辑回归模型
1、逻辑函数(sigmod函数)
Sigmoid函数由下列公式定义:
S(x)=1e−x
函数的图像为:
从上图我们可以看出,函数接收整个实数范围的输入,输出0到1之间的数。因此,
S(w0x0+w1x1+⋯+wnxn)=P(y=1|x;w)这个概率我们可以解释成:给定用权重w参数化后的特征x,样本属于类别1的概率。通过阶跃函数(step function),我们可以得到如下公式:
f(n)={1,if(S(h)≥0.5)0,otherwise
2、最大似然估计(maximum likelihood)
这个方法的本质就是:选择最佳的参数值w,来最大化我们样本数据的可能性。假设我们给定样本
X1,X2,X3,…,Xn,那么我可以写出一个关于参数w的可能性函数,如下:like(w)=f(X1,X2,X3,…,Xn|w)实际上,可能性函数就是样本数据作为参数w的函数的概率。如果X1,X2,X3,…,Xn相互之间是独立的,可能性函数可以简化成如下形式:
like(w)=∏1n[f(Xi|w)]之后,对函数求对数:
l(w)=log(lik(w))=∑1nlog(f(Xi|w))继续,对每一个w求偏导数。使其为0。
三、代码实现(iris数据集)
from sklearn.datasets import load_iris
import matplotlib.pyplot as plt
from sklearn.decomposition import PCA
iris=load_iris()
label=iris.target
pca = PCA(n_components=2)
aft_data=pca.fit_transform(data)
plt.scatter(aft_data[:50, 0], aft_data[:50, 1],color='violet', marker='x', label='setosa')
plt.scatter(aft_data[50:100, 0], aft_data[50:100, 1],color='yellow', marker='*', label='versicolor')
plt.scatter(aft_data[100:, 0], aft_data[100:, 1],color='black', marker='+', label='Virginica')
plt.legend(loc=2)
plt.show()
首先,把iris数据导入,由于iris数据集共有四个维度,这里我们使用sklearn中的PCA降维到二维,通过python中的pyplot库可以查看降维后的分布。
由此,我们可以清楚的看到降维后的数据的二维分布。
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import accuracy_score
data_train,data_test,label_train,label_test=train_test_split(aft_data,basic,test_size=0.3)
clf=LogisticRegression()
clf.fit(data_train,label_train)
pred=clf.predict(data_test)
acc=accuracy_score(label_test,pred)
print (acc)
0.933333333333
- 我们通过train_test_split把原始数据分成了训练集和验证集。再去训练logistic回归,然后进行分类。最后进行准确率判定。由于数据的划分随机,准确率并不是一个稳定的数值,在0.8-0.95的区间波动。