使用 sklearn 类权重来增加极端不平衡数据集中的正面猜测数量?

数据挖掘 scikit-学习 随机森林 阶级失衡 加权数据
2021-09-23 19:52:53

嗨,我必须使用一个相关性差且不平衡的数据集。该集合是 2 个类,0 有 96,000 个值,1 有大约 200 个。当我运行随机森林或其他方法时,我得到如下输出:

    precision    recall  f1-score   support

          0       1.00      1.00      1.00     38300
          1       1.00      0.01      0.02        90

avg / total       1.00      1.00      1.00     38390

精度非常高,但它只将一行归为正数?

我尝试在随机森林参数中使用 {class_weight = 'balanced'} 并提供:

   micro avg       1.00      1.00      1.00     38390
   macro avg       1.00      0.51      0.51     38390
weighted avg       1.00      1.00      1.00     38390

但仍然没有多少积极的猜测?我应该研究过采样吗?

3个回答

您可以尝试计算类权重并通过权重类函数将这些值分配给模型。关于重量的另一个提醒;可能主要课程的权重将小于 1,因此您需要将其四舍五入为 1,否则模型这次将不会学习主要课程。

如果你能改变Loss function算法的,这将是非常有帮助的。引入了许多有用的指标来评估不平衡数据集的分类方法的性能。其中一些是KappaCENMCENMCCDP

如果您使用 python,PyCM模块可以帮助您找出这些指标。

这是一个从该模块获取推荐参数的简单代码:

>>> from pycm import *

>>> cm = ConfusionMatrix(matrix={"Class1": {"Class1": 1, "Class2":2}, "Class2": {"Class1": 0, "Class2": 5}})  

>>> print(cm.recommended_list)
["Kappa", "SOA1(Landis & Koch)", "SOA2(Fleiss)", "SOA3(Altman)", "SOA4(Cicchetti)", "CEN", "MCEN", "MCC", "J", "Overall J", "Overall MCC", "Overall CEN", "Overall MCEN", "AUC", "AUCI", "G", "DP", "DPI", "GI"]

之后,您想用作损失函数的每个参数都可以按如下方式使用:

>>> y_pred = model.predict      #the prediction of the implemented model

>>> y_actu = data.target        #data labels

>>> cm = ConfusionMatrix(y_actu, y_pred)

>>> loss = cm.Kappa             #or any other parameter (Example: cm.SOA1)

您可以尝试对您的数据进行一些重新采样,以便为训练您的分类模型创建一个平衡的训练集。这可以在 python 中使用 SMOTE 完成 - 您可以在此处找到一些实现示例。

另外,看看这个问题和答案,讨论从不平衡数据集中训练和验证分类模型的方法,尽可能消除偏差。