面向面试的机器学习知识点(4)——分类模型

省流版:

本文介绍机器学习中的回归算法:逻辑回归、KNN、SVM、随机森林和XGBoost。作为机器学习的有监督学习方法,分类模型是最重要也是最常见的一类算法,在数据分析等岗位的笔试面试中都是常客,非常值得深入研究!

内容很多,创作不易,如果对你有帮助的话还请三连支持~


有监督学习——分类算法:目的是根据输入的特征将数据分为不同的类别,从而对数据进行分类

逻辑回归

原理:逻辑回归模型基于线性回归模型,通过对线性组合进行非线性映射,将结果映射到0和1之间的概率值,表示某个样本属于某个类别的概率。

公式

sigmoid激活函数,其中h(x)是样本x属于正类的概率,θ是模型参数

  1. sigmoid激活函数的输出值始终在0和1之间,而且当输入为0时,输出为0.5。在逻辑回归模型中,sigmoid函数将线性方程的输出转换为属于0到1之间的概率值,为我们提供了一个 评估样本是否属于某个分类的工具。
  2. siemoi激活函数的优点是它可以对输入信号进行非线性映射和压缩,使输入信号更具表达力。但是,缺点是它产生了“梯度消失”问题,因为在极端值(远离0)处斜率接近0,这意味着梯度也会很小,从而导致训练变慢或停止。

损失函数:

    1. 定义:交叉熵损失函数。
    2. 推导方法:根据函数图像理解
  • 给定y=1时,损失函数为-log(p),估计出来的概率p越小,损失函数越大,当概率p取0(即预估的分类结果y=0)时,loss值是趋近于正无穷的,表明我们分错了(实际分类结果是1);
  • 给定y=0时,损失函数为-log(1-p),估计出来的概率p越大,损失函数越大,当概率p取1(即预估的分类结果y=1)时,loss值是趋近于正无穷的,表明我们分错了(实际分类结果是1)

Python代码:

 Python
# 导入所需的库
import numpy as np
from sklearn.linear_model import LogisticRegression
from sklearn.datasets import make_classification
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score

# 创建示例数据
X, y = make_classification(n_samples=1000, n_features=10, n_classes=2, random_state=42)

# 将数据集划分为训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

# 创建逻辑回归模型对象
model = LogisticRegression()

# 使用训练数据拟合模型
model.fit(X_train, y_train)

# 使用模型进行预测
y_pred = model.predict(X_test)

# 计算模型准确率
accuracy = accuracy_score(y_test, y_pred)
print('模型准确率:', accuracy)

K近邻(KNN)

原理

  1. 如果一个样本在特征空间中的K个最近邻中的大多数属于某个类别,则该样本也属于这个类别。
  2. 分类问题:KNN通过计算样本与训练集中所有样本的距离,并选择距离最近的K个样本来确定样本的类别。
  3. 回归问题:KNN通过计算最近邻的平均值来预测目标变量的值。

计算方法

  1. 选择距离度量方法:通常使用欧氏距离(两点直线距离)或曼哈顿距离(沿轴的距离)等作为距离度量方法。
  2. 计算距离:对于每个待预测的样本,计算它与训练集中所有样本的距离。
  3. 选择最近的K个样本:根据计算得到的距离,选择距离最近的K个样本。
  4. 投票或平均:对于分类问题,采用多数投票的方式确定样本的类别;对于回归问题,采用这K个样本的平均值作为预测值。

Python

# 导入所需的库
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.neighbors import KNeighborsClassifier
from sklearn.metrics import accuracy_score

# 加载鸢尾花数据集
iris = load_iris()
X = iris.data
y = iris.target

# 将数据集划分为训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

# 创建KNN分类器对象,设置K=3
knn_classifier = KNeighborsClassifier(n_neighbors=3)

# 使用训练数据拟合模型
knn_classifier.fit(X_train, y_train)

# 使用模型进行预测
y_pred = knn_classifier.predict(X_test)

# 计算模型准确率
accuracy = accuracy_score(y_test, y_pred)
print('模型准确率:', accuracy)

(文中部分内容来自GPT4.0生成,对我个人而言这是最重要的生产力工具之一,详细的使用教程可以参见下面这篇博客:GPT4.0使用教程)

支持向量机(SVM)

原理

在分类问题中,支持向量机的目标是找到一个超平面,将不同类别的样本分隔开,同时使得间隔(margin)最大化。支持向量机的核心思想是利用支持向量(即距离超平面最近的样本点)来构建分类决策边界。

计算方法

  1. 选择核函数:支持向量机可以使用不同的核函数来处理非线性分类问题,常用的核函数包括线性核、多项式核、高斯核等。
  2. 构建优化问题:支持向量机的优化问题通常是一个凸优化问题,其目标是最大化间隔,并且满足约束条件,即使得样本点被正确地分类。
  3. 求解优化问题:可以使用优化算法(如SMO算法、梯度下降等)来求解支持向量机的优化问题,得到最优的分类超平面和支持向量。
  4. 预测:利用训练得到的模型,对新的样本进行分类预测,根据样本到超平面的距离来判断其所属类别。

核函数的作用

  1. 将数据映射到高维空间: 核函数将原始输入空间中的数据映射到一个更高维的特征空间中,使得原本线性不可分的问题变得线性可分。这种映射通常是非线性的,因此可以将低维空间中复杂的数据结构映射到高维空间中的简单结构。
  2. 构建非线性决策边界: 在高维特征空间中,线性分类器(如超平面)能够更容易地将数据分开,从而构建一个非线性决策边界。这使得 SVM 能够处理非线性分类问题,并且具有很强的泛化能力。
  3. 避免计算高维空间的复杂性: 尽管核函数将数据映射到了高维空间,但 SVM 的优化问题仍然是在原始输入空间中求解的。核函数的巧妙之处在于它们通过内积计算的方式,避免了显式地计算高维特征空间中的数据点,从而减少了计算的复杂性。

SVM怎么解决多分类问题?
支持向量机(Support Vector Machine,SVM)最初是用于解决二分类问题的,但可以通过一些技巧扩展到多分类问题。下面是一些常用的方法:

  1. 一对一(One-vs-One)方法: 这种方法将每个类别的样本分为一组,然后构建一对一的二分类器。也就是说,对于K个类别,将会构建K*(K-1)/2个分类器。当需要进行分类时,每个分类器投票给一个类别,最终选择得票最多的类别作为样本的分类结果。
  2. 一对其余(One-vs-Rest)方法: 这种方法将每个类别的样本作为一个类别,而其他所有类别的样本作为另一个类别。然后构建K个二分类器,每个分类器都是将一个类别的样本与其他所有类别的样本进行区分。在预测时,选择具有最高置信度的类别作为样本的分类结果。
  3. 多类别SVM: 一些SVM库和算法可以直接处理多分类问题。例如,LibSVM库中的多类别分类器就支持直接处理多分类问题。这些算法在内部实现了类似于一对一或者一对其余的策略,但是更高效并且对参数调整更加友好。
 Python

 # 导入所需的库
import numpy as np
from sklearn.linear_model import LogisticRegression
from sklearn.datasets import make_classification
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score

# 创建示例数据
X, y = make_classification(n_samples=1000, n_features=10, n_classes=2, random_state=42)

# 将数据集划分为训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

# 创建逻辑回归模型对象
model = LogisticRegression()

# 使用训练数据拟合模型
model.fit(X_train, y_train)

# 使用模型进行预测
y_pred = model.predict(X_test)

# 计算模型准确率
accuracy = accuracy_score(y_test, y_pred)
print('模型准确率:', accuracy)

随机森林

原理

随机森林由多个决策树组成,每个决策树都是基于随机抽取的样本和随机选择的特征进行训练的。最终的分类或回归结果是基于所有决策树的投票或平均得到的。

什么是决策树

  1. 决策树算法是一种基于树形结构的分类和预测模型。
  2. 决策树的每个节点代表一种决策,每个分支代表一个可能的结果。
  3. 通过计算不同的属性值和分类标签之间的信息增益或者基尼指数,决策树算法能够自动检测出最相关的属性并以此来判断分类标签。

计算方法

  1. 随机抽样训练样本:从原始训练数据集中随机抽取一定比例的样本,用于训练每棵决策树。
  2. 随机选择特征:对于每棵决策树的每个节点,随机选择一定数量的特征进行分裂。
    1. 构建决策树:利用随机抽样的训练样本和随机选择的特征,构建多棵决策树。每棵树都会根据特征的信息增益或基尼系数等准则进行分裂,直到达到停止条件为止。
    2. 集成预测:对于分类任务,采用多数投票的方式;对于回归任务,采用平均值的方式,将所有决策树的预测结果进行集成,得到最终的预测结果。

两处随机

  1. 在构建森林的时候每一棵树用一个随机抽样的数据集
  2. 在构建树的过程中每次分裂都使用特征的一个随机子集。

随机森林不需要标准化

随机森林算法不受输入特征的尺度影响,因为它是基于决策树的集成学习算法。决策树的分裂点并不依赖于特征的尺度,而是根据数据的不纯度来选择最佳的分裂点。因此,对特征进行标准化或归一化不会对随机森林的性能产生明显影响。

XGBoost和随机森林区别

XGBoost随机森林
基础学习器梯度提升决策树,每棵树的构建是通过迭代拟合残差多棵决策树,每棵树独立建立,通过随机选择特征和样本来构建不同的树,然后将它们的结果进行集成
集成方式加法模型,通过组合多个弱学习器得到一个强大的模型。每个弱学习器都是在前面学习器的基础上,通过梯度下降的方式来最小化损失函数。随机森林采用投票或平均的方式对多棵决策树的结果进行集成,对于分类问题采用多数投票,对于回归问题采用平均值。
参数学习率、树的深度、子采样比例等决策树的数量、每棵树的最大深度等
性能更适用大规模数据、高维稀疏数据更适用于相对低维、特征较少
 Python
# 导入所需的库
from sklearn import datasets
from sklearn.model_selection import train_test_split
from sklearn.ensemble import RandomForestClassifier
from sklearn.metrics import accuracy_score

# 加载示例数据集
iris = datasets.load_iris()
X = iris.data
y = iris.target

# 将数据集划分为训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

# 创建随机森林分类器对象
rf_classifier = RandomForestClassifier(n_estimators=100, random_state=42)

# 使用训练数据拟合模型
rf_classifier.fit(X_train, y_train)

# 使用模型进行预测
y_pred = rf_classifier.predict(X_test)

# 计算模型准确率
accuracy = accuracy_score(y_test, y_pred)
print('模型准确率:', accuracy)
 

XGBoost

原理

通过迭代地训练决策树模型,并利用梯度下降的方法来最小化损失函数。在每一轮迭代中,XGBoost 首先计算出当前模型的梯度和二阶导数,然后构建一个新的决策树模型来拟合这些梯度和二阶导数,以减小损失函数。最终,多个决策树模型的预测结果进行加权平均得到最终的预测结果。

计算方法

    1. 初始化预测值:首先,将所有样本的预测值初始化为一个常数,通常选择训练数据中的目标变量的平均值。
    2. 迭代训练决策树:通过多轮迭代,每轮迭代都训练一个新的决策树模型,以最小化损失函数。
    3. 计算损失函数的一阶和二阶导数:对于给定的目标变量和当前模型的预测值,计算损失函数的一阶导数(梯度)和二阶导数(Hessian矩阵)。
    4. 构建决策树模型:基于损失函数的一阶和二阶导数,构建一个新的决策树模型,使得在每个叶子节点上的值最小化损失函数。
    5. 更新预测值:利用新构建的决策树模型更新所有样本的预测值。
    6. 重复迭代:重复以上步骤,直到达到预定的迭代次数,或者达到损失函数的停止条件。

XGBoost和随机森林区别

XGBoost随机森林
基础学习器梯度提升决策树,每棵树的构建是通过迭代拟合残差多棵决策树,每棵树独立建立,通过随机选择特征和样本来构建不同的树,然后将它们的结果进行集成
集成方式加法模型,通过组合多个弱学习器得到一个强大的模型。每个弱学习器都是在前面学习器的基础上,通过梯度下降的方式来最小化损失函数。随机森林采用投票或平均的方式对多棵决策树的结果进行集成,对于分类问题采用多数投票,对于回归问题采用平均值。
参数学习率、树的深度、子采样比例等决策树的数量、每棵树的最大深度等
性能更适用大规模数据、高维稀疏数据更适用于相对低维、特征较少

boosting算法属于串行,为什么xgboost可以并行训练

    1. 特征并行:将特征按照列进行切分,每个处理器负责处理一部分特征,可以加速特征的处理过程。
    2. 数据并行:将数据按照行进行切分,每个处理器负责处理一部分数据,可以加速模型的训练过程。
    3. 基学习器并行:Xgboost算法支持多线程训练,可以同时训练多个基学习器,加快训练速度。
    4. 分布式训练:Xgboost算法支持分布式训练,可以将数据分布在多台机器上进行训练,进一步加速训练速度。

xgboost怎么解决样本不均衡问题

    1. 采样方法:欠采样或过采样
    2. 调整样本权重:
 调整样本权重
 import xgboost as xgb
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score

# 假设 X_train, y_train 是训练集的特征和标签
# X_test, y_test 是测试集的特征和标签

# 将数据转换为 DMatrix 格式
dtrain = xgb.DMatrix(X_train, label=y_train)
dtest = xgb.DMatrix(X_test, label=y_test)

# 设置样本权重
# 假设客户流失的样本权重为 5,客户不流失的样本权重为 1
weight = [5 if label == 1 else 1 for label in y_train]

# 定义参数
params = {
    'objective': 'binary:logistic',
    'eval_metric': 'error',
    # 设置正例的权重
    'scale_pos_weight': sum(y_train == 0) / sum(y_train == 1),
}

# 训练模型
bst = xgb.train(params, dtrain, num_boost_round=100, evals=[(dtest, 'test')], early_stopping_rounds=10, verbose_eval=False)

# 在测试集上进行预测
y_pred = bst.predict(dtest)
y_pred_binary = [1 if p > 0.5 else 0 for p in y_pred]

# 计算准确率
accuracy = accuracy_score(y_test, y_pred_binary)
print("Accuracy: %.2f%%" % (accuracy * 100.0))
 

Python:

 # 导入所需的库
import xgboost as xgb
from sklearn import datasets
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score

# 加载示例数据集
iris = datasets.load_iris()
X = iris.data
y = iris.target

# 将数据集划分为训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

# 构建 XGBoost 分类器对象
xgb_classifier = xgb.XGBClassifier()

# 使用训练数据拟合模型
xgb_classifier.fit(X_train, y_train)

# 使用模型进行预测
y_pred = xgb_classifier.predict(X_test)

# 计算模型准确率
accuracy = accuracy_score(y_test, y_pred)
print('模型准确率:', accuracy)


总结

本期内容主要介绍了回归算法。作为有监督算法的一种,回归算法是最常见、最重要也是在业务场景中使用的最多的一类机器学习算法,在保研考研复试和数据分析等岗位面试中经常出现,非常值得深入研究。

文中部分内容来自GPT4.0生成,对我个人而言这是最重要的生产力工具之一,详细的使用教程可以参见下面这篇博客:

GPT4.0使用教程

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

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

相关文章

初识Lombok

前言 最近读一些公司的业务代码,发现近几年的java项目工程中都使用了lombok,lombok是一个可以自动生成get,set、toString等模板类方法的工具框架,程序再引入lombok后,添加一个注解便可以不写get\set\toString等方法。 Lombok示例…

UDP 与 TCP 的区别是什么?

目录 区别 一、面向无连接 二、不可靠性 三、高效 四、传输方式 五、适用场景 1.直播 2.英雄联盟 六、总结 区别 首先 UDP 协议是面向无连接的,也就是说不需要在正式传递数据之前先连接起双方。然后 UDP 协议只是数据报文的搬运工,不保证有序且…

Kotlin多线程

目录 线程的使用 线程的创建 例一:创建线程并输出Hello World Thread对象的用法 start() join() interrupt() 线程安全 原子性 可见性 有序性 线程锁 ReentrantLock ReadWriteLock 线程的使用 Java虚拟机中的多线程可以1:1映射至CPU中,即…

【Java程序设计】【C00313】基于Springboot的物业管理系统(有论文)

基于Springboot的物业管理系统(有论文) 项目简介项目获取开发环境项目技术运行截图 项目简介 这是一个基于Springboot的物业管理系统,本系统有管理员、物业、业主以及维修员四种角色权限; 管理员进入主页面,主要功能包…

MCU独立按键单控LED实现

##江科大视频学习,并且对具体的一些小细节进行更详细的分析。 什么是独立按键? 轻触按键:相当于是一种电子开关,按下开头接通,松开时开头断开,实现原理是通过轻触按键内部的金属弹片受力弹动来实现接通和断开。 注意…

Keepalived介绍、架构和安装

Keepalived介绍、架构和安装 文章目录 Keepalived介绍、架构和安装1.Keepalived(高可用性服务)1.1 Keepalived介绍1.2 Keepalived 架构1.3 Keepalived 相关文件 2.Keepalived安装2.1 主机初始化2.1.1 设置网卡名和ip地址2.1.2 配置镜像源2.1.3 关闭防火墙…

在autodl搭建stable-diffusion-webui+sadTalker

本文介绍在autodl.com搭建gpu服务器,实现stable-diffusion-webuisadTalker功能,图片音频 可生成视频。 autodl租GPU 自己本地部署SD环境会遇到各种问题,网络问题(比如huggingface是无法访问),所以最好的方…

元学习(meta-learning)的通俗解释

目录 1、什么是元学习 2、元学习还可以做什么 3、元学习是如何训练的 1、什么是元学习 meta-learning 的一个很经典的英文解释是 learn to learn,即学会学习。元学习是一个很宽泛的概念,可以有很多实现的方式,下面以目标检测的例子来解释…

macOS系统下载IDEA的操作流程

第一步 进入官网 Download IntelliJ IDEA – The Leading Java and Kotlin IDE 第二步 根据mac的芯片选择版本下载 芯片的查看位置是【设置】-【通用】-【关于本机】-第二个,我的是Apple芯片,选Apple Silicon -- 第三步 右上角下载处打开安装包&…

485隔离器4口集线器一分二四路导轨安装数字量输入模块RS485中继

品牌:泰工华控 型号:TD-7511/TD-7512/TD-7514 产地:中国大陆 省份:安徽省 地址:宿州市 颜色分类:485一进一出隔离,485缓存器一进二出(两主一从,485分路器一进二出(一主两从&…

[C++][C++11][四] -- [lambda表达式]

目录 1.为什么要有lambda表达式?2.lambda表达式3.lambda表达式语法4.函数对象与lambda表达式 1.为什么要有lambda表达式? 在C98中,如果想要对一个数据集合中的元素进行排序,可以使用std::sort方法 如果待排序元素为自定义类型&am…

<网络安全>《52 网络攻防专业课<第十五课 - 跳板>

1 跳板技术 当攻击者入侵被攻击者时,被攻击者可以根据IP地址追踪攻击者来自哪里。 攻击者为了隐藏自己的真正IP,通常会采用跳板,如右图, 攻击者通过2个跳板攻击被攻击者。即使被攻击者进行反向追踪,也只能追踪到攻击…

【Activiti7系列】Activi7简介和基于Spring Boot整合Activiti7(流程设计器)

本文将介绍Activiti7基础概念及基于Spring Boot整合Activiti7(流程设计器)的具体步骤。 作者:后端小肥肠 1. 前言 在企业级应用中,业务流程的管理和执行是至关重要的一环。Activiti7是一个强大的开源工作流引擎,它提供了灵活的流程定义、任务…

机器学习.线性回归

斯塔1和2是权重项,斯塔0是偏置项,在训练过程中为了使得训练结果更加精确而做的微调,不是一个大范围的因素,核心影响因素是权重项 为了完成矩阵的运算,在斯塔0后面乘x0,使得满足矩阵的转换,所以在…

HTTP---------状态码

当服务端返回 HTTP 响应时,会带有一个状态码,用于表示特定的请求结果。比如 HTTP/1.1 200 OK,里面的 HTTP/1.1 表示协议版本,200 则是状态码,OK 则是对状态码的描述。 由协议版本、状态码、描述信息组成的行被称为起始…

文献阅读:Transformers are Multi-State RNNs

文献阅读:Transformers are Multi-State RNNs 1. 内容简介2. 方法介绍 1. 基础回顾 1. RNN2. Transformer 2. Transformer解构 1. MSRNN2. Transformer 3. TOVA 1. 现有转换策略2. TOVA 3. 实验考察 & 结论 1. 实验设计2. 实验结果 1. LM2. 长文本理解3. 文本生…

win7系统安装.net 4.7.2失败的解决办法

1、提示如下错误时导入证书MicrosoftRootCertificateAuthority2011.cer,具体可以从网上搜: 2、导入证书后再次重试,提示如下错误: 这时可能是缺少系统补丁,安装补丁:Windows6.1-KB2813430-x64.msu。安装完要…

Seata分布式事务实战XATCC模式

目录 XA模式 XA 模式的使用 Spring Cloud Alibaba整合Seata XA TCC模式 TCC模式接口改造 TCC如何控制异常 Spring Cloud Alibaba整合Seata TCC XA模式 整体机制 在 Seata 定义的分布式事务框架内,利用事务资源(数据库、消息服务等)对…

力扣--哈希表/滑动窗口/双指针3.无重复字符的最长子串

思路分析: 使用双指针 i 和 j 表示子串的起始位置和结束位置。遍历字符串 s,对于每个字符: 如果字符不在 hash 中,将其加入 hash,同时更新最长子串的长度 result。如果字符已经在 hash 中,说明有重复字符出…

力扣LCR 140. 训练计划 II(顺序遍历,快慢指针)

Problem: LCR 140. 训练计划 II 文章目录 题目描述思路复杂度Code 题目描述 思路 思路1:顺序遍历 欲返回倒数第cnt个节点则需要顺序遍历到len-cnt(其中len为链表的长度) 思路2:快慢指针 让一个快指针fast指向cnt 1个节点&#x…