机器学习——逻辑回归(LR)

news2024/9/22 17:25:07

机器学习——逻辑回归(LR)

文章目录

  • 前言
  • 一、原理介绍
  • 二、代码实现
    • 2.2. 混淆矩阵
    • 2.3. 分类报告
    • 2.4. 可视化分类结果
  • 三、额外(先划分数据集再降维与先降维再划分数据集)
    • 3.1. 先划分数据集再降维
    • 3.2. 先降维再划分数据集
    • 3.3. 比较
  • 总结


前言

在机器学习的分类算法中,逻辑回归是一个基础的分类算法,本文将简单介绍一下逻辑回归算法。


在这里插入图片描述

一、原理介绍

尽管名字中带有"回归"这个词,但逻辑回归其实是一种用于分类问题的算法,而不是回归问题

逻辑回归是一种广义线性模型,它通过使用逻辑函数(也称为sigmoid函数)将输入的线性组合映射到[0,1]之间的概率值,用于预测二分类问题的概率。在逻辑回归中,我们根据预测的概率值来判断样本属于哪个类别。 σ(x) = 1 / (1 + exp(-x))

通常情况下,我们将概率大于等于阈值的样本划分为正类,将概率小于阈值的样本划分为负类(阈值可自行设置,一般情况下为0.5)

然而,逻辑回归算法也可以用于多分类问题。一种常见的方法是使用一对多策略,将多分类问题转化为多个二分类问题
在sklearn库中,LogisticRegression模型默认使用一对多(OvR)策略来处理多类别分类问题。

sigmoid函数图如下所示:

import numpy as np
import matplotlib.pyplot as plt

def sigmoid(x):
    return 1 / (1 + np.exp(-x))

x = np.linspace(-10, 10, 100)
y = sigmoid(x)

# 绘制sigmoid函数图形
plt.style.use("ggplot")
plt.plot(x, y)
plt.xlabel('x')
plt.ylabel('sigmoid(x)')
plt.title('Sigmoid Function')
plt.show()

在这里插入图片描述

二、代码实现

使用鸢尾花数据集

#加载iris数据集
from sklearn.datasets import load_iris
iris = load_iris()
x = iris.data
y = iris.target
from sklearn.model_selection import train_test_split
x_train, x_test, y_train, y_test = train_test_split(x,y, test_size=0.3,random_state=41)
from sklearn import preprocessing
scaler = preprocessing.StandardScaler().fit(x_train)
x_train = scaler.transform(x_train)
x_test = scaler.transform(x_test)

#逻辑回归
from sklearn.linear_model._logistic import LogisticRegression
model = LogisticRegression(max_iter= 1000)
model.fit(x_train,y_train)
#计算分类的正确率
print(model.score(x_test,y_test))
0.8888888888888888

#查看分类的概率值
#print(model.predict_proba(x_test))

#在测试集上实现预估
y_pred = model.predict(x_test)
#print(y_pred,y_test)

2.2. 混淆矩阵

使用混淆矩阵,观察每种类别被错误分类的情况(以矩阵形式将数据集中的记录按真实的类别与分类模型预测的类别判断两个标准进行汇总)
如图所示:
在这里插入图片描述

例如:图中a 代表真实值为类别1,预测值也为类别1的正确分类的样本数; 图中b 代表真实值为类别2,预测值却为类别1的错误分类的样本数

#混淆矩阵
from sklearn.metrics import confusion_matrix
print(confusion_matrix(y_true=y_test,y_pred=y_pred))
[[11  0  0]
 [ 0 16  2]
 [ 0  3 13]]

混淆矩阵的可视化

import seaborn as sns
cm = confusion_matrix(y_test, y_pred)
sns.heatmap(cm, annot=True, fmt='d', cmap='Blues')
plt.xlabel('Predicted')
plt.ylabel('True')
plt.title('Confusion Matrix')
plt.show()

在这里插入图片描述

2.3. 分类报告

使用分类报告来查看一下针对每个类别的预测准确性

  1. precision : 精确度,表示模型正确预测为某个类别的样本数量与所有预测为该类别的样本数量的比例

  2. recall:召回率,表示模型正确预测为某个类别的样本数量与所有实际属于该类别的样本数量的比例

  3. f1-score : f1分数,可视为精确度与召回率的加权平均值。取值范围为 0 到 1,越接近 1 表示模型的性能越好。F1 = (precision * recall ) / (precision + recall )

  4. support:支持数量,属于某个类别的样本数量

  5. accuracy:准确率,指模型在整个测试数据集上的分类正确率。即预测正确的样本数量与总样本数量的比例

  6. 宏平均(macro avg)和加权平均(weighted avg)

#分类报告
from sklearn.metrics import classification_report
print(classification_report(y_test,y_pred,target_names= iris["target_names"]))
              precision    recall  f1-score   support

      setosa       1.00      1.00      1.00        11
  versicolor       0.84      0.89      0.86        18
   virginica       0.87      0.81      0.84        16

    accuracy                           0.89        45
   macro avg       0.90      0.90      0.90        45
weighted avg       0.89      0.89      0.89        45

2.4. 可视化分类结果

import numpy as np
import matplotlib.pyplot as plt
from sklearn.linear_model import LogisticRegression
from sklearn.decomposition import PCA

# 加载数据集
from sklearn.datasets import load_iris
iris = load_iris()
x = iris.data
y = iris.target

# 数据的划分
from sklearn.model_selection import train_test_split
x_train, x_test, y_train, y_test = train_test_split(x, y, random_state=20)

# 标准化
from sklearn import preprocessing
scaler = preprocessing.StandardScaler().fit(x_train)
x_train = scaler.transform(x_train)
x_test = scaler.transform(x_test)

# 使用PCA进行降维
pca = PCA(n_components=2)
x_train_pca = pca.fit_transform(x_train)
x_test_pca = pca.transform(x_test)

# 创建逻辑回归模型
clf = LogisticRegression()
clf.fit(x_train_pca, y_train)

# 使用模型进行预测
y_pred = clf.predict(x_test_pca)

# 绘制散点图
plt.scatter(x_test_pca[:, 0], x_test_pca[:, 1], c=y_pred)
plt.xlabel('Principal Component 1')
plt.ylabel('Principal Component 2')
plt.title('Logistic Regression Classification - Predicted Classes')
plt.show()

# 绘制决策边界图
h = 0.02  # 步长
x1_min, x1_max = x_test_pca[:, 0].min() - 1, x_test_pca[:, 0].max() + 1
x2_min, x2_max = x_test_pca[:, 1].min() - 1, x_test_pca[:, 1].max() + 1
xx1, xx2 = np.meshgrid(np.arange(x1_min, x1_max, h), np.arange(x2_min, x2_max, h))
Z = clf.predict(np.c_[xx1.ravel(), xx2.ravel()])
Z = Z.reshape(xx1.shape)

plt.contourf(xx1, xx2, Z, alpha=0.8)
plt.scatter(x_test_pca[:, 0], x_test_pca[:, 1], c=y_pred)
plt.xlabel('Principal Component 1')
plt.ylabel('Principal Component 2')
plt.title('Logistic Regression Classification - Decision Boundary')
plt.show()

在这里插入图片描述

在这里插入图片描述

三、额外(先划分数据集再降维与先降维再划分数据集)

先划分数据集再降维与先降维再划分数据集这两种方法有一些区别。

3.1. 先划分数据集再降维

先划分数据集再降维:数据集首先被划分为训练集和测试集,然后在训练集上进行降维操作,然后将降维后的特征应用于测试集。

这种方法的优点是可以在训练集上学习降维的变换,并将这个变换应用于测试集,以获得测试集上的一致性。然而,这种方法可能会导致信息泄露,因为降维过程中使用了测试集的信息,可能会对模型的性能产生偏向。

3.2. 先降维再划分数据集

先降维再划分数据集:首先在整个数据集上进行降维操作,然后再将降维后的数据集划分为训练集和测试集。

这种方法的优点是可以避免信息泄露问题,因为降维过程中没有使用测试集的信息。然而,这种方法可能会**导致训练集和测试集之间的不一致性,**因为降维过程是在整个数据集上进行的,而不是在训练集上进行的。

3.3. 比较

哪种方法更好取决于具体的情况。如果数据集足够大,并且降维过程中不会泄露太多信息,那么先划分数据集再降维可能是一个更好的选择,因为可以在训练集上学习到更好的降维变换。

如果数据集较小,或者存在信息泄露的风险,那么先降维再划分数据集可能是一个更好的选择,以确保训练集和测试集之间的一致性。

最好是根据具体问题和数据集的特点进行实验和比较,选择最适合的方法。


总结

本文从逻辑回归算法的原理介绍到代码实现中的回归模型的构建以及混淆矩阵和分类报告的介绍,还有对分类结果的可视化。详细介绍了LR算法,还有最后的先划分数据集再降维还是先降维再划分数据集的讨论。

明月几时有,把酒问青天

–2023-9-5 筑基篇

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/986793.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

2023数学建模国赛选题建议及BC题思路

大家好呀,全国大学生数学建模竞赛今天下午开赛啦,在这里先带来初步的选题建议及思路。 目前团队正在写B题和C题完整论文,后续还会持续更新哈,以下只是比较简略的图文版讲解,团队目前正在写B、C题完整论文,…

【C语言】进阶——深度剖析数据的存储

目录 1.数据类型 🐻整型分类 2.整型在内存中的存储 🐻2.1原码,反码,补码 🐻2.2大小端介绍 3.浮点数在内存中的存储 1.数据类型 使用不同类型开辟内存空间的大小不同(大小决定了使用范围&#xff09…

jmeter系列-测试计划详细介绍(3)

测试计划的作用 测试计划描述了 Jmeter 在执行时,一系列的步骤一个完整的测试计划包含了一个或多个【线程组、逻辑控制器、采样器、监听器、定时器、断言和配置元素】 Jmeter原件和组件的介绍 基本元件的介绍 多个类似功能组件的 容器(类似于类&…

第四节唯物辩证法(两大总特征)

新旧事物与时间无关,与是否合乎历史方向有关,如有些00后思想可能落后与80后

【C++】内联函数讲解和关键字inline纯干货简介

今日翻看《C Primer Plus》,看到一个陌生的东西--内联函数,立马前来记录一下。 内联函数和常规函数区别 为了明白内联函数和常规函数的区别,首先需要知道程序运行时,遇到常规函数时如何处理的: 编译过程的最终产品时…

python+django青少年心理健康测评分析与预警的设计与实现vue

本青少年心理健康测评分析与预警主要包括二大功能模块,即用户功能模块和管理员功能模块。 (1)管理员模块:系统中的核心用户是管理员,管理员登录后,通过管理员功能来管理后台系统。主要功能有:首…

记LGSVL本地编译记录

主要的编译参考来着官方文件 Unity安装 安装unity hub 安装2020.3.3f1在unity hub上 但是我发现没有2020.3.3f1,只有2020.3.3f1c1,其实c1就是中国版,没有什么影响 GIT安装 安装GIT安装Git LFS验证git-lfs(输出Git LFS initialized就&am…

【代码随想录】Day 50 动态规划11 (买卖股票Ⅲ、Ⅳ)

买卖股票Ⅲ https://leetcode.cn/problems/best-time-to-buy-and-sell-stock-iii/ 无语了。。。 写的很好就是怎么都过不了。。。 还是就用代码随想录的写法吧。。。 class Solution { public:int maxProfit(vector<int>& prices) {int n prices.size();vector&…

雅思写作 三小时浓缩学习顾家北 笔记总结(五)

目录 饥饿网100句翻译练习 Many girls are unwilling to seek employment in male-dominated industries. Many girls are not willing to find jobs in male-dominated industries. The main function of schools is to impart knowledge to the next generation. The ar…

Map,List,Set 等集合以及底层数据结构

文章目录 概述一、Collection接口&#xff08;1&#xff09;List列表 —— 有序、值可重复&#xff08;2&#xff09;Set 集 —— 值不可重复 二、Map接口&#xff08;1&#xff09;HashMap —— 无序1、取模法2、Hash碰撞冲突3、解决Hash冲突 &#xff08;2&#xff09;HashTa…

创邻科技Galaxybase助力SPG推动知识图谱应用落地

1. 知识图谱实践应用&#xff1a;从理论到落地的全景视角 知识图谱&#xff0c;作为一种先进的数据模型和信息表示策略&#xff0c;极大地提升了信息检索与分析的能力。该模型利用图结构&#xff0c;将不同领域、层次和类别的信息有机整合&#xff0c;令复杂的数据关系变得清晰…

Json“牵手”阿里巴巴商品详情数据方法,阿里巴巴商品详情API接口,阿里巴巴API申请指南

阿里巴巴平台是全球领先的网上B2B交易市场。阿里巴巴&#xff08;B2B.com&#xff09;是全球国际贸易领域内最大、最活跃的网上交易市场和商人社区。它拥有来自200余个国家和地区超过360万的注册用户&#xff0c;阿里巴巴中国站在中国地区拥有超过2100万的注册用户。 阿里巴巴…

PostgreSQL 查询修改max_connections(最大连接数)及其它配置

文章目录 查询max_connections(最大连接数)修改max_connections(最大连接数)其他配置 查询max_connections(最大连接数) SHOW max_connections;修改max_connections(最大连接数) 要设置PostgreSQL数据库的最大连接数&#xff0c;你需要修改数据库的配置文件 postgresql.conf。…

Fiddler 系列教程(二) Composer创建和发送HTTP Request跟手机抓包

Fiddler Composer介绍 Composer的官方帮助文档&#xff1a;http://www.fiddler2.com/fiddler/help/composer.asp Fiddler的作者把HTTP Request发射器取名叫Composer(中文意思是&#xff1a;乐曲的创造者), 很有诗意 Fiddler Composer的功能就是用来创建HTTP Request 然后发送…

C++多态【下】

文章目录 1.多态实现的底层1.1初识多态原理1.2深入理解虚函数表1.单继承虚函数表2.探究虚函数表存储数据3.知识点金4.多继承虚函数表 2.题目讲解 1.多态实现的底层 1.1初识多态原理 class Dad { public:virtual void Cook() { cout << "佛跳墙" << en…

Kafka3.0.0版本——消费者(消费者组原理)

目录 一、消费者组原理1.1、消费者组概述1.2、消费者组图解示例1.3、消费者组注意事项 一、消费者组原理 1.1、消费者组概述 Consumer Group&#xff08;CG&#xff09;&#xff1a;消费者组&#xff0c;由多个consumer组成。形成一个消费者组的条件&#xff0c;是所有消费者…

Qt实现图书管理系统(C++)

文章目录 数据库表的实现创建表将powerDesigner里面的表导出成xxx.sql脚本将SQL文件导入数据库创建表 图书管理系统思维导图创建工程开发阶段创建Dlg_login登录页面login页面样式主页页面布局主函数测试login设置logo打包程序子页面的样子将子页面放到StackedWidget里面按钮直接…

springboot MongoDB 主从 多数据源

上一篇&#xff0c;我写了关于用一个map管理mongodb多个数据源&#xff08;每个数据源&#xff0c;只有单例&#xff09;的内容。 springboot mongodb 配置多数据源 临到部署到阿里云的测试环境&#xff0c;发现还需要考虑一下主从的问题&#xff0c;阿里云买的数据库&#x…

C语言——指针完全版

一、指针的运算 1.1指针 - 整数 总结&#xff1a;指针的类型决定了指针向前或者向后走一步有多大&#xff08;距离&#xff09;。 1.2指针 - 指针 int main() {int arr[10] { 0 };printf("%d\n", &arr[9] - &arr[0]);return 0; } 当我们想用两个指针相减时…

【100天精通Python】Day57:Python 数据分析_Pandas数据描述性统计,分组聚合,数据透视表和相关性分析

目录 1 描述性统计&#xff08;Descriptive Statistics&#xff09; 2 数据分组和聚合 3 数据透视表 4 相关性分析 1 描述性统计&#xff08;Descriptive Statistics&#xff09; 描述性统计是一种用于汇总和理解数据集的方法&#xff0c;它提供了关于数据分布、集中趋势和…