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

news2025/1/15 13:00:46

省流版:

本文介绍机器学习中的回归算法:逻辑回归、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.coloradmin.cn/o/1470829.html

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

相关文章

基于Prony算法的系统参数辨识matlab仿真

目录 1.程序功能描述 2.测试软件版本以及运行结果展示 3.核心程序 4.本算法原理 5.完整程序 1.程序功能描述 Prony算法是一种用于信号处理和系统辨识的经典方法,特别适用于线性时不变系统(LTI)的频率响应分析以及模拟复指数信号序列。其…

特殊文件:XML文件,Properties属性文件【详解】

目录 1.Properties属性文件 2.特殊文件:XML文件 1.Properties属性文件 是一个Map集合(键值对集合),但是我们一般不会当集合使用。 核心作用:Properties是用来代表属性文件的,通过Properties可以读写…

【MySQL】学习和总结联合查询

🌈个人主页: Aileen_0v0 🔥热门专栏: 华为鸿蒙系统学习|计算机网络|数据结构与算法 ​💫个人格言:“没有罗马,那就自己创造罗马~” #mermaid-svg-OPj5g6evbkm5ol0U {font-family:"trebuchet ms",verdana,arial,sans-serif;font-siz…

FPGA 与 数字电路的关系 - 这篇文章 将 持续 更新 :)

先说几个逻辑:(强调一下在这篇文章 输入路数 只有 1个或2个,输出只有1个,N个输入M个输出以后再说) 看下面的几个图: 图一( 忘了 这是 啥门,不是门吧 :)也就…

UE5 C++ TPS开发 学习记录(五)

这节课创建了新的游戏关卡Lobby,制作了属于自己的游戏名字"Match Type",制作了加入游戏会话的委托和函数,最后可以用IP就可以把客户端链接到服务端 .h // Copyright Epic Games, Inc. All Rights Reserved. #pragma once #include "CoreMinimal.h" #incl…

pytest如何在类的方法之间共享变量?

在pytest中,setup_class是一个特殊的方法,它用于在类级别的测试开始之前设置一些初始化的状态。这个方法会在类中的任何测试方法执行之前只运行一次。 当你在setup_class中使用self来修改类属性时,你实际上是在修改类的一个实例属性。在Pyth…

高频面试题整理(二)

文章目录 索引相关问题优化你的索引 密集索引和稀疏索引如何定位并优化慢查询sqlMyISAM与InnoDB 关于锁方面的区别是什么?MyISAMInnoDB事务隔离级别 多线程并发的相关问题Thread中的start和run方法的区别Thread和Runnable是什么关系?如何处理线程的返回值…

【Java程序设计】【C00307】基于Springboot的基Hadoop的物品租赁管理系统(有论文)

基于Springboot的基Hadoop的物品租赁管理系统(有论文) 项目简介项目获取开发环境项目技术运行截图 项目简介 这是一个基于Springboot的基于 Hadoop的物品租赁系统的设计与实现,本系统有管理员、用户二种角色权限; 前台首页&#…

Xcode与Swift开发小记

引子 鉴于React Native目前版本在iOS上开发遇到诸多问题,本以为搞RN只需理会Javascript开发,没想到冒出CocoaPod的一堆编译问题。所以横下一条心,决定直接进攻iOS本身。不管你是用React Native,还是用Flutter,iOS下的…

记录一些mac电脑重装mysql和pgsql的坑

为什么要重装,是想在mac电脑 创建data目录…同事误操作,导致电脑重启不了.然后重装系统后,.就连不上数据库了.mysql和pgsql两个都连不上.网上也查了很多资料.实在不行,.就重装了… 重装mysql. 1.官网下载 https://www.mysql.com/downloads/ 滑到最下面 选择 选择对应的芯片版本…

python-产品篇-游戏-开心消消乐

文章目录 准备代码效果 准备 安装对应环境库 代码 import pygame import random from pygame.locals import *class SoundPlay:game_bgm "sound/GameSceneBGM.ogg"world_bgm sound/WorldSceneBGM.oggeliminate (sound/eliminate1.ogg, sound/eliminate2.ogg, s…

MATLAB环境下基于洗牌复杂演化的图像分割算法

智能优化算法因其较强的搜索解能力而得到了大量的应用,在这些计算智能算法中,群体智能优化算法因其高效性、有效性以及健壮性等优点而得到了科研人员的青睐。这类算法借鉴生物群体的合作特性,主要解决大规模复杂的分布式问题,研究…

YOLO算法改进Backbone系列之:EfficientViT

EfficientViT: Memory Effificient Vision Transformer with Cascaded Group Attention 摘要:视觉transformer由于其高模型能力而取得了巨大的成功。然而,它们卓越的性能伴随着沉重的计算成本,这使得它们不适合实时应用。在这篇论文中&#x…

深入理解 JavaScript 中的绑定机制(上)

🤍 前端开发工程师、技术日更博主、已过CET6 🍨 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 🕠 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》 🍚 蓝桥云课签约作者、上架课程《Vue.js 和 E…

Orange3数据预处理(列选择组件)数据角色及类型描述

在Orange3的文件组件中,datetime、categorical、numeric以及text代表不同种类的数据类型,具体如下: datetime:代表日期和时间类型的数据。通常用于时间序列分析、生存分析和其他需要考虑时间因素的机器学习任务中。例如&#xff0…

k8s-kubeapps部署 20

部署kubeapps应用,为Helm提供web UI界面管理: 下载最新版本的kubeapps并修改其values.yaml文件 下载并拉取所需镜像: 部署应用 添加解析 修改svc暴露方式为LoadBalancer 得到分配地址 访问http://192.168.182.102 授权并获取token 1.24前的…

密码学及其应用(应用篇15)——0/1背包问题

1 问题背景 背包问题是一个经典的优化问题,在计算机科学和运筹学中有着广泛的应用。具体到你提到的这个问题,它是背包问题中的一个特例,通常被称为0/1背包问题。这里,我们有一系列的正整数 ,以及一个正整数&#xff0c…

TCP/IP协议栈:模拟器实现基本的L2和L3功能

在C中实现的TCPI/IP网络堆栈模拟器。该模拟器实现基本的第2层(MAC地址,Arp)和第3层(路由,IP)功能。 TCP/IP协议栈是一个网络通信的基础架构,包含了多层次的协议和功能。在模拟实现基本的L2和L3…

LabVIEW和Python开发微细车削控制系统

LabVIEW和Python开发微细车削控制系统 为满足现代精密加工的需求,开发了一套基于LabVIEW和Python的微细车削控制系统。该系统通过模块化设计,实现了高精度的加工控制和G代码的自动生成,有效提高了微细车削加工的自动化水平和编程效率。 项目…

【JavaEE】 spring boot的配置文件详解

spring boot的配置文件详解 文章目录 spring boot的配置文件详解常用配置spring boot的配置文件1. properties 文件2. YAML 文件3. 多环境配置4. 配置文件优先级5. 配置属性注入特殊说明 properties配置文件基本语法 例子peoperties文件的缺点 YML配置文件YML使用yml 配置不同数…