机器学习(五):逻辑斯蒂回归原理及案例分析
一、算法简介
1、定义
逻辑斯蒂回归(Logistic Regression)虽然名字中有回归,但是模型最初是为了解决二分类问题。线性回归模型帮助我们用最简单的线性方程实现了对数据的拟合,但只实现了回归而无法进行分类,因此LR就是在线性回归的基础上,构造的一种分类模型。
对线性模型进行分类如二分类任务,简单的事通过阶跃函数(unit-step function),即将线性模型的输出值套上一个函数进行分割,大于z的判定为0,小于z的判定为1.如下图左所示:

但是这样的分段函数数学性质不好,既不连续也不可微。因此有人提出了对数几率函数,上图右,简称Sigmoid函数,
该函数具有很好的数学性质,既可以用于预测类别,并且任意阶可微,因此可用于求解最优解。将函数带进去,可得LR模型为,
其实,LR模型就是在拟合z=W^Tx+b这条直线,使得这条直线尽可能地将原始数据中的两个类别正确的划分开。
2、损失函数
回归问题的损失函数一般为平均误差平方损失MSE,LR解决二分类问题,损失函数为如下形式,
这个函数通常称为对数损失logloss,这里的对数底为自然对数e,其中真实值y是有0,1两种情况,而推测值
由于借助对数几率函数,其输出是介于0~1之间连续概率值。因此损失函数可以转换为分段函数
3、sklearn模块
sklearn.linear_model模块提供了很多模型供我们使用,比如线性回归、岭回归、Lasso回归等。逻辑回归API,
sklearn.linear_model.LogisticRegression(penalty='l2',C=1.0)
二、案例分析
这里我们使用逻辑回归预测癌症分类,数据集主要是来自美国威斯康星州乳腺癌的数据集
数据集信息:
沃尔伯格博士报告其临床病例后,样品会定期到达。因此,数据库反映了数据的时间顺序分组。该分组信息已从数据本身中删除,立即显示在下面:
组1:367个实例(1989年1月)
组2:70个实例(1989年 10月)
组3:31个实例(1990年2月)
组4:17个实例(1990年4月) )
组5:48个实例(1990年8月)
组6:49个实例(1991年1月更新)
组7:31个实例(1991年6月)
组8:86个实例(1991年11月)
总计:699分
属性信息:
1.样本代码编号:id编号
2.团块厚度:1-10
3.细胞大小的均匀性:1-10
4.细胞形状的均匀性:1-10
5.边缘附着力:1-10
6.单层上皮细胞大小:1-10
7.裸核:1-10
8.乏味染色质:1-10
9.正常核仁:1-10
10.线粒体:1-10
11.类别:(良性2,恶性4)
注意
数据有缺失,用?
代替的,我们需要对数据进行预处理。
import pandas as pd
import numpy as np
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import classification_report
def logistic():
"""
利用逻辑回归预测癌症
:return:
"""
#加载数据集
names = ['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('../../../数据集/机器学习/回归算法/乳腺癌数据集/breast-cancer-wisconsin.data',names=names)
#数据集预处理,缺失值删除
data = data.replace(to_replace='?',value=np.nan)
data = data.dropna()
#进行数据的分割
x_train,x_test,y_train,y_test = train_test_split(data.loc[:,'Sample code number':'Mitoses'],data.loc[:,'Class'],test_size=0.25)
#特征值的标准化
std = StandardScaler()
x_train = std.fit_transform(x_train)
x_test = std.transform(x_test)
#使用逻辑回归进行预测
lr = LogisticRegression(C=1.0)
lr.fit(x_train,y_train)
print(lr.coef_)
y_predict = lr.predict(x_test)
#输出准确率
print("准确率为:",lr.score(x_test,y_test))
#输出召回率
print("召回率:",classification_report(y_test,y_predict,labels=[2,4],target_names=["良性","恶性"]))
# print(x_train)
return None
if __name__ == "__main__":
logistic()

总结
- 优点:简单、速度快,适合需要得到一个分类概率的场景
- 缺点:不好处理多分类的问题
生成模型和判别模型
我们判断一个算法是生成模型还是判别模型的依据是有没有先验概率,即是否需要从历史数据总结出概率信息。
判别模型 | 生成模型(先验概率) | |
---|---|---|
算法 | 逻辑回归 | 朴素贝叶斯 |
解决问题 | 二分类 | 多分类 |
应用场景 | 癌症、二分类需要概率 | 文本分类 |
参数 | 正则化力度 | 没有 |
但是得出的结果都有概率解释。
判断模型:k-近邻、决策树、随机森林、神经网络、逻辑回归
生成模型:朴素贝叶斯、隐马尔科夫模型
逻辑斯蒂回归算法我们就讲到这里,相对来说理解了线性回归之后,理解逻辑回归就非常简单了,逻辑回归是对线性回归的结果进行了sigmoid优化,通过梯度下降算法求解的过程。