【实现】不平衡数据的处理

最近做多分类任务的时候遇到一个问题,样本的数量偏差大,数据不平衡,此时,准确度指标意义不大。

如果不同分类间的样本量差异达到超过10倍就需要引起警觉并考虑处理该问题超过20倍就要一定要解决该问题。

很多博客都指出了处理数据不平衡的一些算法,包括对数量多的样本进行欠采样,对数量较少的样本进行过采样来使数据尽可能平衡。构造1:1的数据。

关于对于实际数据,欠采样与过采样的代码实现方式还在进一步研究当中,我的输入是图片,输出是8类标签(多标签分类任务)。

很多博客里面提出使用imblearn库来对数据进行过采样与欠采样处理,但是不确定是否是其他库的原因,导致这个库的安装一直失败,后续怎么对数据处理,仍在研究中。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
ADASYN(Adaptive Synthetic Sampling)是一种用于解决不平衡数据问题的算法,它可以根据数据分布的密度进行自适应地合成少数类样本。下面是Python实现ADASYN处理平衡数据的示例代码: ```python import numpy as np from collections import Counter def adasyn(X, y, n_neighbors=5, ratio=0.5, beta=1.0): """ ADASYN算法处理平衡数据 :param X: 特征矩阵 :param y: 标签向量 :param n_neighbors: 每个少数类样本选择的近邻数 :param ratio: 合成的少数类样本数目与原少数类样本数目之比 :param beta: 分布密度偏向因子,控制合成样本在密度稀疏区域的生成量 :return: 合成后的特征矩阵和标签向量 """ # 统计每个类别的样本数 counter = Counter(y) majority_class = max(counter, key=counter.get) minority_class = min(counter, key=counter.get) n_samples = len(X) n_minority = counter[minority_class] n_synthetic = int(ratio * n_minority) # 计算每个样本的分布密度 dist = np.zeros(n_samples) for i in range(n_samples): dist[i] = np.sum(np.square(X[i] - X), axis=1) dist /= np.max(dist) # 合成新的少数类样本 synthetic_X = [] synthetic_y = [] for i in range(n_samples): if y[i] == minority_class: # 找到样本i的近邻 neighbors = np.argsort(dist)[1:n_neighbors + 1] neighbors = neighbors[y[neighbors] == majority_class] if len(neighbors) > 0: # 根据密度比例计算合成样本的数量 g = np.sum(dist[neighbors]) / len(neighbors) n = int(beta * g) for j in range(n): # 生成合成样本 k = np.random.choice(neighbors) diff = X[k] - X[i] synthetic = X[i] + np.random.rand() * diff synthetic_X.append(synthetic) synthetic_y.append(minority_class) # 合并原始样本和合成样本 synthetic_X = np.array(synthetic_X) synthetic_y = np.array(synthetic_y) X_resampled = np.vstack((X, synthetic_X)) y_resampled = np.hstack((y, synthetic_y)) return X_resampled, y_resampled ``` 示例用法: ```python from sklearn.datasets import make_classification from sklearn.model_selection import train_test_split from sklearn.linear_model import LogisticRegression from sklearn.metrics import classification_report # 生成不平衡数据集 X, y = make_classification(n_samples=10000, n_features=20, n_informative=10, n_redundant=5, weights=[0.9, 0.1], random_state=42) # 划分训练集和测试集 X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42) # 使用ADASYN算法处理平衡数据 X_resampled, y_resampled = adasyn(X_train, y_train, n_neighbors=5, ratio=0.5, beta=1.0) # 训练模型 clf = LogisticRegression(random_state=42) clf.fit(X_resampled, y_resampled) # 在测试集上评估模型 y_pred = clf.predict(X_test) print(classification_report(y_test, y_pred)) ``` 参考文献:[Haibo He, Yang Bai, Edwardo A. Garcia, and Shutao Li. ADASYN: Adaptive Synthetic Sampling for Imbalanced Learning. In: Proc. 2008 IEEE Intl. Joint Conf. on Neural Networks (IJCNN 2008), pp. 1322-1328, June 2008.](https://sci2s.ugr.es/keel/pdf/algorithm/congreso/2008-He-ijcnn.pdf)

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值