【AI知识】逻辑回归介绍+ 做二分类任务的实例(代码可视化)

ops/2024/12/19 14:20:00/

1. 分类的基本概念

在机器学习的有监督学习中,分类一种常见任务,它的目标是将输入数据分类到预定的类别中。具体来说:
在这里插入图片描述

分类任务的常见应用:

  • 垃圾邮件分类:判断一封电子邮件是否是垃圾邮件 。

  • 医学诊断:根据病人的症状、检查结果等特征预测病人的疾病类型(如癌症、糖尿病等)。

分类任务的类型:

  • 分类(Binary Classification): 在二分类问题中,模型需要将输入数据分为两个类别,输入属于两个类别中的一个。如判断一封邮件是垃圾邮件还是非垃圾邮件。

  • 分类(Multiclass Classification): 在多分类问题中,模型需要将输入数据分为超过两个类别,输入属于多个类别中的一个。如手写数字识别(数字 0 到 9),根据图像内容将其分类为一个数字。

  • 多标签分类(Multilabel Classification): 多标签分类任务是指每个样本可以同时属于多个类别,也就是一个样本可以同时拥有多个标签。如一部电影可以同时属于“动作”和“科幻”两个类别。

分类模型的常用算法: 逻辑回归(Logistic Regression)、支持向量机(SVM, Support Vector Machine)、 K-近邻算法(KNN, K-Nearest Neighbors)、 决策树(Decision Trees)、 随机森林(Random Forest)等。

回归和分类的区别:

  • 回归(Regression): 回归任务的目标是预测一个连续的数值输出,模型输出的是一个实数值。回归常用于预测数量、价格、温度等连续型变量。
  • 分类(Classification): 分类任务的目标是将输入样本分配到有限的类别中,它的输出是离散的标签,通常是类别的编号或名称。分类问题通常用于处理类别标签的任务。

2. 逻辑回归(Logistic Regression)

逻辑回归(Logistic Regression)是一种广泛使用的线性分类模型,尽管它的名字中带有“回归”二字,但它其实是一种用于分类任务的算法,特别适用于二分类问题,也可以通过扩展来处理多分类问题。逻辑回归通过使用Sigmoid函数将线性回归的输出转换为概率值,这个概率值表示一个样本属于某个类别的概率,从而进行分类预测。

在这里插入图片描述
Sigmoid函数将线性回归的结果 𝑧 转换为一个介于 0 和 1 之间的概率值 y ^ \hat{y} y^ ,通常通过设置一个阈值(比如 0.5)来进行分类判断。如果 y ^ \hat{y} y^ >=0.5 ,则预测为类别 1,否则类别为0。

  • 逻辑回归的损失函数: 与线性回归的均方误差(MSE)不同,做二分类逻辑回归使用的是对数损失函数(Log Loss),用于度量模型输出概率与真实标签之间的差异。
    在这里插入图片描述

  • 逻辑回归模型训练:逻辑回归通过最小化损失函数来训练模型,常用的方法是梯度下降。训练过程中,算法会迭代地调整模型参数 ,以最小化损失函数,从而使得模型的预测与真实标签更接近。

3. 逻辑回归做二分类任务的实例(代码+可视化)

import numpy as np
import matplotlib.pyplot as plt
from sklearn.datasets import make_classification
from sklearn.linear_model import LogisticRegression
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler# 1. 生成一个二维特征的二分类数据集
X, y = make_classification(n_samples=400, n_features=2, n_informative=2, n_redundant=0,n_clusters_per_class=1, random_state=42)# 2. 数据标准化(可选,但常见做法)
scaler = StandardScaler()
X_scaled = scaler.fit_transform(X)# 3. 将数据分为训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X_scaled, y, test_size=0.3, random_state=42)# 4. 数据可视化:展示训练数据的分布
plt.figure(figsize=(8, 6))
plt.scatter(X_train[y_train == 0][:, 0], X_train[y_train == 0][:, 1], color='blue', label='Class 0', alpha=0.7)
plt.scatter(X_train[y_train == 1][:, 0], X_train[y_train == 1][:, 1], color='red', label='Class 1', alpha=0.7)
plt.xlabel('Feature 1')
plt.ylabel('Feature 2')
plt.title('Training Data - Class Distribution')
plt.legend()
plt.show()

在这里插入图片描述

# 5. 创建逻辑回归模型并训练
model = LogisticRegression()
model.fit(X_train, y_train)# 6. 绘制决策边界函数
def plot_decision_boundary(X, y, model):# 生成网格点h = 0.01x_min, x_max = X[:, 0].min() - 1, X[:, 0].max() + 1y_min, y_max = X[:, 1].min() - 1, X[:, 1].max() + 1xx, yy = np.meshgrid(np.arange(x_min, x_max, h), np.arange(y_min, y_max, h))# 使用模型进行预测Z = model.predict(np.c_[xx.ravel(), yy.ravel()])Z = Z.reshape(xx.shape)# 绘制决策边界plt.contourf(xx, yy, Z, alpha=0.75, cmap='bwr')plt.colorbar()# 绘制数据点plt.scatter(X[:, 0], X[:, 1], c=y, cmap='bwr', s=30, edgecolors='k')plt.xlabel('Feature 1')plt.ylabel('Feature 2')plt.title('Logistic Regression Decision Boundary')
# 7. 可视化训练集的决策边界
plt.figure(figsize=(8, 6))
plot_decision_boundary(X_train, y_train, model)
plt.show()

在这里插入图片描述

# 8. 在测试集上评估模型
test_accuracy = model.score(X_test, y_test)
print(f"Test Accuracy: {test_accuracy:.2f}")
#Test Accuracy: 0.88

解释一下决策边界: 决策边界指的是在特征空间中将不同类别的样本分开的“边界”或“界限”。它是一个假设函数的边界,能够将数据点分到不同的类别。

假设有一个二维数据集,其中每个数据点由两个特征(x 和 y)构成,类别有两种(比如“0”和“1”)。那么,决策边界就是在二维平面上,一个将类别 0 和类别 1 分开的曲线或直线,如上图。

最后: 分类任务还有很多其他算法,每个都分开写博客说明,这里只介绍逻辑回归


http://www.ppmy.cn/ops/143200.html

相关文章

UE UMG 多级弹出菜单踩坑

多级弹出菜单 https://www.bilibili.com/video/BV1ub411J7nA 运行时添加 widget 的方法 create widget 然后 add child 到某个组件,比如 canvas 运行时修改 widget 位置的方法 set widget slot position 用起来没效果 怀疑是因为我没有传入 slot 但是暂时不知…

【前言】Python实践~数据库管理专栏规划

一、专栏定位与目标 1. 专栏定位 主题:数据库管理工具开发(Python实践)目标读者: 对数据库管理感兴趣的开发者。希望通过Python实现数据库自动化操作的初学者和中级开发者。需要开发数据库管理工具的项目团队。 2. 专栏目标 …

KeepAlive与RouterView缓存

参考 vue动态组件<Component>与<KeepAlive> KeepAlive官网介绍 缓存之keep-alive的理解和应用 Vue3Vite KeepAlive页面缓存问题 vue多级菜单(路由)导致缓存(keep-alive)失效 vue3 router-view keeperalive对于同一路径但路径…

修改uniapp下拉刷新圆圈颜色

直接看图 修改前就是常规的绿色 自定义更符合我们的软件 直接说方法 修改 在App.vue的style样式里添加一行 .uni-page-refresh--refreshing .uni-page-refresh__path{stroke:#FF2442; }我是通过 不执行 uni.stopPullDownRefresh(); 下拉刷新 之后通过F12看出来的 希望可以帮…

一键学懂BurpSuite(8)

声明! 学习视频来自B站up主 泷羽sec 有兴趣的师傅可以关注一下,如涉及侵权马上删除文章,笔记只是方便各位师傅的学习和探讨,文章所提到的网站以及内容,只做学习交流,其他均与本人以及泷羽sec团队无关&#…

cmake中 macro和函数的区别

语法形式上的区别 macro&#xff08;宏&#xff09;&#xff1a; 定义宏使用macro关键字&#xff0c;语法格式为macro(<macro_name> [arg1 [arg2 [...]]])。例如&#xff1a;macro(my_macro arg1 arg2)message("The first argument is ${arg1}")message("…

娱乐五子棋(附加源码)

一写在开头 上期代码主要实现瀑布流功能&#xff0c;本期就来实现五子棋小游戏&#xff0c;开发久了很多功能都是通过框架组件库来完成&#xff0c;但是如果组件满足不了开发需求&#xff0c;还需要开发人员手动封装组件&#xff0c;专门出这样一期文章&#xff0c;通过原生js实…

rpc设计的再次思考20251215(以xdb为核心构建游戏框架)

1.服务提供者注册的方式 // 表明这是一个服务提供者&#xff0c;ServerType 和 ServerId从application.properties中读取 // 而且只有当当前服务是Game时&#xff0c;才生效。 或者 条件注解??? RpcProvider(typeServerType.Game) public class GameProvider{MsgReceiver…