机器学习基础算法(7)

7、逻辑回归(分类算法)

7.1 模型介绍

Logistic Regression 虽然被称为回归,但其实际上是分类模型,并常用于二分类。Logistic Regression 因其简单、可并行化、可解释强深受工业界喜爱。

Logistic 回归的本质是:假设数据服从这个分布,然后使用极大似然估计做参数的估计。

7.1.1 Logistic 分布

Logistic 分布是一种连续型的概率分布,其分布函数密度函数分别为:

其中,μ 表示位置参数, γ>0为形状参数。我们可以看下其图像特征:

Logistic 分布是由其位置和尺度参数定义的连续分布。Logistic 分布的形状与正态分布的形状相似,但是 Logistic 分布的尾部更长,所以我们可以使用 Logistic 分布来建模比正态分布具有更长尾部和更高波峰的数据分布。在深度学习中常用到的 Sigmoid 函数就是 Logistic 的分布函数在μ=0,γ=1  的特殊形式。

7.1.2 Logistic回归

逻辑回归(Logistic Regression)是一种用于解决二分类(0 or 1)问题的机器学习方法,用于估计某种事物的可能性。比如某用户购买某商品的可能性,某病人患有某种疾病的可能性,以及某广告被用户点击的可能性等。
 注意,这里用的是“可能性”,而非数学上的“概率”,logisitc回归的结果并非数学定义中的概率值,不可以直接当做概率值来用。该结果往往用于和其他特征值加权求和,而非直接相乘。

 那么逻辑回归与线性回归是什么关系呢?
 逻辑回归(Logistic Regression)与线性回归(Linear Regression)都是一种广义线性模型(generalized linear model)。逻辑回归假设因变量 y 服从伯努利分布,而线性回归假设因变量 y 服从 高斯分布。
 因此与线性回归有很多相同之处,去除Sigmoid映射函数的话,算法就是一个线性回归。可以说,逻辑回归是以线性回归为理论支持的,但是逻辑回归通过Sigmoid函数引入了非线性因素,因此可以轻松处理0/1分类问题。
 机器学习中的任何算法都有着数学基础,有着不同的前提假设和对应的约束。因此如果想要深入的掌握机器学习算法,必须要捡起数学课本,包括统计、概率、微积分等。

逻辑回归的假设函数形式如下:

这个函数称为Sigmoid函数,也称为逻辑函数(Logistic function),其函数曲线如下:

从上图可以看到sigmoid函数是一个s形的曲线,它的取值在[0, 1]之间,在远离0的地方函数的值会很快接近0/1。这个性质使我们能够以概率的方式来解释。

一个机器学习的模型,实际上是把决策函数限定在某一组条件下,这组限定条件就决定了模型的假设空间。当然,我们还希望这组限定条件简单而合理。而逻辑回归模型所做的假设是:

这里的 g(h) 是上边提到的 sigmoid 函数,相应的决策函数为:

选择0.5作为阈值是一个一般的做法,实际应用时特定的情况可以选择不同阈值,如果对正例的判别准确性要求高,可以选择阈值大一些,对正例的召回要求高,则可以选择阈值小一些。

 7.2 代价函数

 7.2.1 逻辑回归的损失函数

有了模型,我们自然会想到要求策略,也就是损失函数。对于逻辑回归,我们很自然想到:用线性回归的损失函数“离差平方和”的形式是否可以?

但事实上,这种形式并不适合,因为所得函数并非凸函数,而是有很多局部的最小值,这样不利于求解。

前面说到逻辑回归其实是概率类模型,因此,我们通过极大似然估计(MLE)推导逻辑回归损失函数。下面是具体推导过程。 

上面我们通过基本假设得到了1和0两类的后验概率,现在将两个概率合并可得:

现在我们得到了模型概率的一般形式,接下来就可以使用极大似然估计来根据给定的训练集估计出参数,将n个训练样本的概率相乘得到:

似然函数是相乘的模型,我们可以通过取对数将等式右侧变为相加模型,然后将指数提前,以便于求解。变换后如下:

如此就推导出了参数的最大似然估计。我们的目的是将所得似然函数极大化,而损失函数是最小化,因此,我们需要在上式前加一个负号便可得到最终的损失函数。

其等价于:

 7.2.2 逻辑回归的损失函数求解

求解逻辑回归的方法有非常多,我们这里主要聊下梯度下降和牛顿法。优化的主要目标是找到一个方向,参数朝这个方向移动之后使得损失函数的值能够减小,这个方向往往由一阶偏导或者二阶偏导各种组合求得。逻辑回归的损失函数是:

 1、随机梯度下降

梯度下降是通过 J(w) 对 w 的一阶导数来找下降方向,并且以迭代的方式来更新参数,更新方式为:

 其中 k 为迭代次数。每次更新参数后,可以通过比较 ||J(ωk+1)-J(ωk)|| 小于阈值或者到达最大迭代次数来停止迭代。

2、牛顿法

牛顿法的基本思路是,在现有极小点估计值的附近对 f(x) 做二阶泰勒展开,进而找到极小点的下一个估计值。假设\omega ^{k}为当前的极小值估计值,那么有:

 然后令  \varphi ^{'}(\omega )=0,得到了  \omega ^{k+1}=\omega ^{k}-\frac{J'(\omega ^{k}))}{J''(\omega ^{k}))}。因此有迭代更新式:

 其中H_{k}^{-1} 为海森矩阵:

 此外,这个方法需要目标函数是二阶连续可微的,本文中的 J(w) 是符合要求的。

7.3 代码示例

7.3.1 Logistic回归API

 Logistic回归虽然是一种分类算法,但是归为linear_model,也会存在线性回归的过拟合,但是API中已经自带了正则化,penalty就是以“l2”形式正则化,“C”是正则化的力度。

 7.3.2 LogisticRegression回归案例

良 / 恶行乳腺癌肿瘤预测

原始数据的下载地址: Index of /ml/machine-learning-databases/breast-cancer-wisconsin

数据描述 (1)699条样本,共11列数据,第一列用语检索的id,后9列分别是与肿瘤 相关的医学特征,最后一列表示肿瘤类型的数值。 (2)包含16个缺失值,用”?”标出。(3)结果良性为2恶性为4。

良 / 恶行乳腺癌肿瘤分类流程:

(1)网上获取数据(工具pandas)

(2)数据缺失值处理、标准化

(3)LogisticRegression估计器流程

代码:

from sklearn.datasets import load_boston
from sklearn.linear_model import LinearRegression, SGDRegressor,  Ridge, LogisticRegression
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.metrics import mean_squared_error, classification_report
from sklearn.externals import joblib
import pandas as pd
import numpy as np

def logistic():
    """
    逻辑回归做二分类进行癌症预测(根据细胞的属性特征)
    :return: NOne
    """
    # 构造列标签名字
    column = ['Sample code number','Clump Thickness', 'Uniformity of Cell Size','Uniformity of Cell Shape','Marginal Adhesion', 'Single Epithelial Cell Size','Bare Nuclei','Bland Chromatin','Normal Nucleoli','Mitoses','Class']

    # 读取数据
    data = pd.read_csv("https://archive.ics.uci.edu/ml/machine-learning-databases/breast-cancer-wisconsin/breast-cancer-wisconsin.data", names=column)

    print(data)

    # 缺失值进行处理
    data = data.replace(to_replace='?', value=np.nan)

    data = data.dropna()

    # 进行数据的分割
    x_train, x_test, y_train, y_test = train_test_split(data[column[1:10]], data[column[10]], test_size=0.25)

    # 进行标准化处理
    std = StandardScaler()

    x_train = std.fit_transform(x_train)
    x_test = std.transform(x_test)

    # 逻辑回归预测
    lg = LogisticRegression(C=1.0)

    lg.fit(x_train, y_train)

    print(lg.coef_)

    y_predict = lg.predict(x_test)

    print("准确率:", lg.score(x_test, y_test))

    print("召回率:", classification_report(y_test, y_predict, labels=[2, 4], target_names=["良性", "恶性"]))

    return None


if __name__ == "__main__":
    logistic()

7.3.3 Logistic回归总结

 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

沉迷学习的郑博士

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值