前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >分类-对数几率回归(逻辑回归)算法

分类-对数几率回归(逻辑回归)算法

作者头像
唔仄lo咚锵
发布2022-10-07 14:12:36
9710
发布2022-10-07 14:12:36
举报

文章目录

简介


对数几率回归(Logistic Regression),也称逻辑回归,虽然名字中含有回归,但其实是一种分类算法。找一个单调可微函数将分类任务中的真实标记与线性回归模型的预测值联系起来,是一种广义线性回归。

比如给定身高和体重数据,通过线性回归算法训练模型后,可以得到身高体重的回归方程,从而得到预测值。

现需要根据身高体重来判断胖瘦,即二分类任务,也就是要根据回归方程来转换成分类,定义激活函数,转为0~1之间的值,即对数几率回归的输入就是线性回归的输出——

通过属于某个类别的概率值来判断是否属于该类别,比如设定大于0.5则判为该类别,定义损失函数和优化算法对模型进行训练。

线性回归可参考::回归-线性回归算法(房价预测项目)

激活函数


激活函数就是将预测值

转换为0/1值。

最理想的就是单位阶跃函数:

\begin{align*}\begin{split}y= \left \{\begin{array}{lr}0,& z<0\\ 0.5,& z=0\\1, & z>0\end{array}\right.\end{split} \end{align*}

但是单位阶跃函数并不连续,我们需要找到一个单调可微的函数,在一定程度上尽量接近单位阶跃函数,而对数几率函数(Sigmoid函数)就能很好的近似。

y=\frac{1}{1+e^{-z}}

两者图像如下:

带入Sigmoid函数中,有

y=h(w^Tx)=\frac{1}{1+e^{-(w^Tx+b)}}
ln\frac{y}{1-y}=w^Tx+b \dots①

y就是正例,1-y是反例,两者比值称为几率,再取对数ln,故得名对数几率函数。

损失函数


损失函数是定义了预测标记和真实标记的误差,在逻辑回归中,我们希望每个样本属于其真实标记的概率越大越好,使用对数似然损失。

将y视为后验概率估计p(y=1|x),带入式①,有

p(y=1|x)=h(w^Tx)\\p(y=0|x)=1-h(w^Tx)

插播反爬信息 )博主CSDN地址:https://wzlodq.blog.csdn.net/

使用极大似然法,利用已知的样本的真实标记,反推最大概率导致这样的结果的参数值。

通过分布律求极大似然函数:

L(y_i|x_i,w)=\prod_{i=1}^mh(w^Tx)^{y_i}(1-h(w^Tx))^{1-y_i}

取对数后,得到对数似然函数:

L(y_i|x_i,w)=\sum_{i=1}^my_ilog(h(w^Tx))+(1-y_i)log(1-h(w^Tx))

由于log函数在(0,1)区间内是负的,我们乘以-1,使最终损失函数为正:

J(w)=\sum_{i=1}^m-y_ilog(h(w^Tx))-(1-y_i)log(1-h(w^Tx))

优化算法


得到损失函数的定义后,我们期望损失越小越好,即使J(w)=0 ,可以牛顿法、梯度下降法等求得最优解。

梯度下降可参考::浅谈梯度下降算法(模拟退火实战)

使用梯度下降对w求偏导:

\frac{\partial J}{\partial w}=\sum_{i=1}^m(y_i-h(w^Tx_i))x_i

然后更新w得到w^* 即可:

w^*=w-\eta\frac{\partial J}{\partial w}

代码


使用sklearn库LgisticRegression()函数。

代码语言:javascript
复制
import matplotlib.pyplot as plt
from sklearn import datasets
from sklearn.linear_model import LogisticRegression
from sklearn.model_selection import train_test_split

# 数据处理
iris = datasets.load_iris()  # 载入鸢尾花数据集
x = iris.data[:100, ]  # 取前100行(二分类
y = iris.target[0:100]
x_train, x_test, y_train, y_test = train_test_split(x, y)  # 划分训练集测试集
# 创建逻辑回归模型
estimator = LogisticRegression()
# 模型训练
estimator.fit(x_train, y_train)
# 预测
y_pred = estimator.predict(x_test)
print("预测值:", y_pred)
# 模型评估
print('准确率:%.3f' % estimator.score(x_test, y_test))
# 可视化
plt.scatter(x[:, 0], x[:, 1], c=y, alpha=0.5)  # 只选取了两个特征来作二维图
for i in range(len(x_test)):
    if y_pred[i] == y_test[i]:  # 正确标绿
        plt.scatter(x_test[i][0], x_test[i][1], color="green")
    else:  # 错误标红
        plt.scatter(x_test[i][0], x_test[i][1], color="red")
plt.show()

原创不易,请勿转载本不富裕的访问量雪上加霜 ) 博主首页:https://wzlodq.blog.csdn.net/ 来都来了,不评论两句吗👀 如果文章对你有帮助,记得一键三连❤

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2022-10-06,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 文章目录
  • 简介
  • 激活函数
  • 损失函数
  • 优化算法
  • 代码
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档