6.1Logistic回归概述
逻辑回归是一种用于解决分类问题的统计学习方法。它用于预测一个二元变量(如"是"或"否"、"成功"或"失败")的概率。
逻辑回归基于线性回归模型,但使用了一个称为逻辑函数(也称为sigmoid函数)来将线性输出转换为概率值。逻辑函数的取值范围在0和1之间,可以将线性输出映射到概率。
逻辑回归模型假设输入特征与输出之间存在一种线性关系,并使用最大似然估计等方法来拟合模型参数。训练完成后,可以使用逻辑回归模型进行新样本的分类预测。
逻辑回归在许多领域中被广泛应用,包括医学、金融、市场营销和社会科学等。它的优点包括计算效率高、模型可解释性强、易于实现和调整。
值得注意的是,尽管名字中包含"回归"一词,但逻辑回归是一种分类算法,而不是回归算法。
6.1.1逻辑回归原理
逻辑回归的输入值是什么?如何判断逻辑回归的输出?
基本假设:逻辑回归假设输入特征与输出之间存在一种线性关系,即通过输入特征的线性组合来预测输出的对数几率。
逻辑函数(sigmoid函数):逻辑回归使用逻辑函数将线性输出转换为概率值。
决策边界:通过设定一个阈值(通常为0.5),根据逻辑函数输出的概率值来进行分类决策。当概率值大于阈值时,预测为正类;当概率值小于等于阈值时,预测为负类。
模型参数估计:逻辑回归使用最大似然估计等方法来估计模型参数,使得模型预测的概率尽可能接近真实标签的分布。
损失函数:在逻辑回归中通常使用对数损失函数来衡量模型预测值与真实标签之间的差距。
训练完成后,逻辑回归模型可以用于对新样本进行分类预测
6.1.2线性回归模型
其形式为:
表示为向量形式为:
逻辑回归的输入就是线性回归的结果
其作用是预测真实值:
6.1.3最小二乘法
最小二乘法的核心思想是通过最小化数据点与拟合曲线之间的平方和来找到最佳的拟合模型。在多元线性回归中,我们试图找到一条直线,使得数据点与这条直线之间的平方和最小。
计算回归预测值与真实值的误差
公式表示为:
具体操作步骤
- 计算数据集的均值。
- 计算数据集的协方差矩阵。
- 计算协方差矩阵的逆矩阵。
- 使用逆矩阵来估计未知参数。
6.1.4Sigmoid函数
Sigmoid函数是一种常用的非线性函数,它将实数映射到一个区间内的数值,通常是将输入映射到(0, 1)之间。Sigmoid函数的表达式如下:
函数图像如所示
Sigmoid函数具有以下特点:
- 将实数映射到(0, 1)之间:Sigmoid函数的取值范围在0到1之间,这使得它经常被用作激活函数,用于将神经网络的输出转换为表示概率的数值。
- 平滑且连续可导:Sigmoid函数在整个实数域上都是平滑的、连续可导的,这使得它在优化算法中的使用更加方便。
- 常用于逻辑回归:在逻辑回归中,Sigmoid函数被用来将线性组合的特征转换为表示概率的数值,从而进行分类预测。
6.1.5梯度上升法
梯度上升法(Gradient Ascent)是一种优化算法,用于求解最大化目标函数的问题。它是梯度下降法的逆过程。
在机器学习中,梯度上升法常用于求解最大似然估计问题或对数似然函数的最大化问题。其基本思想是通过迭代的方式更新参数,使得目标函数值不断增大,直到达到最大值或收敛。
具体步骤如下:
- 初始化待优化的参数向量。
- 计算目标函数关于参数向量的梯度。
- 根据梯度的方向和步长大小,更新参数向量。通常采用梯度乘以一个学习率的方式进行更新。
- 重复步骤2和步骤3,直到满足终止条件(如达到最大迭代次数或梯度变化很小)。
梯度上升法利用梯度信息来指导参数的更新方向,使得目标函数值不断增大。梯度表示了函数在当前点的变化率和方向,通过朝着梯度的正方向移动,可以找到函数的局部最大值。因此,梯度上升法可以用于求解最大化目标函数的问题。
需要注意的是,梯度上升法可能会陷入局部最大值,而不是全局最大值。为了克服这个问题,可以使用改进的算法,如随机梯度上升法或牛顿法等。
6.2实现实例——从疝气病症状预测病马的死亡率
6.2.1数据集介绍
原始数据集下载地址:UCI Machine Learning Repository
经过处理,得到的数据集分为
horseColicTest.txt
horseColicTraining.txt
6.2.2具体实现
导入所需要的包
from sklearn.linear_model import LogisticRegression
import numpy as np
import random
计算sigmoid函数的值
def sigmoid(inX):
return 1.0 / (1 + np.exp(-inX))
使用随机梯度下降法实现逻辑回归算法。通过输入的特征矩阵和对应的标签,函数会学习得到适合于分类任务的回归系数。输出回归结果系数
def stocGradAscent1(dataMatrix, classLabels, numIter=150):
m,n = np.shape(dataMatrix) #返回dataMatrix的大小。m为行数,n为列数。
weights = np.ones(n) #参数初始化 #存储每次更新的回归系数
for j in range(numIter):
dataIndex = list(range(m))
for i in range(m):
alpha = 4/(1.0+j+i)+0.01 #降低alpha的大小,每次减小1/(j+i)。
randIndex = int(random.uniform(0,len(dataIndex))) #随机选取样本
h = sigmoid(sum(dataMatrix[randIndex]*weights)) #选择随机选取的一个样本,计算h
error = classLabels[randIndex] - h #计算误差
weights = weights + alpha * error * dataMatrix[randIndex] #更新回归系数
del(dataIndex[randIndex]) #删除已经使用的样本
return weights #返回
使用梯度上升法来训练逻辑回归模型的函数,更新回归系数,以最大化似然函数或对数似然函数来实现对逻辑回归模型的训练。输出回归结果系数
def gradAscent(dataMatIn, classLabels):
dataMatrix = np.mat(dataMatIn) #转换成numpy的mat
labelMat = np.mat(classLabels).transpose() #转换成numpy的mat,并进行转置
m, n = np.shape(dataMatrix) #返回dataMatrix的大小。m为行数,n为列数。
alpha = 0.01 #移动步长,也就是学习速率,控制更新的幅度。
maxCycles = 500 #最大迭代次数
weights = np.ones((n,1))
for k in range(maxCycles):
h = sigmoid(dataMatrix * weights) #梯度上升矢量化公式
error = labelMat - h
weights = weights + alpha * dataMatrix.transpose() * error
return weights.getA()
逻辑回归模型进行测试的函数,使用训练集训练逻辑回归模型,并使用测试集进行预测,从而评估模型在未知数据上的性能。最后,打印出测试集的错误率。
def colicTest():
frTrain = open('horseColicTraining.txt') #打开训练集
frTest = open('horseColicTest.txt') #打开测试集
trainingSet = []; trainingLabels = []
for line in frTrain.readlines():
currLine = line.strip().split('\t')
lineArr = []
for i in range(len(currLine)-1):
lineArr.append(float(currLine[i]))
trainingSet.append(lineArr)
trainingLabels.append(float(currLine[-1]))
trainWeights = stocGradAscent1(np.array(trainingSet), trainingLabels,500) #使用改进的随即上升梯度训练
errorCount = 0; numTestVec = 0.0
for line in frTest.readlines():
numTestVec += 1.0
currLine = line.strip().split('\t')
lineArr =[]
for i in range(len(currLine)-1):
lineArr.append(float(currLine[i]))
if int(classifyVector(np.array(lineArr), trainWeights))!= int(currLine[-1]):
errorCount += 1
errorRate = (float(errorCount)/numTestVec) * 100 #错误率计算
print("测试集错误率为: %.2f%%" % errorRate)
逻辑回归模型的分类函数,使用训练得到的回归系数对输入的特征向量进行分类预测。通过计算特征向量与回归系数的乘积,并将其传入sigmoid函数来计算预测的概率值。如果概率大于0.5,则将样本分类为正类(1.0),否则将样本分类为负类(0.0)
def classifyVector(inX, weights):
prob = sigmoid(sum(inX*weights))
if prob > 0.5: return 1.0
else: return 0.0
使用了scikit-learn库提供的LogisticRegression类来实现逻辑回归模型。通过调用fit函数对训练集进行模型训练,然后使用score函数计算分类器在测试集上的正确率。最后,打印出正确率的百分比形式
def colicSklearn():
frTrain = open('horseColicTraining.txt') #打开训练集
frTest = open('horseColicTest.txt') #打开测试集
trainingSet = []; trainingLabels = []
testSet = []; testLabels = []
for line in frTrain.readlines():
currLine = line.strip().split('\t')
lineArr = []
for i in range(len(currLine)-1):
lineArr.append(float(currLine[i]))
trainingSet.append(lineArr)
trainingLabels.append(float(currLine[-1]))
for line in frTest.readlines():
currLine = line.strip().split('\t')
lineArr =[]
for i in range(len(currLine)-1):
lineArr.append(float(currLine[i]))
testSet.append(lineArr)
testLabels.append(float(currLine[-1]))
classifier = LogisticRegression(solver = 'sag',max_iter = 5000).fit(trainingSet, trainingLabels)
test_accurcy = classifier.score(testSet, testLabels) * 100
print('正确率:%f%%' % test_accurcy)
最后输出结果
if __name__ == '__main__':
colicSklearn()
6.2.3运行结果
结果分析:错误率还是挺高的,因为数据集本身有30%的数据缺失,这个是不能避免的。另一个主要原因是,我们使用的是改进的随机梯度上升算法,因为数据集本身就很小,只有几百的数据量。
6.3总结
6.3.1Logistic回归优点
1. 逻辑回归不太可能过度拟合,尽管它可能发生在高维数据集中。在这些情况下,可以使用正则化(L1 和 L2)技术来最小化过拟合。
2.当数据集线性可分时效果很好,对很多基础数据集都有很好的准确率。
3. 应用、理解和培训更直接。
4. 关于每个特征的相关性的推断是基于预期的参数(训练的权重)。协会的方向,积极的或消极的,也被指定。因此,可以使用逻辑回归来确定特征之间的联系。
5. 与决策树或支持向量机不同,该技术允许轻松更改模型以合并新数据。随机梯度下降可用于更新数据。
6. 在具有足够训练实例的低维数据集中不太容易过拟合。
7. 当数据集包含线性可分特征时,Logistic Regression 表现出非常高效。
8. 它与神经网络非常相似。神经网络表示可以被认为是堆叠在一起的小型逻辑回归分类器的集合。
9. 由于其简单的概率解释,逻辑回归方法的训练时间比大多数复杂算法(例如人工神经网络)的训练时间要小得多。
10. 多项 Logistic 回归是一种方法的名称,该方法可以使用 softmax 分类器轻松扩展到多类分类。
6.3.2Logisic回归缺点
1. 如果观察数少于特征数,则不应使用 Logistic 回归;否则,可能会导致过拟合。
2. 因为它创建了线性边界,所以在处理复杂或非线性数据时我们不会获得更好的结果。
3. 只对预测离散函数有用。因此,Logistic 回归因变量仅限于离散数集。
4.逻辑回归要求自变量之间存在平均或不存在多重共线性。
5. 逻辑回归需要一个大数据集和足够的训练样本来识别所有类别。
6. 由于此方法对异常值敏感,数据集中存在与预期范围不同的数据值可能会导致错误结果。
7. 仅应利用重要和相关的特征来构建模型;否则,模型的概率预测可能不准确,其预测值可能会受到影响。
8. 复杂的连接很难用逻辑回归表示。这种技术很容易被更强大和更复杂的算法(如神经网络)所超越。
9. 由于逻辑回归具有线性决策面,因此无法解决非线性问题。在现实世界中,线性可分的数据并不常见。因此,必须对非线性特征进行转换,这可以通过增加特征的数量来完成,以便数据可以在更高维度上线性分离。
10. 基于自变量,统计分析模型旨在预测准确的概率结果。在高维数据集上,这可能会导致模型在训练集上过度拟合,夸大训练集预测的准确性,从而阻止模型准确预测测试集上的结果。当模型在少量具有许多特征的训练数据上进行训练时,这是最常见的。应该在高维数据集上探索正则化策略,以最大限度地减少过度拟合(但这会使模型变得复杂)。如果正则化参数过高,模型可能在训练数据上欠拟合。
6.3.3Logistic回归的应用
逻辑回归涵盖了所有必须将数据分类为多个组的用例。考虑下图:
-
信用卡欺诈检测
-
电子邮件垃圾邮件
-
Twitter分析中的情绪分析
-
图像分割、识别和分类 – X 射线、扫描
-
通过视频进行物体检测
-
手写识别
-
疾病预测——糖尿病、癌症、帕金森等……