域名及网站建设实训,设计网页的详细步骤,网站建设中国十强,wordpress访问很慢吗?文章目录致谢11 逻辑回归11.1 引入11.2 激活函数11.3 损失函数11.4 梯度下降11.5 案例#xff1a;癌症分类预测致谢 逻辑回归为什么用Sigmoid#xff1f; - 知乎 (zhihu.com) 逻辑回归中的损失函数的解释_yidiLi的博客-CSDN博客_逻辑回归损失函数 11 逻辑回归
逻辑回归也被称…
文章目录致谢11 逻辑回归11.1 引入11.2 激活函数11.3 损失函数11.4 梯度下降11.5 案例癌症分类预测致谢 逻辑回归为什么用Sigmoid - 知乎 (zhihu.com) 逻辑回归中的损失函数的解释_yidiLi的博客-CSDN博客_逻辑回归损失函数 11 逻辑回归
逻辑回归也被称为逻辑斯蒂回归(Logistic Regression)虽被称为回归但是其实际上是统计学习中经典的分类方法。
逻辑回归常常被用于二分类问题比较常见的有
判断一封电子邮件是否是垃圾邮件判断一次金融交易是否是欺诈区别一个肿瘤是恶性的还是良性的
我们将因变量可能属于的两个类分别称为负向类和正向类则因变量y∈01。其中0表示负向类1表示正向类。实际上哪个是正向类哪个是负向类其实并不重要。虽然没有特别界限但是我们通常把0归结为没有而1归结为具有我们要寻找的东西。
11.1 引入
对于二分类问题y取值非0即1但如果你使用的是线性回归那么其输出的y^\hat yy^可能远远大于1或者为负数。所以如果我们用线性回归来做分类效果实际上是很差的。
逻辑回归是怎么把输出变成0到1之间的呢实际上它拿线性回归的输出作为输入然后用函数g(x)11e−xg(x) \frac {1}{1e^{-x}}g(x)1e−x1输出其输出值可以把线性回归的结果投射到0和1的区间上。
11.2 激活函数
上面我们说到将线性回归的输出输入到一个函数上再输出这样能够使结果投射到0-1的区间上。在深度学习中我们常常把这类可以将线性回归的结果投射到某个区间函数叫做激活函数而上面提到的我们通常称为sigmoid激活函数在深度学习中我们会陆续见到其他的激活函数。
实际上为何逻辑回归要用sigmoid函数来投射线性回归的结果是有原理的如果感兴趣可以去网上搜索相关推导如果我不懒后续也会手推但是你现在需要知道的一点是——当因变量服从伯努利分布(0-1分布)时广义线性模型就为逻辑回归。
实际上逻辑回归用于二分类问题而其实际上是softmax回归的特殊情况softmax回归常常用来解决多分类问题在后续深度学习的文章中我们会持续了解它们。
让我们看一下sigmoid激活函数长什么样吧
import matplotlib.pyplot as plt
import math
import numpy as np
import matplotlibmatplotlib.rcParams[font.family] SimHei
matplotlib.rcParams[axes.unicode_minus] False# 1 准备数据
def func(x):y 1 / (1 math.exp(-x))return yX np.linspace(-100, 100, 200)
Y [func(x) for x in X]
# 2 创建画布
plt.figure()plt.grid(True, linestyle--, alpha0.5)# 3 画图
plt.plot(X, Y)# 4 设置标题
plt.title(sigmoid函数图像)# 5 释放图像
plt.show()
out 实际使用中我们默认分类的界限是0.5也就是说经由sigmoid函数投射值如果大于0.5则直接分为1类否则分为0类。
11.3 损失函数
记得我们前面谈到线性回归的损失函数吗由于线性回归属于回归问题所以输出是某一个预测值我们拿预测值和真实值进行比对来衡量其误差这个比对方式我们用的是平方损失函数。但是在逻辑回归中我们并不能继续这么做了因为逻辑回归非0即1你还拿平方损失函数比对其误差如果没有误差那不就是0吗这还搞啥子我们后面还要采用梯度下降呢参数不动这模型还怎么优化。
为此我们急需有一个新的损失函数来取代之前的平方损失函数。在逻辑回归中我们常常使用对数似然损失函数来衡量损失。其公式为 cost(h0(x),y){−log(h0(x))ify1−log(1−h0(x))ify0cost(h_0(x),y) \left\{ \begin{aligned} -\log(h_0(x)) if y 1\\ -\log(1-h_0(x)) if y 0 \end{aligned} \right. cost(h0(x),y){−log(h0(x))−log(1−h0(x))ifify1y0 当y 1时我们可以观察其函数图像如下所示 明显地如果h0(x)h_0(x)h0(x)越接近1而我们y 1那么说明我们分类地越准确。
同理当y 0时我们也可以观察其图像如下所示 当h0(x)h_0(x)h0(x)越接近于1而我们y 0说明我们分类的很差损失很大。
为了后续计算梯度下降方便我们必须对上述的分段函数做一个简化。为此我们将其形式改写为 cost(h0(x),y)∑i1m−yilog(h0(x))−(1−yi)log(1−h0(x))cost(h_0(x),y) \sum^m_{i 1}-y_ilog(h_0(x))-(1-y_i)log(1-h_0(x)) cost(h0(x),y)i1∑m−yilog(h0(x))−(1−yi)log(1−h0(x)) 这个公式的好处在于当你的y取1那么−yilog(h0(x))-y_ilog(h_0(x))−yilog(h0(x))会保留后面一部分会为0这样就等同于上面的分段函数当你的y取0同理−yilog(h0(x))-y_ilog(h_0(x))−yilog(h0(x))会为0后面一部分保留。
11.4 梯度下降
同样地我们在打基础阶段还是照样使用梯度下降来优化损失函数从而找到逻辑回归中的权重参数。
除了梯度下降算法以外还有一些常被用来令代价函数最小的算法这些算法更加复杂和优越而且通常不需要人工选择学习率通常比梯度下降算法要更加快速。这些算法有共轭梯度(Conjugate Gradient)局部优化法(Broyden fletcher goldfarb shann,BFGS)和有限内存局部优化法(LBFGS)。
11.5 案例癌症分类预测
让我们来看看sklearn为我们提供的API。 sklearn.linear_model.LogisticRegression(solver ‘liblinear’,penalty ‘l2’,C 1.0) solver优化求解方式。默认使用开源的liblinear库实现优化内部使用了坐标轴下降法来迭代优化损失函数penalty正则化种类C正则化力度 在之前的学习中我们一直用着sklearn自带的数据集。是的它们是好用这仅仅只是因为人家帮你预处理好了他在帮你偷懒所以我想你是时候学着处理一些东西了。
我们先去UCI把我们要用到的数据集下载下来或者你也可以不下载直接利用pandas读取网站即可索引 /ml/机器学习数据库/乳腺癌-威斯康星州 (uci.edu)
其中数据放于http://archive.ics.uci.edu/ml/machine-learning-databases/breast-cancer-wisconsin/breast-cancer-wisconsin.data
而数据介绍放于http://archive.ics.uci.edu/ml/machine-learning-databases/breast-cancer-wisconsin/breast-cancer-wisconsin.names
我们先来读取数据。由于原始数据是没有标签的所以我们顺便给数据打上标签。
import pandas as pd
import numpy as np# 1 读取数据
path http://archive.ics.uci.edu/ml/machine-learning-databases/breast-cancer-wisconsin/breast-cancer-wisconsin.data
colum_name [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(path, namescolum_name)从原数据集上看数据中有我们在数据预处理中通常先将其替换为NaN然后进行删除。如果你喜欢填充往?部分填充均值也是可以的。
# 2 缺失值处理
data data.replace(to_replace ?,value np.nan)
data.dropna(inplace True)处理完成后我们可以通过直接查看数据看看是否处理成功也可以通过ifnull()函数查看是否还有空值。
pd.set_option(display.max_rows, None) # 显示所有行
datadata.isnull().any()看到没有空值后我们下一步要对原始数据集进行特征和分类标签的分离。
# 3 划分数据集
from sklearn.model_selection import train_test_split# 筛选特征值和目标值
x data.iloc[:,1:-1]
y data[Class]
x.head()然后进行切割数据集。
# 划分数据集
x_train,x_test,y_train,y_test train_test_split(x,y)
x_train.head()逻辑回归本质上属于广义线性模型所以我们还要进行一下标准化。
# 4 标准化
from sklearn.preprocessing import StandardScaler
transfer StandardScaler()
x_train transfer.fit_transform(x_train)
x_test transfer.transform(x_test)
x_train标准化完成后我们调用逻辑回归预估器进行模型的训练
# 5 逻辑回归
from sklearn.linear_model import LogisticRegression
estimator LogisticRegression()
estimator.fit(x_train,y_train)我们可以看一下训练后的回归系数和偏置。
# 回归系数和偏置
estimator.coef_estimator.intercept_最后我们对模型进行评估。
# 6 模型评估
y_predict estimator.predict(x_test)
print(y_predict:\n,y_predict)
print(直接比对真实值和与预测值\n,y_test y_predict)score estimator.score(x_test,y_test)
print(准确率为\n,score)