一、Logistic回归的基本概念
1.1 基本概念
Logistic回归(logistic regression)是统计学习中的经典分类方法,属于对数线性模型,所以也被称为对数几率回归。假设现在有一些数据点,我们利用一条直线对这些点进行拟合(该线称为最佳拟合直线),这个拟合过程就称作为回归,如下图所示:
这里要注意,虽然带有回归的字眼,但是该模型是一种分类算法,Logistic回归是一种线性分类器,针对的是线性可分问题。利用logistic回归进行分类的主要思想是:根据现有的数据对分类边界线建立回归公式,以此进行分类。简单来说, 逻辑回归(Logistic Regression)是一种用于解决二分类(0 or 1)问题的机器学习方法,用于估计某种事物的可能性。比如某用户购买某商品的可能性,某病人患有某种疾病的可能性,以及某广告被用户点击的可能性等。 注意,这里用的是“可能性”,而非数学上的“概率”,logisitc回归的结果并非数学定义中的概率值,不可以直接当做概率值来用。该结果往往用于和其他特征值加权求和,而非直接相乘。
1.2回归过程
logistic回归一般过程就是:(1)收集数据 (2)准备数据 (3)分析数据 (4)训练算法 (5)测试算法 (6)使用算法
1.3基于Logistic回归和Sigmoid函数的分类
我们想要的函数应该是: 能接受所有的输入然后预测出类别。例如,在两个类的情况下,上述函数输出 0 或 1。有一个函数具有类似的性质(可以输出 0 或者 1 的性质),且数学上更易处理,这就是 Sigmoid 函数。 Sigmoid 函数具体的计算公式如下:
我们可以在每个特征上都乘以一个回归系数,然后将所有值累加,将中国总和带入Sigmoid 函数中,得到一个范围在[0,1]的数值,小于0.5归为0类,导游0.5归为1类。所以Logistic回归可以看出是一种概率估计。 Sigmoid 函数的函数输入记为z,由下面公式得出:
采用向量的写法可以写成,它表示 将两个数值向量对于元素相乘然后相加得到z值。x为分类器输入数值,w为我们要找的最佳参数。
二、最佳回归系数确定方法
2.1梯度概念
向量G称为函数f ( P ) f(P)f(P)在点P处的梯度(gradient),记为gradf。
据上面梯度推导,可知:
因此当方向一致时,取最大值,所以函数的某一点沿梯度方向变化率最大,最大值为该梯度的模.
2.2梯度上升法
基本思想:要找到某函数的最大值,最好的方法是沿着该函数的梯度方向探寻。如果梯度记为▽,则函数f(x,y)的梯度由下式表示:
梯度上升法又称为最速上升法,即求函数f(x)极大值,可任意选初始点x0,从x0出发沿着梯度方向搜索,可使 f(x)上升最快,如图所示。
算法流程:
三、代码实现
数据集
第一列为传球次数,第二列为回传次数,第三列1表示在禁区,0表示在中场。
源代码:
from matplotlib import pyplot as plt
import numpy as ny
def loadDataSet():
dataMat = []
labelMat = []
fr = open('E:/test.txt')
for line in fr.readlines():
lineArr = line.strip().split()
dataMat.append([1.0, float(lineArr[0]), float(lineArr[1])])
labelMat.append(int(lineArr[2]))
return dataMat, labelMat
def sigmoid(inX):
return 1.0 / (1 + ny.exp(-inX))
def gradAscent(dataMatIn, classLabels):
dataMatrix = ny.mat(dataMatIn)
labelMat = ny.mat(classLabels).transpose()
m, n = ny.shape(dataMatrix)
alpha = 0.01
maxCycles = 500
weights = ny.ones((n, 1))
for k in range(maxCycles):
h = sigmoid(dataMatrix * weights)
error = (labelMat - h)
weights = weights + alpha * dataMatrix.transpose() * error
return weights
def plotBestFit(weights):
dataMat, labelMat = loadDataSet()
dataArr = ny.array(dataMat)
n = ny.shape(dataArr)[0]
xcord1 = []; ycord1 = []
xcord2 = []; ycord2 = []
for i in range(n):
if int(labelMat[i]) == 1:
xcord1.append(dataArr[i, 1]); ycord1.append(dataArr[i, 2])
else:
xcord2.append(dataArr[i, 1]); ycord2.append(dataArr[i, 2])
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False
fig = plt.figure()
ax = fig.add_subplot(111)
ax.scatter(xcord1, ycord1, s=20, c='red', marker='s')
ax.scatter(xcord2, ycord2, s=20, c='blue')
x = ny.arange(1.0, 20.0, 0.01)
y = (-weights[0] - weights[1] * x) / weights[2]
ax.plot(x, y)
plt.title('世界杯球员在场上的过人与回传选择')
plt.xlabel('过人次数'); plt.ylabel('回传次数')
plt.show()
dataMat, labelMat = loadDataSet()
weigths = gradAscent(dataMat, labelMat)
showData()
plotBestFit(weigths.getA())
代码实现结果:
四、Logistic回归算法优缺点:
优点:
(1)训练速度较快,分类的时候,计算量仅仅只和特征的数目相关;
(2)简单易理解,模型的可解释性非常好,从特征的权重可以看到不同的特征对最后结果的影响;
(3)适合二分类问题,不需要缩放输入特征;
(4)内存资源占用小,因为只需要存储各个维度的特征值;
缺点:
(1)不能用Logistic回归去解决非线性问题,因为Logistic的决策面试线性的;
(2)对多重共线性数据较为敏感;
(3)很难处理数据不平衡的问题;
(4)准确率并不是很高,因为形式非常的简单(非常类似线性模型),很难去拟合数据的真实分布;
(5)逻辑回归本身无法筛选特征,有时会用gbdt来筛选特征,然后再上逻辑回归