面向面试的机器学习知识点(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使用教程

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

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

相关文章

自定义神经网络四之编写自定义神经网络

文章目录 前言神经网络组件代码整体的项目结构Tensor张量Layers层NeuralNet神经网络Loss损失函数Optim优化器data数据处理train训练 神经网络解决实际问题实际问题训练和推理代码 总结 前言 自定义神经网络一之Tensor和神经网络 自定义神经网络二之模型训练推理 自定义神经网络…

基于容器和集群技术的数据自动化采集设计和实现

目标:部署mysql服务容器并使用docker构建包含python爬虫脚本的容器采集数据到mysql数据库。 环境:Centos7、已配置Kubernetes集群及docker。 环境配置请参考以下文章: CentOS7搭建Kubernetes集群 Kubernetes集群信息如下(虚拟机主机名和IP…

Linux安装Mysql设置自启动失败,bugFailed to execute operation: No such file or directory

bug: [rootlocalhost mysql-5.7]# systemctl enable mysql.service Failed to execute operation: No such file or directory 出现bug原因: ①CentOS7的服务systemctl脚本存放在:/usr/lib/systemd/,有系统(system)和…

微服务基础环境搭建

一.创建父工程 用于聚合其他微服务模块 1 新建 Maven 项目 JDK8Maven 项目Web 2 项目设置 编码的选择 UTF8JDK 版本的选择 3 删除 src 目录 4 配置父级 pom.xml SpringBoot:模块探究之spring-boot-dependencies-CSDN博客 子模块能够依赖当前父级 pom.xml 配置 【My…

福特锐界2021plus 汽车保养手册

福特锐界2021plus汽车保养手册两页,零部件保养要求,电子版放这里方便查询:

QT文件IO

七、文件IO QFileDialog文件对话框 与QMessageBox一样,QFileDialog也继承了QDialog类,直接使用静态成员函数弹窗,弹窗的结果(选择的文件路径)通过函数返回值返回。 // 获取一个打开或保存的文件路径 // 参数1&#xff…

java面试(网络)

TCP和UDP有什么区别?TCP三次握手不是两次? TCP:面向连接,可靠的,传输层通信协议。点对点,占用资源多,效率低。 UDP:无连接,不可靠,传输层通信协议。广播&…

考研408深度分析+全年规划

408确实很难,他的难分两方面 一方面是408本身的复习难度,我们都知道,408的考察科目有四科,分别是数据结构,计算机组成原理,操作系统和计算机网络。大家回想一下自己在大学本科时候学习这些专业课的难度&am…

HTTPS对HTTP的加密过程

1、HTTPS是在HTTP的基础上,引入了一个加密层(SSL),对数据进行保护,HTTP 是明文传输的(不安全,很可能会被运营商通过referer劫持,或者黑客通过修改链接来窃数据) 2、加密…

JavaSE——面向对象基础(4/4)-成员变量和局部变量的区别、面向对象综合案例(电影信息系统)

目录 补充:成员变量和局部变量的区别 面向对象综合案例 设计一个电影类 IDEA快捷操作 设计一个电影操作类 准备电影数据 业务处理 运行结果 补充:成员变量和局部变量的区别 区别成员变量(对象的属性)局部变量类中位置不同…

【数据结构】双向链表

一、main函数 #include <stdio.h> #include "./3.doublelinklist.h" int main(int argc, const char *argv[]) {doublelinklist* head creatr_doublelinklist();insertHead_doublelinklist(head,999);insertHead_doublelinklist(head,888);insertHead_double…

家装服务管理:Java技术的创新应用

✍✍计算机毕业编程指导师 ⭐⭐个人介绍&#xff1a;自己非常喜欢研究技术问题&#xff01;专业做Java、Python、微信小程序、安卓、大数据、爬虫、Golang、大屏等实战项目。 ⛽⛽实战项目&#xff1a;有源码或者技术上的问题欢迎在评论区一起讨论交流&#xff01; ⚡⚡ Java、…

29-资源清单的管理工具-helm

一、helm的介绍 1&#xff0c;helm的价值概述 如下图所示&#xff0c;在一个企业中&#xff0c;可能存在多个不同的应用业务&#xff0c;每个业务可能包含多至十几、甚至几十个资源清单&#xff0c;那么对于“运维”和“研发”人员来讲&#xff0c;这么多的资源清单&#xff0…

分布式知识整理

分布式锁 以商场系统超卖现象举例 超卖现象一 现象&#xff1a; 商品卖出数量超出了库存数量。 产生原因&#xff1a; 扣减库存的动作在程序中进行&#xff0c;在程序中计算剩余库存&#xff0c;在并发场景下&#xff0c;导致库存计算错误。 代码复现 es.shutdown(); cycl…

Nest.js权限管理系统开发(五)返回格式化

返回格式化拦截器 在上一篇《Nest.js权限管理系统开发&#xff08;四&#xff09;Swagger API接入》中&#xff0c;我们在base.controller.ts中创建了多个接口&#xff0c;每个接口都有不同的返回类型。现实中我们往往需要统一返回数据的格式&#xff0c;例如&#xff1a; {&…

conda 导出/导出配置好的虚拟环境

一. 导出环境配置&#xff08;yml文件&#xff09; 1. 在主目录下激活虚拟环境&#xff08;UE4是我的虚拟环境名称&#xff0c;请根据你自己的名称进行修改&#xff09; conda activate UE4 2. 运行此代码 conda env export > environment.yml 二. 导入环境配置&#xf…

python统计分析——多解释变量的方差分析

参考资料&#xff1a;用python动手学统计学 1、导入库 # 导入库 # 用于数值计算的库 import numpy as np import pandas as pd import scipy as sp from scipy import stats # 用于绘图的库 from matplotlib import pyplot as plt import seaborn as sns sns.set() # 用于估计…

Linux基础命令—进程管理

基础知识 linux进程管理 什么是进程 开发写代码->代码运行起来->进程 运行起来的程序叫做进程程序与进程区别 1.程序是一个静态的概念,主要是指令集和数据的结合,可以长期存放在操作系统中 2.进程是一个动态的概念,主要是程序的运行状态,进程存在生命周期,生命周期结…

Seata分布式事务实战XATCC模式

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

【Python从入门到进阶】49、当当网Scrapy项目实战(二)

接上篇《48、当当网Scrapy项目实战&#xff08;一&#xff09;》 上一篇我们正式开启了一个Scrapy爬虫项目的实战&#xff0c;对当当网进行剖析和抓取。本篇我们继续编写该当当网的项目&#xff0c;讲解刚刚编写的Spider与item之间的关系&#xff0c;以及如何使用item&#xff…