【机器学习】逻辑回归|分类问题评估|混淆矩阵|ROC曲线|AUC指标 介绍及案例代码实现

文章目录

  • 逻辑回归
    • 逻辑回归简介
    • 逻辑回归的数学基础
    • 逻辑回归原理
      • 概念
      • 损失函数
    • 逻辑回归API函数和案例
      • 案例癌症分类预测
    • 分类问题评估
      • 混淆矩阵
      • 分类评估方法 - 精确率 召回率 F1
      • ROC曲线 AUC指标
        • 案例
        • AUC 计算的API
        • 分类评估报告api
    • 电信客户流失预测案例

逻辑回归

逻辑回归简介

​ 逻辑回归是解决二分类问题的利器
在这里插入图片描述

逻辑回归的数学基础

  • sigmoid函数:

在这里插入图片描述

  • 概率 - 事件发生的可能性

    联合概率和条件概率是概率论中的基本概念,它们用于描述随机变量之间的关系,如:北京早上堵车的可能性 P_A = 0.7

    中午堵车的可能性 P_B = 0.3

    晚上堵车的可能性 P_C = 0.4

  • 联合概率 – 指两个或多个随机变量同时发生的概率

    P_A = 0.7 周1早上 周2早上同时堵车的概率P_A P_B = 0.7*0.7 = 0.49

  • 条件概率 –表示事件A在另外一个事件B已经发生条件下的发生概率,P(a|b)

    P_A = 0.7 周1早上 堵车的情况下,中午再堵车的概率 P_B|A = 0.7 * 0.3 = 0.21

  • 极大似然估计

    核心思想:根据观测到的结果来估计模型算法中的未知参数

在这里插入图片描述

​ 例如:

​ 假设有一枚不均匀的硬币,出现正面的概率和反面的概率是不同的。假定出现正面的概率为𝜃,
抛了6次得到如下现象 D = {正面,反面,反面,正面,正面,正面}。每次投掷事件都是相互独立的。
则根据产生的现象D,来估计参数𝜃是多少?

在这里插入图片描述

逻辑回归原理

概念

  • 逻辑回归概念 Logistic Regression
    • 一种分类模型,把线性回归的输出作为逻辑回归的输入
    • 输出是(0,1)之间的值
  • 基本思想
    • 利用线性模型 f(x) = w^T + b 根据特征的重要性计算出的一个值
    • 在使用sigmoid函数 将f(x)的输出映射为概率值
      • 设置阈值(eg:0.5) 输出概率值大于0.5归类为1类 否则归类为0类
  • 逻辑回归的假设函数
    • h(w) = sigmoid(w^T + b)
    • 线性回归的输出作为逻辑回归的输入
  • 举例

在这里插入图片描述

损失函数

  • 公式
    在这里插入图片描述

  • 损失函数的设计思想: 预测值为A B 两个类别 真实类别所在的位置 概率值越大越好

逻辑回归API函数和案例

sklearn.linear_model.LogisticRegression(solver='liblinear', penalty=‘l2’, C = 1.0)
  • solver 损失函数优化方法:
    • iblinear 对小数据集场景训练速度更快,sag 和 saga 对大数据集更快一些。
    • 2 正则化:
      • 1 sag、saga 支持 L2 正则化或者没有正则化
      • 2 liblinear 和 saga 支持 L1 正则化
  • penalty:正则化的种类,l1 或者 l2
  • C:正则化力度
  • 默认将类别数量少的当做正例

案例癌症分类预测

  • 数据描述

(1)699条样本,共11列数据,第一列用语检索的id,后9列分别是与肿瘤相关的医学特征,
​ 最后一列表示肿瘤类型的数值。
(2)包含16个缺失值,用”?”标出。
(3)2表示良性,4表示恶性

在这里插入图片描述

  • 代码实现
"""
案例:
    逻辑回归模型 预测癌症信息
逻辑回归:
    属于回归任务的一种 主要用于二分法
    原理:
        1.把线性回归的值 传入 Sigmoid 函数 计算概率
        2.手动蛇者阈值(eg:0.6) 然后查看上述的概率是否达到我们设定的阈值 及逆行分类
    损失函数:
        先基于 极大似然函数计算 然后转换成对数似然函数 当做损失函数 结合梯度下降计算最小值

"""

import pandas as pd
import numpy as np
from sklearn.linear_model import LinearRegression, LogisticRegression
from sklearn.metrics import mean_squared_error, accuracy_score  # 计算均方误差
from sklearn.model_selection import train_test_split
from sklearn.linear_model import Ridge, Lasso
from sklearn.preprocessing import StandardScaler


def demo01():
    data = pd.read_csv(r"D:\hm\homework\pywork\workProject\ML_Project\data\breast-cancer-wisconsin.csv")
    # 数据预处理 用 np.NaN 替换? 缺失值
    data = data.replace('?', np.NaN)
    # 删除缺失值 按行删除
    data.dropna(axis=0, inplace=True)  # axis = 0 按行删除
    # 手动提取数据 即 特征和标签
    print(data.head())
    x = data.iloc[:, 1:10]
    y = data.iloc[:, 10]
    # 划分训练集和测试集
    x_train, x_test, y_train, y_test = train_test_split(x, y, test_size=0.2)
    # 特征工程
    transfer = StandardScaler()
    x_train = transfer.fit_transform(x_train)
    x_test = transfer.transform(x_test)
    # 模型训练
    estimator = LogisticRegression()
    estimator.fit(x_train, y_train)
    # 模型预测
    y_predict = estimator.predict(x_test)

    # 模型评估
    print('准确率:', estimator.score(x_test, y_test))  # 预测前 评估
    print('准确率:', accuracy_score(y_test, y_predict)) # 预测后 评估

    # 混淆矩阵 精准率 召回率 F1值(F1-score) AUC值(Area under Curve), ROC 曲线



if __name__ == '__main__':
    demo01()

分类问题评估

混淆矩阵

在这里插入图片描述

  • 混淆矩阵的四个指标

    • 真实值是 正例 的样本中,被分类为 正例 的样本数量有多少,叫做真正例(TP,True Positive)
    • 真实值是 正例 的样本中,被分类为 假例 的样本数量有多少,叫做伪反例(FN,False Negative)
    • 真实值是 假例 的样本中,被分类为 正例 的样本数量有多少,叫做伪正例(FP,False Positive)
    • 真实值是 假例 的样本中,被分类为 假例 的样本数量有多少,叫做真反例(TN,True Negative)
  • 例子

    已知:样本集10样本,有 6 个恶性肿瘤样本,4 个良性肿瘤样本,我们假设恶性肿瘤为正例

模型A:预测对了 3 个恶性肿瘤样本,4 个良性肿瘤样本
请计算:TP、FN、FP、TN

真正例 TP 为:3
伪反例 FN 为:3
伪正例 FP 为:0
真反例 TN:4

模型B:预测对了 6 个恶性肿瘤样本,1个良性肿瘤样本
请计算:TP、FN、FP、TN

真正例 TP 为:6
伪反例 FN 为:0
伪正例 FP 为:3
真反例 TN:1

注意:TP+FN+FP+TN = 总样本数量

分类评估方法 - 精确率 召回率 F1

  • 精确率

    • 查准率,对正例样本的预测准确率。比如:把恶性肿瘤当做正例样本,想知道模型对恶性肿瘤的预测准确率。
    • 计算方法:P = TP/TP+ FP
    • 例子
      在这里插入图片描述
  • 召回率

    • 也叫查全率,指的是预测为真正例样本占所有真实正例样本的比重例如:恶性肿瘤当做正例样本,则我们想知道模型是否能把所有的恶性肿瘤患者都预测出来。

    • 计算方法:P = TP/TP+ FN

    • 在这里插入图片描述

    • 例子

在这里插入图片描述

  • F1 - score
    • 若对模型的精度、召回率都有要求,希望知道模型在这两个评估方向的综合预测能力?
    • 计算方法:P == 2 ∗Precision ∗Recall/Precision+Recall

在这里插入图片描述

  • 代码实现
"""
演示 逻辑回归模型 的评估方式 即: 精确率 召回率 F1值

混淆矩阵解释:
    概述:
        用来描述 真实值(样本值)中 正例,反例 和 预测值的 正例,反例 之间的关系的
    名词解释:
        真正例(TP True Positive) : 样本值 = 正例 预测值 = 正例
        伪正例(FP False Positive) : 样本值 = 假例 预测值 = 正例
        真反例(TN True Negative) : 样本值 = 假例 预测值 = 假例
        伪反例(FN False Negative) : 样本值 = 正例 预测值 = 假例

逻辑回归模型评估
    方式1: 正确率(准确率)   预测的真实结果/样本总数
    方式2: 精确率(Precision) tp/ tp + fp  (精度)
    方式3: 召回率(Recall) tp/tp + fn     (查全率)
    方式3: 召回率(Recall) tp/tp + fn     (查全率)
    方式4 F1-score 2*Precision*Recall / Precision + Recall
"""

import pandas as pd
from sklearn.metrics import confusion_matrix, precision_score, recall_score, f1_score

# 1.准备样本集 6个恶行肿瘤 4 个 良性肿瘤   即: 训练集的标签
y_train = ['恶性', '恶性', '恶性', '恶性', '恶性', '恶性', '良性', '良性', '良性', '良性']
# 2. 准备标签
labels = ['恶性', '良性']

# 3. 准备预测值 即 模型a 预测对 3个恶性 4个良性
y_pred_a = ['恶性', '恶性', '恶性', '良性', '良性', '良性', '良性', '良性', '良性', '良性']

# 4.准备预测值 即 模型b 预测对了 6个恶性 1个良性
y_pred_b = ['恶性', '恶性', '恶性', '恶性', '恶性', '恶性', '恶性', '恶性', '恶性', '良性']

# 5. 基于模型 a 构建混淆矩阵 (confusion_matrix)
cm_a = confusion_matrix(y_train, y_pred_a, labels=labels)
print(cm_a)

# 6. 把上述的混淆矩阵 转成 DataFrame
cm_a_df = pd.DataFrame(cm_a, index=labels, columns=labels)
print(cm_a_df)
print('------------------------------------------------------------------------------------------')
# 7. 基于模型 b 构建混淆矩阵 (confusion_matrix)
cm_b = confusion_matrix(y_train, y_pred_b, labels=labels)
print(cm_b)

# 8. 把上述的混淆矩阵 转成 DataFrame
cm_b_df = pd.DataFrame(cm_b, index=labels, columns=labels)
print(cm_b_df)

# 9.计算a b 的精确率
precision_a = cm_a[0][0] / (cm_a[0][0] + cm_a[1][0])
precision_b = cm_b[0][0] / (cm_b[0][0] + cm_b[1][0])

precision_a1 = precision_score(y_train, y_pred_a,pos_label='恶性')
precision_b1 = precision_score(y_train, y_pred_b,pos_label='恶性')
print('精确率 a:{}, b:{}'.format(precision_a, precision_b))
print('精确率 a1:{}, b1:{}'.format(precision_a1, precision_b1))

# 10.计算a b 的召回率
recall_a = cm_a[0][0] / (cm_a[0][0] + cm_a[0][1])
recall_b = cm_b[0][0] / (cm_b[0][0] + cm_b[0][1])
print('召回率 a:{}, b:{}'.format(recall_a, recall_b))
recall_a1 = recall_score(y_train, y_pred_a,pos_label='恶性')
recall_b1 = recall_score(y_train, y_pred_b,pos_label='恶性')
print('召回率 a1:{}, b1:{}'.format(recall_a1, recall_b1))

# 11.计算a b 的F1值
f1_a = 2 * precision_a * recall_a / (precision_a + recall_a)
f1_b = 2 * precision_b * recall_b / (precision_b + recall_b)
print('F1值 a:{}, b:{}'.format(f1_a, f1_b))
f1_a1 = f1_score(y_train, y_pred_a,pos_label='恶性')
f1_b1 = f1_score(y_train, y_pred_b,pos_label='恶性')
print('F1值 a1:{}, b1:{}'.format(f1_a1, f1_b1))

ROC曲线 AUC指标

  • 真正率TPR与假正率FPR
    • 1 正样本中被预测为正样本的概率TPR (True Positive Rate)
    • 2 负样本中被预测为正样本的概率FPR (False Positive Rate)
    • 通过这两个指标可以描述模型对正/负样本的分辨能力
  • ROC曲线(Receiver Operating Characteristic curve)
    • 是一种常用于评估分类模型性能的可视化工具。ROC曲线以模型的真正率TPR为纵轴,假正率FPR为横轴,它将模型在不同阈值下的表现以曲线的形式展现出来。
  • AUC (Area Under the ROC Curve)曲线下面积
    • ROC曲线的优劣可以通过曲线下的面积(AUC)来衡量,AUC越大表示分类器性能越好。
      当AUC=0.5时,表示分类器的性能等同于随机猜测
      当AUC=1时,表示分类器的性能完美,能够完全正确地将正负例分类。****

在这里插入图片描述

  • ROC 曲线图像中,4 个特殊点的含义

点坐标说明:图像x轴FPR/y轴TPR, 任意一点坐标A(FPR值, TPR值)
点(0, 0) :所有的负样本都预测正确,所有的正样本都预测为错误 。相当于点的(FPR值0, TPR值0)
点(1, 0) :所有的负样本都预测错误,所有的正样本都预测错误。相当于点的(FPR值1, TPR值0)

最不好的效果 :点(1, 1):所有的负样本都预测错误,表示所有的正样本都预测正确。相当于点的(FPR值1,TPR值1)
最好的效果: 点(0, 1):所有的负样本都预测正确,表示所有的正样本都预测正确 。相当于点的(FPR值0,TPR值1)

  • 从图像上来看
    • 曲线越靠近 (0,1) 点则模型对正负样本的辨别能力就越强
    • AUC 是 ROC 曲线下面的面积,该值越大,则模型的辨别能力就越强,AUC 范围在 [0, 1] 之间
      当 AUC= 1 时,该模型被认为是完美的分类器,但是几乎不存在完美分类器
      当 AUC <= 0.5 时,模型区分正负样本的就会变得模棱两可,近似于随机猜测
案例

在这里插入图片描述

思路分析:根据不同的阈值,求出TPR、FPR,得出点坐标画ROC图

在这里插入图片描述

AUC 计算的API
from sklearn.metrics import roc_auc_score
sklearn.metrics.roc_auc_score(y_true, y_score)

计算ROC曲线面积,即AUC值
y_true:每个样本的真实类别,必须为0(反例),1(正例)标记
y_score:预测得分,可以是正例的估计概率、置信值或者分类器方法的返回值

分类评估报告api
sklearn.metrics.classification_report(y_true, y_pred, labels=[], target_names=None )

y_true:真实目标值
y_pred:估计器预测目标值
labels:指定类别对应的数字
target_names:目标类别名称
return:每个类别精确率与召回率

电信客户流失预测案例

  • 案例需求:
    • 已知:用户个人,通话,上网等信息数据
    • 需求:通过分析特征属性确定用户流失的原因,以及哪些因素可能导致用户流失。建立预测模型来判断用户是否流失,并提出用户流失预警策略。
  • 数据集介绍

在这里插入图片描述
在这里插入图片描述

  • 案例步骤分析

    1、数据基本处理
    主要是查看数据行/列数量
    对类别数据数据进行one-hot处理
    查看标签分布情况
    2、特征筛选
    分析哪些特征对标签值影响大
    对标签进行分组统计,对比0/1标签分组后的均值等
    初步筛选出对标签影响比较大的特征,形成x、y
    3、模型训练
    样本均衡情况下模型训练
    样本不平衡情况下模型训练
    交叉验证网格搜素等方式模型训练
    4、模型评估
    精确率
    Roc_AUC指标计算

  • 代码实现

"""
案例
    电信用户流失预测
"""
# 定义函数 表示数据预处理
# 定义函数 表示 数据查看 绘图
# 定义函数 表示 模型训练 评估 预测

import pandas as pd
import numpy as np
import seaborn as sns
import matplotlib.pyplot as plt


# 定义函数 数据预处理
def demo01():
    churn_df = pd.read_csv(r'D:\hm\homework\pywork\workProject\ML_Project\data\churn.csv')
    churn_df.info()

    # 数据预处理 把 字符串列 转成 数字列 采用 one-hot  热编码
    churn_df = pd.get_dummies(churn_df)
    churn_df.info()
    churn_df.head()

    churn_df.drop(['Churn_No', 'gender_Male'], axis=1, inplace=True)

    # 修改列名
    churn_df.rename(columns={'Churn_Yes': 'flag'}, inplace=True)
    churn_df.info()
    churn_df.head()


# 特征筛选
def demo02():
    churn_df = pd.read_csv(r'D:\hm\homework\pywork\workProject\ML_Project\data\churn.csv')
    churn_df = pd.get_dummies(churn_df)
    churn_df.drop(['Churn_No', 'gender_Male'], axis=1, inplace=True)
    churn_df.rename(columns={'Churn_Yes': 'flag'}, inplace=True)
    print(churn_df.head())
    print(churn_df.flag.value_counts())
    print(churn_df.columns)
    sns.countplot(data=churn_df, x='Contract_Month', hue='flag')
    plt.show()


if __name__ == '__main__':
    demo02()
  • 运行结果
    在这里插入图片描述

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

matlab不小心删除怎么撤回

预设项——>删除文件——>移动至临时文件夹 tem临时文件夹下

SwiftUI 6.0(iOS 18)新增的网格渐变色 MeshGradient 解惑

概述 在 SwiftUI 中&#xff0c;我们可以借助渐变色&#xff08;Gradient&#xff09;来实现更加灵动多彩的着色效果。从 SwiftUI 6.0 开始&#xff0c;苹果增加了全新的网格渐变色让我们对其有了更自由的定制度。 因为 gif 格式图片自身的显示能力有限&#xff0c;所以上面的…

【自动驾驶汽车通讯协议】GMSL通信技术以及加串器(Serializer)解串器(Deserializer)介绍

文章目录 0. 前言1. GMSL技术概述2. 为什么需要SerDes&#xff1f;3. GMSL技术特点4.自动驾驶汽车中的应用5. 结论 0. 前言 按照国际惯例&#xff0c;首先声明&#xff1a;本文只是我自己学习的理解&#xff0c;虽然参考了他人的宝贵见解及成果&#xff0c;但是内容可能存在不准…

六西格玛黑带项目:TBX-02无人机飞行稳定性提升——张驰咨询

一、项目背景与问题定义 TBX-02是该公司最新发布的消费级无人机&#xff0c;面向摄影爱好者和户外探险者。产品上市后&#xff0c;通过客户反馈和实际测试数据发现&#xff0c;该无人机在复杂飞行环境中&#xff0c;如强风或快速移动时&#xff0c;存在明显的飞行抖动和稳定性…

RabbitMQ初识

目录 Kafka RocketMQ RabbitMQ MQ界面(它使用的端口号5672&#xff0c;界面是15672&#xff09; 如何添加一个虚拟机&#xff0c;点击右侧 Topics&#xff08;通配符模式&#xff09; 发布确认机制 持久性(可靠性保证的机制之一) JDK17,Linux服务器Ubuntu 什么是MQ 实…

前端开发笔记--html 黑马程序员2

文章目录 前端常用标签一、标题标签二、段落标签和换行标签和水平线标签三、文本格式化标签![请添加图片描述](https://i-blog.csdnimg.cn/direct/87583fa23fe04229b016912051f3fc45.png)四、盒子标签五、图像标签六、连接标签七、注释和特殊字符 八、表格标签的基本使用九、列…

48 Redis

48 Redis 前言 Redis&#xff08;Remote Dictionary Server )&#xff0c;即远程字典服务。是一个开源的使用ANSI C语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库&#xff0c;并提供多种语言的API。 redis会周期性的把更新的数据写入磁盘或者把修改操…

数据结构-5.6.二叉树的先,中,后序遍历

一.遍历&#xff1a; 二.二叉树的遍历&#xff1a;利用了递归操作 1.简介&#xff1a; 二叉树的先序遍历&#xff0c;中序遍历&#xff0c;后序遍历都是以根结点遍历顺序为准的&#xff0c;如先序遍历就先遍历根结点 2.实例&#xff1a; 例一&#xff1a; 例二&#xff1a; …

HarmonyOS NEXT应用开发实战(二、封装比UniApp和小程序更简单好用的网络库)

网络访问接口&#xff0c;使用频次最高。之前习惯了uniapp下的网络接口风格&#xff0c;使用起来贼简单方便。转战到鸿蒙上后&#xff0c;原始网络接口写着真累啊&#xff01;目标让鸿蒙上网络接口使用&#xff0c;简单程度比肩uniapp&#xff0c;比Axios更轻量级。源码量也不多…

JUC并发编程进阶1:线程基础知识复习

1 从start一个线程说起 在 Java 中&#xff0c;Thread 类是用于创建和管理线程的核心类。通过调用 Thread 类的 start() 方法&#xff0c;可以启动一个新的线程&#xff0c;并执行线程的 run() 方法。下面我们来详细分析一下 start() 方法的实现。 1.1 代码示例 首先&#x…

前端开发笔记--html 黑马程序员1

文章目录 前端开发工具--VsCode前端开发基础语法VsCode优秀插件Chinese --中文插件Auto Rename Tag --自动重命名插件open in browserOpen in Default BrowserOpen in Other Browser Live Server -- 实时预览 前端开发工具–VsCode 轻量级与快速启动 快速加载&#xff1a;VSCo…

大数据毕业设计选题推荐-音乐数据分析系统-音乐推荐系统-Python数据可视化-Hive-Hadoop-Spark

✨作者主页&#xff1a;IT研究室✨ 个人简介&#xff1a;曾从事计算机专业培训教学&#xff0c;擅长Java、Python、微信小程序、Golang、安卓Android等项目实战。接项目定制开发、代码讲解、答辩教学、文档编写、降重等。 ☑文末获取源码☑ 精彩专栏推荐⬇⬇⬇ Java项目 Python…

ansible自动化运维,一些基础命令、更方便掌握ansible。

1.先准备三台机子&#xff0c;一台ansible服务端、和两台客户端&#xff0c;配置客户端主机名、cinder和compute。 192.168.10.202ansible客户端192.168.10.56cinder客户端192.168.10.55compute客户端 2.下载ansible&#xff08;客户端&#xff09;,准备repo文件。 #编写文件…

“网络安全等级保护测评入门:基础概念与重要性“

网络安全等级保护测评&#xff08;简称“等保测评”&#xff09;是依据国家网络安全等级保护制度&#xff0c;对信息系统安全等级进行评估和评定的过程。它是提高信息系统安全性、保障信息安全的重要手段。以下是关于等保测评的基础概念与重要性的详细解读&#xff1a; 一、等…

在docker的容器内如何查看Ubuntu系统版本

文章目录 写在前面一、问题描述二、解决方法参考链接 写在前面 自己的测试环境&#xff1a; docker 一、问题描述 由于 lsb_release -a 只能查看自己电脑&#xff08;宿主机&#xff09;的系统版本&#xff0c;如果在docker的容器内又应该如何查看Ubuntu系统版本呢&#xff…

IDEA运行Java程序时出错。提示:命令行过长。通过 JAR 清单或通过类路径文件缩短命令行,然后重新运行。

文章目录 一、遇到问题二、分析问题三、解决办法 一、遇到问题 运行 OpenCVUtils.test 时出错。命令行过长。 通过 JAR 清单或通过类路径文件缩短命令行&#xff0c;然后重新运行。二、分析问题 IDEA提示很明显了。 三、解决办法 运行——>编辑配置 运行/调试配置——&g…

欧科云链研究院深掘链上数据:洞察未来Web3的隐秘价值

目前链上数据正处于迈向下一个爆发的重要时刻。 随着Web3行业发展&#xff0c;公链数量呈现爆发式的增长&#xff0c;链上积聚的财富效应&#xff0c;特别是由行业热点话题引领的链上交互行为爆发式增长带来了巨量的链上数据&#xff0c;这些数据构筑了一个行为透明但与物理世…

模型 知识诅咒

系列文章 分享 模型&#xff0c;了解更多&#x1f449; 模型_思维模型目录。知者难悟无知惑。 1 知识诅咒案例 1.1 会议室的误解 李经理是一家科技公司的产品经理&#xff0c;他负责领导一个新产品的开发项目。项目团队由不同背景和经验的成员组成&#xff0c;包括新入职的员…

kibana 删除es指定数据,不是删除索引

1 查询条件查询出满足条件的数据 GET /order_header_idx_202410/_search {"from":0,"size":10,"query":{"bool":{"filter":[{"term":{"oh_tenantId":{"value":"0211000001",&…

GitHub简介与安装使用入门教程

1、Git与GitHub的简介 Git是目前世界上最先进的分布式控制系统&#xff0c;它允许开发者跟踪和管理源代码的改动历史记录等&#xff0c;可以将你的代码恢复到某一个版本&#xff0c;支持多人协作开发。它的核心功能包括版本控制、分支管理、合并和冲突解决等&#xff0c;其操作…