自定义交叉验证和极端不平衡的类的验证

时间:2019-01-09 16:28:55

标签: python scikit-learn decision-tree cross-validation confusion-matrix

我遇到了数据高度不平衡的多类问题。

他们是一类具有数千名成员的多数类,有些是100-1000名成员的类,而10-30个只有1名成员的类。

无法进行采样,因为它可能导致错误的类权重。

要评估我的模型,我想使用交叉验证。我尝试了cross_val_predict(x,y, cv=10),导致出现错误代码:

  

警告:y中人口最少的类只有1个成员,这太少了。任何类中的最小成员数不能小于n_splits = 10。

我试图建立自己的交叉验证,这很简单。

我通过StratifiedKFold拆分了数据,然后执行了以下操作:

clf = DecisionTreeClassifier()

for ta, te in splits
    xTrain, xTest = x.iloc[ta], x.iloc[te]
    yTrain, yTest = y.iloc[ta], y.iloc[te]
    clf.fit(xTrain, yTrain)
    prediction = clf.predict(xTest)
    cnf_matrix[ta] = confusion_matrix(yTest, prediction)
    classRepo[ta] = classification_report(y, prediction) 

因为我正在使用jupyter笔记本工作,所以必须手动打印cnf_matrixclassRepo的每个位置,然后自己进行检查。

是否有更优雅的解决方案,例如手动融合classRepocnf_matrix,以便获得与cross_val_predict(x,y, cv=x)相同的结果?

是否有更好的指标来解决我的问题?

1 个答案:

答案 0 :(得分:1)

“不可能进行采样,因为它可能导致错误的类权重。”

这是一个强有力的断言,因为您假设训练数据可以完美表示所有剩余的,将来可观察的数据。如果我在您的团队中,我将挑战您以实验数据支持该假设。

实际上,有许多专门用于处理少数群体失衡的方法。例如SMOTEADASYN。我会向您指出imbalanced learn的python软件包,该软件包在sklearn框架内实现了这些技术和其他技术。