机器学习-过采样(全网最详解)

2024-08-22 01:52

本文主要是介绍机器学习-过采样(全网最详解),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

文章目录

  • 相关介绍
    • 1.过采样的基本概念
    • 2.常见的过采样方法
    • 3.过采样在逻辑回归中的应用
  • 过采样实际运用
    • 1.导入相关包
    • 2.数据预处理
    • 3.过采样操作
    • 4.交叉验证
    • 5.绘制混淆矩阵
    • 6.模型评估与测试
  • 总结

相关介绍

在逻辑回归中,处理不平衡数据集是一个重要的步骤,因为不平衡的数据集可能导致模型偏向于多数类,而忽略少数类。过采样(Over-sampling)是处理不平衡数据集的一种常用方法,它通过增加少数类样本的数量来平衡数据集。

1.过采样的基本概念

过采样是指对训练集中的少数类样本进行重复采样或生成新的合成样本,以增加其数量,从而使正负样本的比例达到平衡或接近平衡。这样做的目的是提高模型对少数类的识别能力,避免模型因忽略少数类而导致的偏差。

2.常见的过采样方法

  • 随机过采样:

    • 方法:随机选择少数类中的样本进行复制,然后将复制的样本添加到数据集中。
    • 缺点:简单复制可能导致过拟合,因为模型会学习到特定于复制样本的特征,而这些特征可能并不具有泛化性。
  • SMOTE(Synthetic Minority Over-sampling Technique):

    • 方法:SMOTE通过合成新的少数类样本来增加数量。对于每个少数类样本,SMOTE找到其k个最近邻(也是少数类样本),然后在这些近邻与该样本之间的连线上随机选择一点作为新的合成样本。
    • 优点:减少了因简单复制导致的过拟合风险,因为合成的样本是基于原始样本的“插值”生成的。
  • ADASYN(Adaptive Synthetic Sampling):

    • 方法:ADASYN是SMOTE的一种改进版本。它根据每个少数类样本的分布自动决定要为其生成多少合成样本。如果一个样本难以被正确分类(即其最近邻中有很多多数类样本),那么该样本将获得更高的权重,并生成更多的合成样本。
    • 优点:能够更智能地处理不平衡问题,特别是在极端不平衡的情况下。

3.过采样在逻辑回归中的应用

在逻辑回归中,过采样通常用于预处理阶段,以平衡数据集。一旦数据集被平衡,就可以使用逻辑回归模型进行训练和预测。然而,需要注意的是,过采样可能会引入一些额外的计算成本,特别是在处理大规模数据集时。
此外,虽然过采样可以提高模型对少数类的识别能力,但也可能导致模型在预测新数据时出现偏差。因此,在实际应用中,通常需要结合欠采样、调整模型参数或使用特殊算法(如集成学习方法)等策略来综合处理不平衡问题。

过采样实际运用

这里我们通过讲解信用卡贷款的问题来为大家展示过采样的相关用法,包括过采样、模型搭建、混淆矩阵、数据标准化和交叉验证等多种代码的实现与应用。

1.导入相关包

import matplotlib.pylab as plt
import numpy as np
import pandas as pd
from pylab import mpldef cm_plot(y, yp):from sklearn.metrics import confusion_matriximport matplotlib.pyplot as pltcm = confusion_matrix(y, yp)plt.matshow(cm, cmap=plt.cm.Blues)plt.colorbar()for x in range(len(cm)):for y in range(len(cm)):plt.annotate(cm[x, y], xy=(y, x), horizontalalignment='center', verticalalignment='center')plt.ylabel('True label')plt.xlabel('Predicted label')return plt

这里我们导入相关包,并绘制混淆矩阵,对应包的作用如下:

  • pandas:用于数据处理和分析的包。
  • numpy:提供高性能多维数组的对象和相关操作的运用。
  • matplotlib.pylab:绘制图像,这里通过绘制图像来展示数据之间的关系。

2.数据预处理

data = pd.read_csv(r"./creditcard.csv")
data.head()  # 默认打印前5行
"""数据标准化:Z标准化"""
from sklearn.preprocessing import StandardScaler
scaler = StandardScaler()
a = data[['Amount']]  # 返回dataframe数据,而不是series
data['Amount'] = scaler.fit_transform(data[['Amount']])
data = data.drop(['Time'], axis=1)  # 删除无用列
"""切分测试集,测试集使用原始数据进行预测"""
from sklearn.model_selection import train_test_splitX_whole = data.drop('Class', axis=1)
y_whole = data.Class
x_train_w, x_test_w, y_train_w, y_test_w = \train_test_split(X_whole, y_whole, test_size=0.3, random_state=0)
  • 读取数据:通过pandas库的read_csv读取数据集。
  • 数据标准化:引入sklearn库,对Amount列数据进行标准化,这里我们对其进行Z标准化操作,将其列内的数据限制在(-1,1)范围内,以便减小Amount列对数据集的影响,同时删除无用列Time并将数据再次赋值给data。
  • 数据集分割:引入sklearn库,同时将data中除去Class列的所有数据全部给X_whole,将Class列给y_whole。通过sklearn库中的train_test_split方法将X_whole与y_whole按随机种子为0,测试数据为原数据的30%来切分成测试集与训练集。

注意:
这里的axis=1为列,axis=0为行。
random_state是一个随机种子,用于控制随机过程(如样本的选择和合成),以确保每次运行代码时都能得到相同的结果。

3.过采样操作

from imblearn.over_sampling import SMOTEoversampler = SMOTE(random_state=0)
os_x_train,os_y_train = oversampler.fit_resample(x_train_w,y_train_w)mpl.rcParams['font.sans-serif'] = ['Microsoft YaHei']
mpl.rcParams['axes.unicode_minus'] = Falselables_count = pd.value_counts(os_y_train)  # 0有多少个数据,1有多少个数据
plt.title("正负样本数")
plt.xlabel("类别")
plt.ylabel("频数")
lables_count.plot(kind='bar')
plt.show()os_x_train_w, os_x_test_w, os_y_train_w, os_y_test_w = \train_test_split(os_x_train, os_y_train, test_size=0.3, random_state=0)
  • 过采样:导入SMOTE类,并通过SMOTE建立一个实列,使用fit_resample方法将SMOTE用于训练训练集数据特征x_train_w与变量y_train_w,并将过采样后的数据返回到特征os_x_train与变量os_y_train中去。
  • 绘制图像:将过采样后返回的数据进行图像绘制,以便查看0、1数据的数量。图形展示如下:
    在这里插入图片描述
  • 切分测试集:对过采样数据再次进行切分,按照测试集为30%的方法切分新的测试集与训练集,让过采样后的数据先进行内部测试

4.交叉验证

from sklearn.linear_model import LogisticRegression
from sklearn.model_selection import cross_val_score  # 交叉验证的函数# 交叉验证选择较优惩罚因子
scores = []
c_param_range = [0.01, 0.1, 1, 10, 100]  # 参数
for i in c_param_range:  # 第1词循环的时候C=0.01,lr = LogisticRegression(C=i, penalty='l2', solver='lbfgs', max_iter=1000)score = cross_val_score(lr, os_x_train_w, os_y_train_w, cv=8, scoring='recall')score_mean = sum(score) / len(score)  # 交叉验证后的召回率scores.append(score_mean)  # 所有交叉验证的召回率print(score_mean)best_c = c_param_range[np.argmax(scores)]  # 寻找scores中最大值对应的C
print("最大值对应的C为:{}".format(best_c))# 建立最优模型
lr = LogisticRegression(C=best_c, penalty='l2', solver='lbfgs', max_iter=1000)
lr.fit(os_x_train_w, os_y_train_w)
  • 设置参数:依次设置内部参数,C为正则化强度,正则化系数λ的倒数,float类型,默认为1.0。必须是正浮点型数。像SVM一样,越小的数值表示越强的正则化。penalty为正则化方式,有l1和l2两种,这里我们选择l2方式。Solver为优化拟合参数算法选择,默认为liblinear,这里我们选择lbfgs。max_iter为最大迭代次数,这里我们设置为1000。
  • 交叉验证:通过K折交叉验证来选择最优的惩罚因子,防止过拟合。这里K设置为8。然后计算8次验证后的召回率将其返回到scores中。
  • 寻找最优正则化强度:通过np.argmax方法寻找最大召回率对应的C值
  • 建立模型:取出最优值,然后进行最优的模型建立。

5.绘制混淆矩阵

from sklearn import metricsos_train_predicted = lr.predict(os_x_train_w)
print(metrics.classification_report(os_y_train_w, os_train_predicted))
cm_plot(os_y_train_w, os_train_predicted).show()os_test_predicted = lr.predict(os_x_test_w)  # 小数据测试
print(metrics.classification_report(os_y_test_w, os_test_predicted))
cm_plot(os_y_test_w, os_test_predicted).show()train_predicted = lr.predict(x_train_w)
print(metrics.classification_report(y_train_w, train_predicted))
cm_plot(y_train_w, train_predicted).show()test_predicted = lr.predict(x_test_w)
print(metrics.classification_report(y_test_w, test_predicted))
cm_plot(y_test_w, test_predicted).show()
  • 绘制混淆矩阵:绘制全部测试集与训练集的混淆矩阵和数据图像,以便观察相应的值。

在这里插入图片描述

6.模型评估与测试

thresholds = [0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9]
recalls = []
for i in thresholds:y_predict_proba = lr.predict_proba(x_test_w)y_predict_proba = pd.DataFrame(y_predict_proba)y_predict_proba = y_predict_proba.drop([0], axis=1)# 当预测概率大于i,0.1,0.2,预测的标签设置1y_predict_proba[y_predict_proba[[1]] > i] = 1# 当预测概率小于等于i 预测的标签设置为0y_predict_proba[y_predict_proba[[1]] <= i] = 0recall = metrics.recall_score(y_test_w, y_predict_proba[1])recalls.append(recall)print(metrics.classification_report(y_test_w, y_predict_proba[1]))print("{} Recall metric in the testing dataset: {:.3f}".format(i, recall))
  • 模型预测:更改标签设置的范围,计算每次更改i值时的召回率,并绘制相应的混淆矩阵,输出召回率。
    在这里插入图片描述

总结

过采样是逻辑回归中处理不平衡数据集的一种有效方法。通过增加少数类样本的数量,可以平衡数据集,提高模型对少数类的识别能力。然而,在选择过采样方法时,需要考虑其潜在的缺点,并结合实际情况选择最适合的方法。

这篇关于机器学习-过采样(全网最详解)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1094902

相关文章

HarmonyOS学习(七)——UI(五)常用布局总结

自适应布局 1.1、线性布局(LinearLayout) 通过线性容器Row和Column实现线性布局。Column容器内的子组件按照垂直方向排列,Row组件中的子组件按照水平方向排列。 属性说明space通过space参数设置主轴上子组件的间距,达到各子组件在排列上的等间距效果alignItems设置子组件在交叉轴上的对齐方式,且在各类尺寸屏幕上表现一致,其中交叉轴为垂直时,取值为Vert

Ilya-AI分享的他在OpenAI学习到的15个提示工程技巧

Ilya(不是本人,claude AI)在社交媒体上分享了他在OpenAI学习到的15个Prompt撰写技巧。 以下是详细的内容: 提示精确化:在编写提示时,力求表达清晰准确。清楚地阐述任务需求和概念定义至关重要。例:不用"分析文本",而用"判断这段话的情感倾向:积极、消极还是中性"。 快速迭代:善于快速连续调整提示。熟练的提示工程师能够灵活地进行多轮优化。例:从"总结文章"到"用

Spring Security基于数据库验证流程详解

Spring Security 校验流程图 相关解释说明(认真看哦) AbstractAuthenticationProcessingFilter 抽象类 /*** 调用 #requiresAuthentication(HttpServletRequest, HttpServletResponse) 决定是否需要进行验证操作。* 如果需要验证,则会调用 #attemptAuthentica

【前端学习】AntV G6-08 深入图形与图形分组、自定义节点、节点动画(下)

【课程链接】 AntV G6:深入图形与图形分组、自定义节点、节点动画(下)_哔哩哔哩_bilibili 本章十吾老师讲解了一个复杂的自定义节点中,应该怎样去计算和绘制图形,如何给一个图形制作不间断的动画,以及在鼠标事件之后产生动画。(有点难,需要好好理解) <!DOCTYPE html><html><head><meta charset="UTF-8"><title>06

学习hash总结

2014/1/29/   最近刚开始学hash,名字很陌生,但是hash的思想却很熟悉,以前早就做过此类的题,但是不知道这就是hash思想而已,说白了hash就是一个映射,往往灵活利用数组的下标来实现算法,hash的作用:1、判重;2、统计次数;

OpenHarmony鸿蒙开发( Beta5.0)无感配网详解

1、简介 无感配网是指在设备联网过程中无需输入热点相关账号信息,即可快速实现设备配网,是一种兼顾高效性、可靠性和安全性的配网方式。 2、配网原理 2.1 通信原理 手机和智能设备之间的信息传递,利用特有的NAN协议实现。利用手机和智能设备之间的WiFi 感知订阅、发布能力,实现了数字管家应用和设备之间的发现。在完成设备间的认证和响应后,即可发送相关配网数据。同时还支持与常规Sof

零基础学习Redis(10) -- zset类型命令使用

zset是有序集合,内部除了存储元素外,还会存储一个score,存储在zset中的元素会按照score的大小升序排列,不同元素的score可以重复,score相同的元素会按照元素的字典序排列。 1. zset常用命令 1.1 zadd  zadd key [NX | XX] [GT | LT]   [CH] [INCR] score member [score member ...]

【机器学习】高斯过程的基本概念和应用领域以及在python中的实例

引言 高斯过程(Gaussian Process,简称GP)是一种概率模型,用于描述一组随机变量的联合概率分布,其中任何一个有限维度的子集都具有高斯分布 文章目录 引言一、高斯过程1.1 基本定义1.1.1 随机过程1.1.2 高斯分布 1.2 高斯过程的特性1.2.1 联合高斯性1.2.2 均值函数1.2.3 协方差函数(或核函数) 1.3 核函数1.4 高斯过程回归(Gauss

【学习笔记】 陈强-机器学习-Python-Ch15 人工神经网络(1)sklearn

系列文章目录 监督学习:参数方法 【学习笔记】 陈强-机器学习-Python-Ch4 线性回归 【学习笔记】 陈强-机器学习-Python-Ch5 逻辑回归 【课后题练习】 陈强-机器学习-Python-Ch5 逻辑回归(SAheart.csv) 【学习笔记】 陈强-机器学习-Python-Ch6 多项逻辑回归 【学习笔记 及 课后题练习】 陈强-机器学习-Python-Ch7 判别分析 【学

6.1.数据结构-c/c++堆详解下篇(堆排序,TopK问题)

上篇:6.1.数据结构-c/c++模拟实现堆上篇(向下,上调整算法,建堆,增删数据)-CSDN博客 本章重点 1.使用堆来完成堆排序 2.使用堆解决TopK问题 目录 一.堆排序 1.1 思路 1.2 代码 1.3 简单测试 二.TopK问题 2.1 思路(求最小): 2.2 C语言代码(手写堆) 2.3 C++代码(使用优先级队列 priority_queue)