结合源码分析第五章中实现的Demo
运行环境:Anaconda——Jupyter Notebook
Python版本为:3.6.2(原书代码实现为2.x 所以在一些代码上略有改动)
参考资料:
Hands-On Machine Learning with Scikit-Learn and TensorFlow
阅读本文你将获得如下知识:
- 1.LR的基本思想
- 2.LR的优缺点
- 3.用于求解无约束条件的最优化方法——GD以及SGD
- 4.处理数据集中缺失值的基本思路
- 5.一个具体的实例,了解LR使用的整个流程
前言
Logistic回归其实更常被用作在分类中。它与传统的线性回归模型相比,多了一步将输出值映射到Sigmoid函数上,进而得到一个范围在0~1之间的数值。我们可以定义大于0.5的数据为1(正)类,而小于0.5被归为0(负)类。由于函数本身的特殊性质,它更加稳定,并且它本质上仍然是线性模型。
优点:
* 计算代价不高,容易理解和实现
缺点:
* 容易欠拟合,分类精度可能不高
我们来具体看一下这个函数的样子:
那么LR的训练过程做了什么呢?就是找到一个最佳的分类回归系数(Weights)
我们将Sigmoid函数的输入记作Z,现实中,某事件的发生一般都是与多种因素相关联的,所以:
Z=W0X0 + W1X1 + … +WnXn 我们可以写成向量的形式:
所以这里的W就是我们要找的最佳分类回归系数啦。
如何寻找该系数呢?这里我们使用梯度下降(上升)法,这里下降与上升只是一个符号的区别,但是本质上都是沿着该函数的梯度方向探寻,这里讲了方向,并未讲到移动量的大小。我们可以称其为步长a。这里步长的选取是有说法的,如果选取太大会导致结果发散;如果选取得太小呢又会使得时间复杂度很高。
停止条件呢?通常我们可以设置迭代次数,也可以设置一个迭代终止的误差条件。
使用梯度上升找到最佳参数
from numpy import *
import matplotlib.pyplot as plt
#Logistic回归梯度上升优化算法
#读取数据
def loadDataSet():
dataMat = []
labelMat = []
fr = open('TestSet.txt')
for line in fr.readlines():
lineArr = line.strip().split('\t')
# 为了方便计算,我们将 X0 的值设为 1.0 ,也就是在每一行的开头添加一个 1.0 作为 X0
dataMat.append([1.0, float(lineArr[0]), float(lineArr[1])])
labelMat.append(int(lineArr[2]))
return dataMat, labelMat
#定义sigmoid函数
def sigmoid(inX):
return 1.0/(1+exp(-inX))
#输入数据特征与数据的类别标签
#返回最佳回归系数(weights)
def gradAscent(dataMatIn, classLabels):
#转换为numpy型
dataMatrix = mat(dataMa