2.【Python】分类算法—Logistic Regression
文章目录
前言
逻辑回归算法一般用于二分类问题,属于典型的监督学习,此算法的复杂度低容易实现。
一、Logistic Regression模型
1.线性可分和线性不可分
在介绍Logistic Regression之前,先了解线性可分和线性不可分的概念。对于分类问题,如果样本可以用线性函数进行分类,则成为线性可分,如图1.1所示;否则成为线性不可分,如图1.2所示。
2.Logistic Regression模型
Logistic Regression属于线性分类模型,如图1.1所示的线性函数可以表示为:
其中,W为权重,b为偏置。通过对样本的训练,可以得到两个类别的数据,利用阈值函数可以将样本映射到不同类别中,最常用的阈值函数为Sigmoid函数,公式为:
如图所示,是将样本映射至值域(0,1)之间,以下为python的实现过程。
import numpy as np
def sig(x):
'''sigmoid函数
input:x(mat):feature*w
output:sigmoid(x)(mat):sigmoid值
'''
return 1.0/(1+np.exp(-x))
3.损失函数
为了求权重w和偏置b,需要先了解损失函数。
若输入值为x,输出值为y,则样本属于y的概率应该为P(y)P(1-y),表示为:
σ为sigmoid函数。可以使用极大似然法对W和b进行参数估计,假设有m个训练样本,则其似然函数为:
为了将乘法变为加法,将使用log函数进行对数求解。在Logistic Regression算法中,通常将负的log似然函数当做损失函数,因为损失函数求出的概率越小,损失越小。
此时需要求min l(W,b)。
二、梯度下降法
梯度下降法是寻找最优的权重W,用的最多的是基于梯度下降的优化函数。
1.梯度下降的过程
选取初始点X0
选取梯度下降的方向,选择步长,在某一时刻到达X3
若判断没有满足终止条件,则重复以上过程,直至找到最优解(最小值)。
注意可能存在多个局部最优解得情况,全局最优解就是某一个局部最优解。
2.基于梯度下降法训练Logistic Regression模型
∇为梯度,根据梯度下降法得到权重的更新公式表示为:
具体过程如下:
def lr_train_bgd(feature,label,maxcycle,alpha):
'''利用梯度下降训练LR模型
input:feature(mat)特征
label(mat)标签
maxcycle(int)最大迭代次数
alpha(float)学习率
output:w(mat):权重
'''
n = np.shape(feature)[1] #特征个数
w = np.mat(np.ones((n, 1))) #初始化权重
i = 0
while i <=maxcycle: #在最大迭代次数的范围内
i += 1 #当前的迭代次数
h = sig(feature * w) #计算sigmoid的值
err = label - h
if i % 100 ==0:
print("\t---iter="+str(i)+",train error rate="+str(error_rate(h,label)))
w = w + alpha*feature.T * err #权重修正
return w
利用函数lr_train_bgd对损失函数进行了优化,函数输入为样本特征、标签、最大迭代次数、学习率,输出为权重,这些都需要自己定义。
在每次迭代过程中,需要计算当前的误差,定义误差函数为error_rate,以下部分应该放在定义函数lr_train_bgd之前。
def error_rate(h,label):
'''计算当前的损失函数值
inp