统计学习方法-逻辑斯蒂回归笔记

逻辑斯蒂回归(logistic regression)是一个非常常见的统计学分类方法,虽然其名字中带有回归两个字,但是其主要还是用于解决二分类的问题;至于逻辑斯蒂这个绕口的名字,则是来源于逻辑斯蒂分布

Logistic回归本质还是一个基于条件概率的判别模型,但其有利用了Sigma函数将任意的输入映射到[0,1]区间内

从其逻辑斯蒂回归模型公式(《统计分析学习》6.3)可看出,其还是带有线性回归的一点意思w*x+b,w是权值而b则是偏置;所以我们从上述线性回归方程中获得一个预测值,再通过Sigma函数即可将预测值转变成概率;因此大致可以理解为:逻辑斯蒂模型是线性回归模型套上了Sigma的壳,并且其还有很好的特性:当线性函数w*x的值接近于正无穷的时候,其概率值(条件概率)就接近于1,反之当线性函数的值接近于负无穷时,其概率值接近于0

对于分类问题,一般情况下,如果模型的值是大于0.5,则其分为正类或者说1,反之则为反类或者说0,而决定0.5的因素是各个特征的权重,即w参数

对于上述模型的解释,还有一种类似说法则是:

逻辑斯蒂回归是一种以概率的变化为因变量的近似线性回归的分析工具,即当一件事的几率(odds)等于该事件发生的概率除以该事件不发生的概率的比值取对数,其结果刚好等于w*x,这就是输出Y=1的对数几率是由输入X的线性函数表示的模型,即先把特征线性求和,然后使用sigmoid函数来预测

所以说,Logistic回归本质是还是个线性回归模型,当你除去Sigma函数映射后,剩下的都是线性回归的思路;由于w*x是线性函数,所以需要自变量X与应变量y之间需要满足单调递增/递减的关系,不然就不能用Logistic回归,因此要选择与应变量呈线性的自变量,除非你将特征进行转化变成线性

因此我们只要能估计模型参数w,即可计算出线性回归的预测值,然后就可以转化为分类数值了;Logistic回归毕竟不是线性回归模型,所以不能用误差平方和来估计参数,而是用了极大似然法,至于什么是极大似然法(ML)可以看一文搞懂极大似然估计

简单的说,如果我们在模型确定条件下,对于样本的情况已经发生,想知道模型参数是什么,那么就可以用极大似然法估计,让确实已经发生的样本的出现概率最大,需满足的重要假设是所有采样都是独立同分布的

按照极大似然法的概念,对应到Logistic回归模型中,那意思就是:

有一个数据集,其中每个样本的标签是已经确定的,每个样本的特征值也是确定的,所以模型也是确定的;但是我们不知道模型的参数w是多少,但我们要让这个标签出现的概率最大;所以有一个计算概率的式子,根据公式6.3和6.4,写成一个通用式就可以确定一个似然函数,即求概率的方程;接下来我们则需计算这个似然函数达到最大值时的参数w,常规的方法:对似然函数取ln对数,求导,获得似然方程,解方程得参数

似然函数推导过程这里不展开了,可以参照机器学习之_逻辑回归,其是按照梯度上升法来解对数似然函数最优值的问题,其中如果在似然函数前面加个负号,则就可以变成用梯度下降法来求解了,不断迭代直至w参数收敛

除了模型参数估计外,Logistic回归也会面临过拟合的问题,所以我们要考虑正则化(先简单理解下,机器学习之正则化(Regularization)),所以会在上述的损失函数(即似然函数)中加上正则化项,常见的有L1正则化和L2正则化;其中在实际使用时,不同的正则化方法需要考虑不同的损失函数优化方法(坐标轴下降=》L1正则化,梯度下降=》L2正则化)

Logistic回归的优缺点,也有人整理了下逻辑回归算法的优缺点,其中有个缺点比较明显:特征空间很大或者处理大量多类特征或变量时效果不是很好

最后则是Logistic回归的Python实现,写的比较简单,主要是过下思路,并没有考虑过多的优化及细节;用的是梯度下降法,迭代一定次数(1000次)后即停止,学习速率为0.001

class logisticRegression:
    # Sigmoid函数
    def sigmoid(self, z):
        return 1/(1+np.exp(-z))

    # 在对数似然函数导数前面加了负号,因此用梯度下降法,运用矩阵计算,迭代1000次,求解w
    def gradient_descent(self, X, y, item = 1000, alpha = 0.001):
        w = np.ones((X.shape[1],1))
        for i in range(item):
            h = self.sigmoid(np.dot(X, w))
            error = h - y
            w -= alpha * np.dot(X.T, error) 
        return w

    # 计算wx,通过公式6.3确定分类值
    def predict(self, w, test):
        p1 = self.sigmoid(np.dot(test, w))
        if p1 >= 0.5:
            return 1
        else:
            return 0

然后使用测试数据集(二维的):testSet.txt

读入数据,并且按照逻辑回归模型在输入特征的最后一列新增都为1的列

import numpy as np
import pandas as pd
from sklearn.model_selection import train_test_split

dataset = pd.read_table("testSet.txt", header = None)
dataset = np.mat(dataset)
X = dataset[:,:-1]
y = dataset[:,-1]
X = np.insert(X, X.shape[1], values = 1, axis = 1)

将测试数据集分割成训练集和测试集

train_X, test_X, train_y, test_y = train_test_split(X, y, test_size = 0.2, random_state = 123456)

最后构建Logistic回归模型,预测测试集的结果,误差为0

LR = logisticRegression()
w = LR.gradient_descent(train_X, train_y, alpha = 0.001, item = 1000)

error = 0
for i in range(len(test_X)):
    predict_y = LR.predict(w, test_X[i,:])
    if predict_y != test_y[i]:
        error += 1
print(error / len(test_y) * 100)

参考资料:
Logistic Regression 的前世今生(理论篇)
机器学习之_逻辑回归
深入浅出最大似然估计(Maximum Likelihood Estimation)
机器学习算法 之逻辑回归以及python实现
逻辑回归原理小结
机器学习实战-logistic回归随机梯度上升浅见

本文出自于http://www.bioinfo-scrounger.com转载请注明出处

文章目录
|