L3:逻辑回归 Logistic Regression
- 🍨 本文为🔗365天深度学习训练营 中的学习记录博客
- 🍖 原作者:K同学啊
介绍
Logistic 回归是机器学习中的一种分类算法,常用于二分类问题(如将数据分为0或者1,判断真或假,是或否)。Logistic regression并不用于预测连续值。
核心思想
通过对线性回归的输出进行变换,将输出值限定在0到1之间,并用来表示某个类别的概率。Logistic回归的模型可以被理解为是在一个线性模型上加上一个非线性转换函数(通常是Sigmoid 函数),从而用于解决分类问题
工作流程
- 线性回归模型:Logistic回归依赖于线性回归模型,即通过特征和权重的线性组合来计算输出:
z = w_1x_1 + w_2x_2 + \cdots + w_nx_n + b
其中,x_i是输入特征,w_i是权重,b是偏置项,z是线性回归的结果
2. Sigmoid函数:Logistic回归将线性回归的结果z通过Sigmoid函数转化为一个介于0和1之间的值,用于表示数据点属于某一类的概率。Sigmoid函数的公式为:
\sigma(z) = \frac{1}{1 + e^{-z}}
这个函数可以将任意实数映射到(0,1)区间,表示预测为正类的概率
3. 决策边界:当σ(z)>0.5,预测为正类(1);否则预测为负类(0)
损失函数
Logistic回归用**对数损失函数(log-loss)来衡量模型的预测效果:
\text{Cost}(h_\theta(x), y) = - y \log(h_\theta(x)) - (1 - y) \log(1 - h_\theta(x))
其中,y 是真实标签,h𝜃(x)是通过sigmoid函数计算的预测概率。通过最小化这个损失函数,模型可以调整参数,优化分类效果。
优化方法
Logistic回归通常使用梯度下降法或者拟牛顿法(如BFGS)来优化权重w和偏置b,以最小化损失函数
Logistic回归的应用场景
- 二分类问题:垃圾邮件分类、疾病诊断、广告点击率预测
- 多分类问题:通过一对多或者Softmax回归来处理多分类问题
- 概率估计:提供预测结果的概率值
数据处理
#导入需要的库
import numpy as np
import pandas as pd
from sklearn import datasets
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.metrics import accuracy_score, classification_report, confusion_matrix
#导入数据
iris = datasets.load_iris()#鸢尾花数据集
X = iris.data # 特征矩阵
y = iris.target # 目标变量
#数据预处理
scaler = StandardScaler()#特征标准化
X_scaled = scaler.fit_transform(X)
StandardScaler()是scikit-learn库中用于数据标准化处理的一个常用工具。通过标准化,将数据映射到一个均值为0,标准差为1的正态分布中,消除不同特征量纲的影响,更适用于SVM、逻辑回归、神经网络等基于梯度的模型
特征量纲:特征量纲(Feature Scale)指的是数据集中各个特征的取值范围或度量单位。不同特征可能有不同的量纲,即不同的度量单位和数值范围(如身高可能以米或厘米为单位,取值在几十到几百之间
#划分训练集和测试集(20%的测试集)
X_train, X_test, y_train, y_test = train_test_split(X_scaled, y,
test_size=0.2,
random_state=42)
#逻辑回归模型
from sklearn.linear_model import LogisticRegression
model = LogisticRegression(max_iter=200)
model.fit(X_train, y_train)
max_iter :迭代次数,默认为100,设为200以保证收敛
#预测结果
y_pred = model.predict(X_test)
#评估预测结果
accuracy = accuracy_score(y_test, y_pred)
print(f"模型的准确率: {accuracy:.2f}")
# 打印分类报告
print("分类报告:")
print(classification_report(y_test, y_pred, target_names=iris.target_names))
# 打印混淆矩阵
print("混淆矩阵:")
print(confusion_matrix(y_test, y_pred))
总结
优点
- 模型结构简单
- 速度快,适合大规模数据
- 可解释性强
缺点
- 易受异常值影响
- 数据不线性可分时,表现较差