对数几率回归(Logistic Regression),也称逻辑回归,虽然名字中含有回归,但其实是一种分类算法。找一个单调可微函数将分类任务中的真实标记与线性回归模型的预测值联系起来,是一种广义线性回归。
比如给定身高和体重数据,通过线性回归算法训练模型后,可以得到身高体重的回归方程,从而得到预测值。
现需要根据身高体重来判断胖瘦,即二分类任务,也就是要根据回归方程来转换成分类,定义激活函数,转为0~1之间的值,即对数几率回归的输入就是线性回归的输出——
。
通过属于某个类别的概率值来判断是否属于该类别,比如设定大于0.5则判为该类别,定义损失函数和优化算法对模型进行训练。
线性回归可参考::回归-线性回归算法(房价预测项目)
激活函数就是将预测值
转换为0/1值。
最理想的就是单位阶跃函数:
KaTeX parse error: No such environment: align* at position 7: \begin{̲a̲l̲i̲g̲n̲*̲}̲\begin{split}y=…
但是单位阶跃函数并不连续,我们需要找到一个单调可微的函数,在一定程度上尽量接近单位阶跃函数,而对数几率函数(Sigmoid函数)就能很好的近似。
两者图像如下:
将
带入Sigmoid函数中,有
y就是正例,1-y是反例,两者比值称为几率,再取对数ln,故得名对数几率函数。
损失函数是定义了预测标记和真实标记的误差,在逻辑回归中,我们希望每个样本属于其真实标记的概率越大越好,使用对数似然损失。
将
视为后验概率估计
,带入式①,有
使用极大似然法,利用已知的样本的真实标记,反推最大概率导致这样的结果的参数值。
通过分布律求极大似然函数:
取对数后,得到对数似然函数:
由于log函数在(0,1)区间内是负的,我们乘以-1,使最终损失函数为正:
(
插播反爬信息)博主CSDN地址:https://wzlodq.blog.csdn.net/
得到损失函数的定义后,我们期望损失越小越好,即使
,可以牛顿法、梯度下降法等求得最优解。
梯度下降可参考::浅谈梯度下降与模拟退火算法
使用梯度下降对w求偏导:
然后更新
得到
即可:
使用sklearn库LgisticRegression()
函数。
项目一、鸢尾花:
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()
项目二、预测肺癌:
使用Kaggle提供数据集,包括15个特征,和是否为肺癌标签。
import pandas as pd
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import classification_report
from sklearn.model_selection import train_test_split
# 数据处理
data = pd.read_csv("D:\\survey lung cancer.csv") # 读数据
data.replace({'M': 1, 'F': 0, 'YES': 1, 'NO': 0}, inplace=True) # 数据转换
x = data.iloc[:, 0:15].to_numpy()
y = data['LUNG_CANCER'].to_numpy()
x_train, x_test, y_train, y_test = train_test_split(x, y) # 划分训练集测试集
# 创建逻辑回归模型
estimator = LogisticRegression(max_iter=10000)
# 模型训练
estimator.fit(x_train, y_train)
# 预测
y_pred = estimator.predict(x_test)
print("预测值:", y_pred)
# 模型评估
print(classification_report(y_test, y_pred))
原创不易,请勿转载(
本不富裕的访问量雪上加霜)博主首页:https://wzlodq.blog.csdn.net/
来都来了,不评论两句吗👀
如果文章对你有帮助,记得一键三连❤