【2024_CUMCM】机器学习导论、不平衡分类模型(重采样)、交叉验证(附代码)

news2025/3/3 18:34:16

目录

基本概念

机器学习概念与过程

机器学习的分类

学习任务

分类与回归区分

学习方式

不平衡分类模型

什么是不平衡分类

下采样的优点和缺点

过采样的优点和缺点

交叉验证

what

过拟合

常见方法

K折交叉验证(K-Fold Cross Validation)

如何确定K值?

简单代码(用于理解过程)

留一交叉验证(Leave-One-Out Cross Validation, LOO-CV)

分层K折交叉验证(Stratified K-Fold Cross Validation)

时间序列交叉验证(Time Series Split)

 代码


基本概念

机器学习概念与过程

直观上理解,机器学习(Machine Learning,ML)是研究计算机模拟人类的学习活动,获取知识和技能的理论和方法,改善系统性能的学科。

因为计算机系统中“经验‘通常以数据的形式存在,所以机器要利用经验,就必须对数据进行分析。因此其过程可以简述如下:

建立模型:设计计算机可以自动“学习”的算法
训练:用数据训练算法模型(算法从数据中分析规律)
预测:利用训练后的算法完成任务(根据学习的规律为未知数据进行分类和预测)

机器学习的分类

学习任务

按学习任务分类,主要包括分类、回归、聚类、降维等,这里只对分类与回归作区分,其他的通过字面理解就行

分类与回归区分

连续变量的预测-->回归问题

  • 预测房价、股票、明天气温

离散变量的预测-->分类问题

  • 上不上课(上课或不上课);是否佩戴眼睛(散光、不散光)--二分类问题
  • 图像识别(识别图像中的动物种类)--多分类问题
  • 音乐推荐(一首歌曲可能同时属于多个流派)--多标签分类问题

学习方式

按学习方式分类,包括有监督学习、无监督学习、半监督学习、强化学习

人工智能导论(6)——机器学习(Machine Learning)_机器学习 人工智能导论-CSDN博客


不平衡分类模型

什么是不平衡分类

这种举例子就懂了,例如根据体检数据判断是否患病,那根据常识,不患病的人肯定说远多于患病人数;例如检测欺诈性信用卡交易。如下图所示,欺诈性交易约为400笔,而非欺诈性交易为约90000笔。

 如果对于这种不平衡模型之间进行训练,你会发现调到最后,预测出不患病的准确率接近百分百,预测患病的准确率为0,这显然是不行的

通过重采样进行解决

用于处理高度不平衡数据集的一种广泛采用的类不平衡技术称为重采样。它包括从多数类中删除样本(欠采样)和/或从少数类中添加更多样本(过采样)。

下采样的优点和缺点

优点:

  • 当训练数据集很大时,它可以通过减少训练数据样本的数量来帮助改善运行时间和存储问题。

缺点:

  • 可能会丢弃可能对构建规则分类器很重要的潜在有用信息。
  • 通过随机欠采样选择的样本可以是偏置样本。而且这并不能准确地代表整体情况。从而导致实际测试数据集的结果不准确。

过采样的优点和缺点

优点:

  • 与欠采样(under-sampling)不同,过采样不会导致信息丢失。
  • 性能优于下采样。

缺点:

  • 由于它复制了少数类事件,因此增加了过拟合的可能性

方法有多种,参考机器学习中解决不平衡分类的10种技术_类平衡技术-CSDN博客,不一一列举,根据具体情况进行使用

交叉验证

what

在建立模型时,分为两个数据集——训练集和测试集,训练集是用来训练模型,测试集就是字面理解,用于测试,不参与模型训练,只用于看模型训练效果

常常会出现,在训练集的预测效果很好,而到测试集就不太理想

训练的模型需要找出数据之间‘真正’的关系,避免‘过拟合’的情况发生。

过拟合

过拟合是指训练误差和测试误差之间的差距太大。换句换说,就是模型复杂度高于实际问题,模型在训练集上表现很好,但在测试集上却表现很差模型对训练集"死记硬背"(记住了不适用于测试集的训练集性质或特点),没有理解数据背后的规律,泛化能力差。 

交叉验证:就是在训练集中选一部分样本用于测试模型,保留一部分的训练集数据作为验证集/评估集,对训练集生成的参数进行测试,相对客观的判断这些参数对训练集之外的数据的符合程度。

常见方法

K折交叉验证(K-Fold Cross Validation)

将数据集分为K个大小相等的子集,轮流选择K-1个子集作为训练集,余下的一个子集作为验证集,进行K次训练和验证,最后计算平均性能指标. 

如何确定K值?
  • 一般情况下3、5是默认选项,常建议用K=10。
  • k值越低,就越有偏差;K值越高偏差就越小,但是会受到很大的变化。
  • k值越小,就越类似于验证集方法;而k值越大,则越接近LOOCV方法。
简单代码(用于理解过程)
from sklearn.model_selection import cross_val_score
from sklearn.datasets import load_iris
from sklearn.linear_model import LogisticRegression

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

# 创建模型
model = LogisticRegression()

# 进行5折交叉验证
scores = cross_val_score(model, X, y, cv=5)

# 输出每次交叉验证的得分
print("每次交叉验证的得分:", scores)

# 计算平均得分
average_score = scores.mean()
print("平均得分:", average_score)

留一交叉验证(Leave-One-Out Cross Validation, LOO-CV)

是K折交叉验证的一个特例,每次使用一个样本作为验证集,其他样本作为训练集,适用于小数据集. 

分层K折交叉验证(Stratified K-Fold Cross Validation)

分层是重新将数据排列组合,使得每一折都能比较好地代表整体。适用于分类问题,确保每个子集中各类别的比例与原始数据集中相同. 

时间序列交叉验证(Time Series Split)

适用于时间序列数据,确保训练集只包含时间序列之前的数据,验证集包含之后的数据.

 代码

以下附上实战代码,旨在了解模型预测过程

# # 第四章 逻辑回归模型 - 股票客户流失预警模型
# # 案例实战 - 股票客户流失预警模型
# 1.读取数据
import pandas as pd
import sklearn.model_selection as ms
import sklearn.naive_bayes as nb

df = pd.read_excel('股票客户流失.xlsx')
df.head()

# 2.划分特征变量和目标变量
X = df.drop(columns='是否流失') 
y = df['是否流失']   

# 3.划分训练集和测试集
from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.25, random_state=42) # 设置random_state使得每次划分的数据一样


# 模型一 逻辑回归
# 网格调参
from sklearn.model_selection import GridSearchCV
from sklearn.linear_model import LogisticRegression
import numpy as np
from sklearn.metrics import accuracy_score, precision_score, recall_score, f1_score
# 创建逻辑回归模型
# 定义要搜索的参数网格
param_grid = {
    'C': np.logspace(-4, 4, 20),  # 正则化强度参数C
    'penalty': ['l1', 'l2'],       # 惩罚类型
    'solver': ['newton-cg', 'lbfgs', 'liblinear', 'sag', 'saga'],  # 解算器
    'max_iter': [100, 500, 1000]
}


# 创建逻辑回归模型
lr = LogisticRegression(max_iter=1000, random_state=42)

# 创建网格搜索对象
grid_search = GridSearchCV(estimator=lr, param_grid=param_grid, cv=10, n_jobs=-1, scoring='accuracy')

# 拟合网格搜索对象
grid_search.fit(X_train, y_train)

# 输出最佳参数组合
print("最佳参数组合:", grid_search.best_params_)

# 使用最佳参数重新训练模型
best_lr = grid_search.best_estimator_

# 在测试集上评估模型性能(可选)
y_pred = best_lr.predict(X)
accuracy = accuracy_score(y, y_pred)
precision = precision_score(y, y_pred, average='macro')
recall = recall_score(y, y_pred, average='macro')
f1 = f1_score(y, y_pred, average='macro')

print("准确率:", accuracy)
print("精确率:", precision)
print("召回率:", recall)
print("F1分数:", f1)


# # 模型二 朴素贝叶斯
# model = nb.GaussianNB()
# model.fit(X_train, y_train)
# y_pred = model.predict(X_test)
# score = accuracy_score(y_pred, y_test)
# print('朴素贝叶斯',score)

# # 模型三 决策树
# from sklearn.tree import DecisionTreeClassifier
# model = DecisionTreeClassifier()
# model.fit(X_train, y_train)
# y_pred = model.predict(X_test)
# score = accuracy_score(y_pred, y_test)
# print('决策树',score)

# # 模型四 随机森林
# from sklearn.ensemble import RandomForestClassifier
# model = RandomForestClassifier()
# model.fit(X_train, y_train)
# y_pred = model.predict(X_test)
# score = accuracy_score(y_pred, y_test)
# print('随机森林',score)

# # 模型五 KNN
# from sklearn.neighbors import KNeighborsClassifier
# model = KNeighborsClassifier()
# model.fit(X_train, y_train)
# y_pred = model.predict(X_test)
# score = accuracy_score(y_pred, y_test)
# print('KNN',score)

# # 模型六 SVM
# from sklearn.svm import SVC
# model = SVC()
# model.fit(X_train, y_train)
# y_pred = model.predict(X_test)
# score = accuracy_score(y_pred, y_test)
# print('SVM',score)

# # 模型七 XGBoost
# from xgboost import XGBClassifier
# model = XGBClassifier()
# model.fit(X_train, y_train)
# y_pred = model.predict(X_test)
# score = accuracy_score(y_pred, y_test)
# print('XGBoost',score)

# # 模型八 LightGBM
# from lightgbm import LGBMClassifier
# model = LGBMClassifier()
# model.fit(X_train, y_train)
# y_pred = model.predict(X_test)
# score = accuracy_score(y_pred, y_test)
# print('LightGBM',score)

# # 模型九 CatBoost
# from catboost import CatBoostClassifier
# model = CatBoostClassifier()
# model.fit(X_train, y_train)
# y_pred = model.predict(X_test)
# score = accuracy_score(y_pred, y_test)
# print('CatBoost',score)

# # 模型十 集成学习
# from sklearn.ensemble import VotingClassifier
# model = VotingClassifier(estimators=[('lr', model), ('nb', model), ('dt', model), ('rf', model), ('knn', model), ('svm', model), ('xgb', model), ('lgb', model), ('cb', model)], voting='hard')
# model.fit(X_train, y_train)
# y_pred = model.predict(X_test)
# score = accuracy_score(y_pred, y_test)
# print('集成学习',score)

# # 模型十一 模型融合
# from sklearn.ensemble import StackingClassifier
# model = StackingClassifier(estimators=[('lr', model), ('nb', model), ('dt', model), ('rf', model), ('knn', model), ('svm', model), ('xgb', model), ('lgb', model), ('cb', model)], final_estimator=model)
# model.fit(X_train, y_train)
# y_pred = model.predict(X_test)
# score = accuracy_score(y_pred, y_test)
# print('模型融合',score)


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

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

相关文章

后VMware时代,一体化技术平台建设思路

在数字化转型的浪潮中,企业对IT基础设施的需求正在发生根本性的变化。VMware时代的结束,为企业带来了重新构建技术平台的机遇与挑战。6月28日,在主题为【聚力生态,VMware全链替代】的线上研讨会上,灵雀云首席解决方案专…

适合运动的骨传导耳机有哪些?总结五款适合运动的骨传导耳机推荐

在追求健康生活的浪潮中,运动健身蔚然成风,而运动时的音乐陪伴更是不可或缺。然而,传统耳机在运动场景下的种种不便,促使市场寻找更佳解决方案。此时,骨传导耳机应运而生,以其独特的传音方式,为…

ESP32-WROVER-E/ESP32-WROVER-IE模组硬件相关

ESP32-WROVER-E和ESP32-WROVER-IE区别 带I的为采用外部天线,不带I的使用PCB天线。 模组后缀N16R8,16为4、8、16为FLASH存储器容量,8为8或2,为PSRAM的容量,单位均为MB。 模组芯片 ESP32-WROVER-E 和 ESP32-WROVER-IE…

tkinter-TinUI-xml实战(11)多功能TinUIxml编辑器

引言 在TinUIXml简易编辑器中,我们通过TinUI搭建了一个简易的针对TinUIXml布局的编辑器,基本掌握了TinUIXml布局和TinUIXml的导入与导出。现在,就在此基础上,对编辑器进行升级。 本次升级的功能: 更合理的xml编辑与…

【洞见】智算操作系统,推进算力迈入普惠智算新时代

WAIC 2024世界人工智能大会暨人工智能全球治理高级别会议正式拉开帷幕,面向世界徐徐展示人工智能技术最前沿的理念和成果。九章云极DataCanvas公司董事长方磊受邀参加大会开幕式,并在“迈向AGI:大模型焕新与产业赋能”论坛发表主题演讲&#…

docker 上传镜像到hub仓库

要将 Docker 镜像上传到 Docker Hub,你需要按照以下步骤操作: 登录 Docker Hub 首先,你需要登录到 Docker Hub。打开终端并运行以下命令:docker login系统会提示你输入 Docker Hub 的用户名和密码。 如果密码忘记可以token登录&a…

函数式接口、匿名内部类、lambda表达式

一、函数式接口 只有一个抽象方法的接口叫函数式接口,不能有两个,也不能有方法实现。 FunctionalInterface注解标记,在idea中可以用这个注解验证是不是函数式接口。实现函数式接口可以转成lambda表达式。 二、匿名内部类 匿名内部类的格式&a…

[k8s源码]1.client-go集群外部署

client-go是由k8s发布且维护的专门用于开发者和kubernetes交互的客户端库。它支持对k8s资源的CRUD操作(create、read、update、delete),事件监听和处理,访问kubernetes集群的上下文和配置。 client go是独立于kubernetes集群之外…

爬虫如此简单?一文教会网络爬虫!

在今天的网络环境中,数据的获取对于许多电商和信息分析人员来说至关重要。但是频繁的数据采集行为可能会导致目标网站对你的IP进行封锁或限制访问频率。这时候,使用代理IP可以是一个有效的解决方案。本文将向你介绍如何使用代理IP进行网络爬虫&#xff0…

《计算机研究与发展》投稿经验

前言 记录下投计研展正刊的经验。跟专刊不同哈,专刊会更快,我看好像也有专刊的经验分享。【计算机研究与发展投稿记录】 期刊简介 来源计研展官网: 《计算机研究与发展》是中国科学院计算技术研究所和中国计算机学会联合主办的学术性期刊&a…

sqlmap确定目标/实操

安装kali,kali自带sqlmap,在window系统中跟linux系统操作有区别 sqlmap是一款自动化SQL工具,打开kali终端,输入sqlmap,出现以下界面,就说明sqlmap可用。 sqlmap确定目标 一、sqlmap直连数据库 1、直连数据库…

电机控制杂谈——基于偏置电压注入的载波PWM策略/简化版SVPWM

1.前言 SVPWM策略需要非常繁琐的计算过程(扇区判断、电压矢量作用时间计算、各相开关切换顺序排布、各相开关切换时间计算,同时SVPWM还存在大量的查表法)。这在一定程度上限制了控制频率的提高(因为SVPWM计算复杂,会占…

centos 安装ffmpeg

这个错误表明在你的 CentOS 系统的默认仓库中没有 ffmpeg 包。CentOS 的默认仓库通常不包含 ffmpeg,因为它涉及一些许可证问题。但是,你可以通过添加第三方仓库来安装 ffmpeg。 使用 EPEL 和 RPM Fusion 仓库 # 安装 EPEL 仓库 sudo yum install epel-…

TIA博途Wincc中画箭头和管道的具体方法示例

TIA博途Wincc中画箭头和管道的具体方法示例 如何画箭头? 如下图所示,在右侧的工具箱中找到基本对象—线,点击选中, 如下图所示,在画面中添加一条线段,然后右键进入该线段的属性,设置线的外观: 宽度、样式、颜色; 线端:这里可以选择起始和结束的样式,选择“箭头”,则…

压测引擎数据库设计(下)

压测引擎数据库设计(下) 引言 上一篇博文讲述了我们压测引擎数据库设计的上半部分的内容,这一篇博文将会把压测引擎数据库设计最后的内容也讲完。 上一篇博文已经把下图的“项目”、“环境”和“压测模块”三张表已经设计完成,这…

零基础STM32单片机编程入门(十三) 红外避障传感器模块实战含源码

文章目录 一.概要二.红外避障模块主要参数1.模块引脚定义2.模块特点3.模块原理图 三.STM32单片机红外避障模块检测实验四.CubeMX工程源代码下载五.小结 一.概要 红外避障模块具有一对红外线发射与接收管,发射管发射出一定频率的红外线,当检测遇到障碍物…

【香橙派5】使用frp建立香橙派内网穿透

1、首先进入github下载需要用的tar包 https://github.com/fatedier/frp/releases请一定一定看清楚,一个是amd,一个是arm不要上传岔了!!! 2、上传之后,服务器端进行修改 首先进行压缩包解压 tar -zxvf f…

ENSP软件中DHCP的相关配置以及终端通过域名访问服务器

新建拓扑 配置路由器网关IP 设备配置命令&#xff1a;<Huawei> Huawei部分为设备名 <>代表当下所在的模式&#xff0c;不同模式下具有不同的配置权限<Huawei> 第一级模式&#xff0c;最低级模式 查看所有参数<Huawei>system-view 键入系统视图…

html5——表单

目录 表单基本结构 表单标签 常用表单元素 文本框 密码框 邮箱 单选按钮 复选框 文件域 隐藏域 列表框 多行文本域 lable标签 表单按钮 常用表单属性 只读与禁用 placeholder required pattern autofocus autocomplete 用于指定表单是否有自动完…

脉脉高聘:面对薪资福利减少,超40%职场人自动缩短工时

近日&#xff0c;脉脉高聘人才智库发布《2024职场生存洞察》&#xff08;下称《洞察》&#xff09;。 数据显示&#xff0c;2024上半年&#xff0c;新经济行业求职压力居高不下&#xff0c;人才供需比达到1.97&#xff0c;相当于2个人竞争1个岗位。求职压力也让职场人心态趋于…