解决样本不平衡问题:深入理解和实现下采样技术

       

目录

一、什么是下采样

二、下采样的实现步骤

1、加载和预处理数据    

2、执行下采样

 3、训练和评估模型


 在机器学习中,处理样本不平衡问题是一个常见而重要的挑战。当数据集中一个类别的样本数量远远超过另一个类别时,模型容易偏向于占据主导地位的类别,而无法有效地学习少数类的特征,这就会影响模型在实际应用中的表现和准确性。本文将深入探讨一种有效的解决方案——下采样(undersampling),并演示如何在Python环境中实现和应用这一技术。

一、什么是下采样

        下采样是一种通过减少数据集中多数类(majority class)的样本数量,来平衡不同类别的样本分布的技术。这种方法的核心思想是尽可能地保留所有少数类别(minority class)的样本,同时削减多数类的样本数量,从而实现更平衡的类别分布。下采样的目标是使模型更好地学习少数类的特征,从而提高对少数类的预测准确性。

二、下采样的实现步骤

        让我们通过一个具体的例子来演示如何实现下采样,并利用逻辑回归模型来进行分类任务。我们将使用Python和几个常见的机器学习库来完成这个任务。    

1、加载和预处理数据    

        首先,我们需要加载数据集并进行必要的预处理。在这个例子中,我们将使用一个信用卡交易数据集(creditcard.csv),其中包含正常交易和欺诈交易两类数据。

import pandas as pd
from sklearn.preprocessing import StandardScaler
from sklearn.model_selection import train_test_split

# 加载数据集
data = pd.read_csv('creditcard.csv')

# 对Amount列进行标准化处理
scaler = StandardScaler()
data['Amount'] = scaler.fit_transform(data[['Amount']])

# 删除Time列,这里认为时间对分类没有直接影响
data = data.drop(['Time'], axis=1)
  • pandas 库用于数据处理,StandardScaler 用于特征标准化,train_test_split 用于数据集分割。
  • creditcard.csv 包含信用卡交易数据,其中包括Amount(交易金额)和Class(交易是否为欺诈)等列。
  • StandardScaler 用于对Amount列进行标准化处理,使得数据集的特征均值为0,方差为1。
2、执行下采样

        接下来,我们执行下采样操作,确保多数类(正常交易)和少数类(欺诈交易)的样本数量相等。我们通过随机抽样的方式,从多数类中选取与少数类相同数量的样本,并将它们合并成一个新的平衡数据集。

import numpy as np

# 分离正常交易和欺诈交易样本
positive_eg = data[data['Class'] == 0]
negative_eg = data[data['Class'] == 1]

# 设定随机种子确保结果可复现
np.random.seed(seed=4)

# 随机抽样与欺诈交易相同数量的正常交易样本,进行下采样
positive_eg = positive_eg.sample(len(negative_eg))

# 合并正常交易和欺诈交易样本
balanced_data = pd.concat([positive_eg, negative_eg])
  • numpy 库用于生成随机种子和操作数组。
  • positive_eg 包含正常交易的数据,negative_eg 包含欺诈交易的数据。
  • 通过设定随机种子,确保每次运行得到的随机结果相同,增强实验结果的可重复性。
  • 使用 sample 方法从正常交易数据中随机抽取与欺诈交易数据相同数量的样本,实现下采样。
  • 最后,使用 pd.concat 方法将下采样后的正常交易和所有欺诈交易样本合并成新的平衡数据集 balanced_data
 3、训练和评估模型

        现在,我们可以将平衡后的数据集分为训练集和测试集,并训练一个逻辑回归模型来对欺诈交易进行预测。我们还会评估模型在测试集上的性能,以验证下采样技术的效果。

from sklearn.linear_model import LogisticRegression
from sklearn import metrics

# 分割数据集为训练集和测试集
X = balanced_data.drop('Class', axis=1)
y = balanced_data['Class']
x_train, x_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=0)

# 训练逻辑回归模型
lr = LogisticRegression()
lr.fit(x_train, y_train)

# 预测训练集和测试集
train_predicted = lr.predict(x_train)
test_predicted = lr.predict(x_test)

# 输出分类性能报告
print("训练集性能报告:")
print(metrics.classification_report(y_train, train_predicted))
print("测试集性能报告:")
print(metrics.classification_report(y_test, test_predicted))
  • LogisticRegression 是用于逻辑回归模型的类,metrics 用于生成分类性能报告。
  • train_test_split 用于将数据集分割为训练集和测试集,测试集大小占总数据集的30%。
  • 逻辑回归模型 lr 被训练在训练集上。
  • 使用 predict 方法对训练集和测试集进行预测。
  • 最后,使用 classification_report 打印出训练集和测试集的分类性能报告,包括精确度、召回率、F1值等指标。
  • 10
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值