【机器学习】类别不平衡数据的处理

本文涉及的产品
资源编排,不限时长
简介: 【机器学习】类别不平衡数据的处理

🍔 前言

在现实环境中,采集的数据(建模样本)往往是比例失衡的。比如:一个用于模型训练的数据集中,A 类样本占 95%,B 类样本占 5%。

🐼 类别的不平衡会影响到模型的训练,所以,我们需要对这种情况进行处理。处理的主要方法如下:

  1. 过采样:增加少数类别样本的数量,例如:减少 A 样本数量,达到 AB 两类别比例平衡。
  2. 欠采样:减少多数类别样本的数量,例如:增加 B 类样本数量,达到 AB 两类别比例平衡。

🍔 方案1:LR自带参数

处理不均衡的数据 class_weight=“balanced” 参数 根据样本出现的评论自动给样本设置权重

示例代码💯:

# 处理不均衡的数据
import numpy as np
from sklearn.linear_model import LogisticRegression
from sklearn import datasets
from sklearn.preprocessing import StandardScaler
iris = datasets.load_iris()
# 移走40个数据,使数据不均衡
features = iris.data[40:, :]
target = iris.target[40:]
target
array([0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
       1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
       1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2,
       2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
       2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2])
# 打标签 
target = np.where((target == 0), 0, 1)
target
# 标准化数据
scaler = StandardScaler()
features_standardized = scaler.fit_transform(features)
# class_weight="balanced"  参数  根据样本出现的评论自动给 样本设置 权重
logistic_regression = LogisticRegression(random_state=0, class_weight="balanced")
model = logistic_regression.fit(features_standardized, target)

🍔 方案2:imbalanced-learn

imbalanced-learn是一个基于Python的开源库,专门用于处理不平衡数据集的机器学习问题。该库提供了一系列的重采样技术、组合方法和机器学习算法,旨在提高在不平衡数据集上的分类性能。以下是对imbalanced-learn的详细介绍:

主要功能

🐻 重采样技术:包括欠采样(如Tomek Links、Random Under Sampler等)、过采样(如SMOTE、ADASYN等)以及结合欠采样和过采样的方法(如SMOTEENN、SMOTETomek等)。这些技术通过重新调整数据集中各类别的样本数量,以达到类别平衡的目的。

🐻 组合方法:imbalanced-learn还提供了一些组合方法,如集成学习和自适应集成学习等,这些方法通过结合多个分类器的预测结果来提高整体分类性能。

🐻 机器学习算法:除了重采样技术和组合方法外,imbalanced-learn还包含了一些专门为不平衡数据集设计的机器学习算法,如Easy Ensemble classifier、Balanced Random Forest等。

特点

🐻 多样性:imbalanced-learn提供了多种不同的重采样技术和组合方法,用户可以根据具体的数据集和需求选择合适的方法。

🐻 可扩展性:该库支持与scikit-learn和Pandas等常见的Python库集成,可以方便地与其他的机器学习算法和工具进行组合和使用。

🐻 灵活性:imbalanced-learn提供了多种参数调整和定制化的选项,用户可以根据不同的应用场景和需求进行调整和定制化。

3.1 安装

imbalanced-learn的安装非常简单,用户可以通过pip或conda等包管理工具进行安装。例如,使用pip安装imbalanced-learn的命令如下:

pip install imbalanced-learn

3.2 过采样

  1. 随机过采样:随机在少数类别样本中选择一些样本,通过复制所选择的样本方式补充少数类别样本数量。
  2. 合成少数类过采样(SMOTE): 1. 计算每个样本的 K 个近邻
  1. 对每个少数样本,从其 K 近邻中随机选择若干个样本
  2. 在少数样本和选择的近邻样本之间的连线上选择一点作为新的样本
  3. 将新样本添加到少数类样本集中

示例代码💯:

from sklearn.datasets import make_classification
import matplotlib.pyplot as plt
from collections import Counter
# 随机过采样
def test01(X, y):
    from imblearn.over_sampling import RandomOverSampler
    # 构建随机过采样对象
    ros = RandomOverSampler(random_state=0)
    # 对X中的少数样本进行随机过采样,返回类别平衡的数据集
    X_resampled, y_resampled = ros.fit_resample(X, y)
    # 查看新数据集类别比例
    print(Counter(y_resampled))
    # 数据可视化
    plt.title("过采样数据集")
    plt.scatter(X_resampled[:, 0], X_resampled[:, 1], c=y_resampled)
    plt.show()
# 合成少数过采样
def test02(X, y):
    from imblearn.over_sampling import SMOTE
    # 构建 SMOTE 对象
    ros = SMOTE(random_state=0)
    # 对X中的少数样本进行合成少数过采样,返回类别平衡的数据集
    X_resampled, y_resampled = ros.fit_resample(X, y)
    # 查看新数据集类别比例
    print(Counter(y_resampled))
    # 数据可视化
    plt.title("过采样数据集")
    plt.scatter(X_resampled[:, 0], X_resampled[:, 1], c=y_resampled)
    plt.show()
if __name__ == "__main__":
    # 构建数据集
    X, y = make_classification(n_samples=5000,
                               n_features=2,
                               n_informative=2,
                               n_redundant=0,
                               n_repeated=0,
                               n_redundant 特征
                               n_classes=3,
                               n_clusters_per_class=1, 
                               weights=[0.01, 0.05, 0.94],
                               random_state=0)
    # 统计各类别样本数量
    print(Counter(y))
    # 数据可视化
    plt.title("类别不平衡数据集")
    plt.scatter(X[:, 0], X[:, 1], c=y)
    plt.show()
    # 随机过采样
    test01(X, y)
    # 合成少数过采样
    test02(X, y)

3.3 欠采样

随机欠采样: 随机减少多数类别样本数量, 达到样本数量平衡.

示例代码💯:

from sklearn.datasets import make_classification
import matplotlib.pyplot as plt
from collections import Counter
def test(X, y):
    from imblearn.under_sampling import RandomUnderSampler
    # 构建随机欠采样对象
    ros = RandomUnderSampler(random_state=0)
    # 对X中的少数样本进行随机过采样,返回类别平衡的数据集
    X_resampled, y_resampled = ros.fit_resample(X, y)
    # 查看新数据集类别比例
    print(Counter(y_resampled))
    # 数据可视化
    plt.title("过采样数据集")
    plt.scatter(X_resampled[:, 0], X_resampled[:, 1], c=y_resampled)
    plt.show()
if __name__ == "__main__":
    # 构建数据集
    X, y = make_classification(n_samples=5000,
                               n_features=2,
                               n_informative=2,
                               n_redundant=0,
                               n_repeated=0,
                               n_redundant 特征
                               n_classes=3,
                               n_clusters_per_class=1, 
                               weights=[0.01, 0.05, 0.94],
                               random_state=0)
    # 统计各类别样本数量
    print(Counter(y))
    # 数据可视化
    plt.title("类别不平衡数据集")
    plt.scatter(X[:, 0], X[:, 1], c=y)
    plt.show()
    # 随机欠采样
    test(X, y)


相关实践学习
使用ROS创建VPC和VSwitch
本场景主要介绍如何利用阿里云资源编排服务,定义资源编排模板,实现自动化创建阿里云专有网络和交换机。
阿里云资源编排ROS使用教程
资源编排(Resource Orchestration)是一种简单易用的云计算资源管理和自动化运维服务。用户通过模板描述多个云计算资源的依赖关系、配置等,并自动完成所有资源的创建和配置,以达到自动化部署、运维等目的。编排模板同时也是一种标准化的资源和应用交付方式,并且可以随时编辑修改,使基础设施即代码(Infrastructure as Code)成为可能。 产品详情:https://www.aliyun.com/product/ros/
相关文章
|
8天前
|
机器学习/深度学习 数据采集 数据处理
谷歌提出视觉记忆方法,让大模型训练数据更灵活
谷歌研究人员提出了一种名为“视觉记忆”的方法,结合了深度神经网络的表示能力和数据库的灵活性。该方法将图像分类任务分为图像相似性和搜索两部分,支持灵活添加和删除数据、可解释的决策机制以及大规模数据处理能力。实验结果显示,该方法在多个数据集上取得了优异的性能,如在ImageNet上实现88.5%的top-1准确率。尽管有依赖预训练模型等限制,但视觉记忆为深度学习提供了新的思路。
16 2
|
4月前
|
机器学习/深度学习 人工智能 专有云
人工智能平台PAI使用问题之怎么将DLC的数据写入到另一个阿里云主账号的OSS中
阿里云人工智能平台PAI是一个功能强大、易于使用的AI开发平台,旨在降低AI开发门槛,加速创新,助力企业和开发者高效构建、部署和管理人工智能应用。其中包含了一系列相互协同的产品与服务,共同构成一个完整的人工智能开发与应用生态系统。以下是对PAI产品使用合集的概述,涵盖数据处理、模型开发、训练加速、模型部署及管理等多个环节。
|
30天前
|
机器学习/深度学习 存储 人工智能
揭秘机器学习背后的神秘力量:如何高效收集数据,让AI更懂你?
【10月更文挑战第12天】在数据驱动的时代,机器学习广泛应用,从智能推荐到自动驾驶。本文以电商平台个性化推荐系统为例,探讨数据收集方法,包括明确数据需求、选择数据来源、编写代码自动化收集、数据清洗与预处理及特征工程,最终完成数据的训练集和测试集划分,为模型训练奠定基础。
42 3
|
1月前
|
机器学习/深度学习 算法 Python
“探秘机器学习的幕后英雄:梯度下降——如何在数据的海洋中寻找那枚失落的钥匙?”
【10月更文挑战第11天】梯度下降是机器学习和深度学习中的核心优化算法,用于最小化损失函数,找到最优参数。通过计算损失函数的梯度,算法沿着负梯度方向更新参数,逐步逼近最小值。常见的变种包括批量梯度下降、随机梯度下降和小批量梯度下降,各有优缺点。示例代码展示了如何用Python和NumPy实现简单的线性回归模型训练。掌握梯度下降有助于深入理解模型优化机制。
29 2
|
2月前
|
机器学习/深度学习 数据采集 监控
探索机器学习:从数据到决策
【9月更文挑战第18天】在这篇文章中,我们将一起踏上一段激动人心的旅程,穿越机器学习的世界。我们将探讨如何通过收集和处理数据,利用算法的力量来预测未来的趋势,并做出更加明智的决策。无论你是初学者还是有经验的开发者,这篇文章都将为你提供新的视角和思考方式。
|
1月前
|
机器学习/深度学习 算法 数据处理
EM算法对人脸数据降维(机器学习作业06)
本文介绍了使用EM算法对人脸数据进行降维的机器学习作业。首先通过加载ORL人脸数据库,然后分别应用SVD_PCA、MLE_PCA及EM_PCA三种方法实现数据降维,并输出降维后的数据形状。此作业展示了不同PCA变种在人脸数据处理中的应用效果。
32 0
|
2月前
|
机器学习/深度学习 数据采集 算法
利用未标记数据的半监督学习在模型训练中的效果评估
本文将介绍三种适用于不同类型数据和任务的半监督学习方法。我们还将在一个实际数据集上评估这些方法的性能,并与仅使用标记数据的基准进行比较。
206 8
|
3月前
|
监控 数据安全/隐私保护 异构计算
借助PAI-EAS一键部署ChatGLM,并应用LangChain集成外部数据
【8月更文挑战第8天】借助PAI-EAS一键部署ChatGLM,并应用LangChain集成外部数据
95 1
|
3月前
|
数据采集 机器学习/深度学习 算法
"揭秘数据质量自动化的秘密武器:机器学习模型如何精准捕捉数据中的‘隐形陷阱’,让你的数据分析无懈可击?"
【8月更文挑战第20天】随着大数据成为核心资源,数据质量直接影响机器学习模型的准确性和效果。传统的人工审查方法效率低且易错。本文介绍如何运用机器学习自动化评估数据质量,解决缺失值、异常值等问题,提升模型训练效率和预测准确性。通过Python和scikit-learn示例展示了异常值检测的过程,最后强调在自动化评估的同时结合人工审查的重要性。
91 2
|
3月前
|
机器学习/深度学习 JSON API
【Python奇迹】FastAPI框架大显神通:一键部署机器学习模型,让数据预测飞跃至Web舞台,震撼开启智能服务新纪元!
【8月更文挑战第16天】在数据驱动的时代,高效部署机器学习模型至关重要。FastAPI凭借其高性能与灵活性,成为搭建模型API的理想选择。本文详述了从环境准备、模型训练到使用FastAPI部署的全过程。首先,确保安装了Python及相关库(fastapi、uvicorn、scikit-learn)。接着,以线性回归为例,构建了一个预测房价的模型。通过定义FastAPI端点,实现了基于房屋大小预测价格的功能,并介绍了如何运行服务器及测试API。最终,用户可通过HTTP请求获取预测结果,极大地提升了模型的实用性和集成性。
241 1