机器学习入门笔记03-logistics回归

线性回归对于分类问题

线性回归解决的是回归问题,即连续变量的问题,在直角坐标系下就是用直线去拟合数据点;虽然在分类问题中也可以用线性回归模型,但效果不好。线性模型为
 

其产生的预测值是一个实值,因此,若要实现分类问题,则可考虑通过对线性模型所预测的结果再进行一次变换,从而实现分类,此时模型可表示为:

 

logistics回归原理

对于二分类问题,我们要预测“正”、“反”两种结果,输出标记可记为y∈{0,1},因此最理想的模型是“单位阶跃函数”(unit-step function):

 

预测值z大于0就判为正例,小于0就判为反例,预测值在临界点0时任意判别。

但是很容易发现,单位阶跃函数不连续,并不适合一般情况,因此希望能寻找一个与单位阶跃函数相近、且单调可导的函数模型来代替,以便更好地运用于解决实际问题。

常用于替代的函数为Sigmoid函数:

 

logistics回归模型可表示为:

                                                               单位阶跃函数与sigmoid函数(来源:西瓜书)

logistics回归损失函数推导及优化

logistics回归模型可变化为

 

如果将上式中的y看作是样本的正例,则1-y就可以被看作反例,二者的比值就可以当做样本被预测为正例的可能性,称其为“几率”。

接下来就要求参数wb了。我们可以将y看作后验概率估计p(y=1|x),即确定的样本为正例的概率。上式可变为:

 

则可以得到:

 

,则 。给定样本数据集 ,则logistics回归一般公式为:

 

为方便计算,也可将其表示为:

 

构造对数似然函数:

 

因此logistics回归的模型优化可表示为:

 

logistics回归的损失函数(代价函数)即可表示为:

:此处损失函数并非线性回归所使用的平方损失函数,是因为使用平方损失函数作为logistics回归的损失函数将导致函数求解复杂,且容易陷入局部最优解。

求解logistics回归模型,梯度下降法依然是个不错的选择:

因为对于sigmoid函数,有g'z=g(z)(1-g(z)) ,因此可求得:

 

所以,迭代公式可细化为:

 

 

logistics回归的分布式实现

由于单机处理能力的限制,在对大规模样本训练时,往往需要将求解过程并行化。我们知道在求解过程中,行和列都存在批向量处理的情况,我们可以按行并行和按列并行。

按行并行

对于

相当于将样本与前一次迭代的结果进行运算并求和,这种情况只需将样本拆分到不同机器上运算,最后在求和即可。

按列并行

是对参数θ进行运算,那么只需将特征分配到不同的机器上,分别计算梯度后,再归并到完整的特征向量进行梯度更新即可。

 

正则化与模型评估指标

正则化

在实际训练模型的过程中,很可能遇到过拟合的情况,此时我们可以增加正则化项来减少模型过拟合的风险。正则化函数其实就是用来限制参数θ的,这些限制很像一种惩罚,因此一般也称为参数θ的“惩罚项”。

L1正则:

L1正则项是参数向量中各元素的绝对值之和,logistics回归中增加L1正则化项的代价函数为:
 

 

梯度下降的迭代函数变为:

 

L2正则:

L2正则项是参数向量中各元素的平方和,logistics回归中增加L2正则化项的代价函数为:

 

梯度下降的迭代函数变为:

评价指标

logistics回归属于分类模型,因此二分类的评价指标基本都适用于逻辑回归。可以用查准率和查全率来评价预测结果:

 

我们可以用P-R曲线表示查准率和查全率之间的关系:查准率和查全率经常相互矛盾,一般查准率高时查全率低,查全率高时查准率低。我们经常针对具体的应用场景决定更看重哪一个指标。

我们可以用Fβ表达对查准率/查全率的不同偏好,定义为:

β大于1时,查全率有更大影响;β小于1时,查准率有更大影响;β等于0时,即标准的F1度量。

但是,当正负样本分布发生变化时,P-R曲线会受到较大影响。试想负样本的数量扩大10倍,FP和TN都会成倍增加,会影响到查准率和查全率。这时候我们可以用ROC曲线来评价模型。

logistics回归的优缺点

优点:逻辑回归的思想简洁,可以很好的解决二问题。

缺点:由于逻辑回归依然是线性划分,对于非线性的数据集适应性弱;当特征空间很大,性能欠佳;只能处理二分类问题;此外,观察下图:

因为预测结果呈Z字型(或反Z字型),因此当数据集中在中间区域时,对概率的变化会很敏感,可能使得预测结果缺乏区分度。

样本不均衡问题

对于样本类别不均衡问题,一个基本策略是“再缩放”。再缩放的三类做法为:

  1. 欠采样:去除一些反例使得正反例数目接近;
  2. 过采样:增加一些正例使得正反例数目接近;
  3. 阈值移动:基于原始集学习,当在预测是,将决策阈值改为符合样本正负样本比例的值。

过采样因为增加了数据,时间开销大于欠采样法。但欠采样法由于随机丢弃反例,可能丢失一些重要信息。这时候可以将反例划分成若干个集合分别学习,从全局来看并非丢失重要信息。

Python实现

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt


df_X = pd.read_csv(r'D:\考研DailyPractice\专业课\人工智能笔记\机器学习算法入门笔记\Task02\logistic_x.txt', sep='\ +',header=None, engine='python') #读取X值
ys = pd.read_csv(r'D:\考研DailyPractice\专业课\人工智能笔记\机器学习算法入门笔记\Task02\logistic_y.txt', sep='\ +',header=None, engine='python') #读取y值
ys = ys.astype(int)
df_X['label'] = ys[0].values #将X按照y值的结果一一打标签

ax = plt.axes()
#在二维图中描绘X点所处位置,直观查看数据点的分布情况
df_X.query('label == 0').plot.scatter(x=0, y=1, ax=ax, color='blue')
df_X.query('label == 1').plot.scatter(x=0, y=1, ax=ax, color='red')

#提取用于学习的数据
Xs = df_X[[0, 1]].values
Xs = np.hstack([np.ones((Xs.shape[0], 1)), Xs]) 
ys = df_X['label'].values

#定义sigmoid函数
def sigmoid(z):
    return 1/(1+np.exp(-z))
# 梯度下降法
class LGR_GD():
    def __init__(self):
        self.w = None 
        self.n_iters = None
    def fit(self,X,y,alpha=0.03,loss = 1e-10): # 设定步长为0.002,判断是否收敛的条件为1e-10
        y = y.reshape(-1,1) #重塑y值的维度以便矩阵运算
        [m,d] = np.shape(X) #自变量的维度
        print(m,d,y.shape)
        self.w = np.zeros((1,d)) #将参数的初始值定为1
        print("w:",self.w.shape,self.w.ndim,self.w)
        tol = 1e5
        self.n_iters = 0
        #============================= show me your code =======================
#        lamda = 1 # 正则化系数
        while tol > loss: #设置收敛条件
            h = sigmoid(np.dot(X,self.w.T)) # 正例h(y=1|x)
            #梯度下降迭代
            j = (alpha / m) * np.dot(X.T,h-y)
            self.w = self.w.T
            self.w -= j  # 未加正则项
#            self.w -= (j + (lamda / m) * self.w)   # 加正则项
            self.w = self.w.T
            
            tol = np.sum(np.abs(j))  # 错误率
            
            self.n_iters += 1 #更新迭代次数
            print("训练轮数:",self.n_iters,"参数:",self.w,"误差:",tol,"下降距离:",j)
         #============================= show me your code =======================
    def predict(self, X):
        # 用已经拟合的参数值预测新自变量
        y_pred = X.dot(self.w)
        return y_pred  

if __name__ == "__main__":
    lr_gd = LGR_GD()
    lr_gd.fit(Xs,ys)

    ax = plt.axes()

    df_X.query('label == 0').plot.scatter(x=0, y=1, ax=ax, color='blue')
    df_X.query('label == 1').plot.scatter(x=0, y=1, ax=ax, color='red')

    _xs = np.array([np.min(Xs[:,1]), np.max(Xs[:,1])])
    _ys = (lr_gd.w[0][0] + lr_gd.w[0][1] * _xs) / (- lr_gd.w[0][2])
    plt.plot(_xs, _ys, lw=1)

参考资料

  1. 【机器学习】逻辑斯蒂回归(Logistic Regression)详解https://blog.csdn.net/qq_32742009/article/details/81516140
  2. 逻辑斯蒂回归(Logistic Regression)https://blog.csdn.net/daunxx/article/details/51816588
  3. 机器学习中正则化项L1和L2的直观理解https://blog.csdn.net/jinping_shi/article/details/52433975
  4. 【通俗易懂】机器学习中 L1 和 L2 正则化的直观解释https://blog.csdn.net/red_stone1/article/details/80755144
  5. 正则化逻辑回归(Regularization)https://www.jianshu.com/p/d28a956afc91?utm_source=oschina-app
  6. 吴恩达机器学习(课程)https://study.163.com/series/1001461001.htm
  7. 《统计学习方法》.李航
  8. 《深度学习》
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值