我有一个数据高度不平衡的多类问题。
他们是一个有几千名成员的多数阶级,有些阶级有100-1000名成员,10-30个阶级只有一名成员。
采样是不可能的,因为它可能导致类的权重错误。
为了评估我的模型,我想使用交叉验证。我尝试了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_matrix
和classRepo
的每个位置,并亲自查看。
有没有一个更优雅的解决方案,比如手工融合classRepo
和cnf_matrix
,这样我就可以得到与cross_val_predict(x,y, cv=x)
相同的结果?
有没有更好的指标来解决我的问题?
"采样是不可能的,因为它可能导致类的权重错误。">
这是一个强有力的断言,因为你假设你的训练数据是所有剩余数据的完美表示,是未来可观察的数据。如果我是你们团队的一员,我会挑战你们用实验数据来支持这一假设。
事实上,有许多方法是专门为解决少数群体阶级失衡而制定的。例如SMOTE和ADASYN。我将向您介绍一个python包的不平衡学习,该包在sklearn框架内实现了这些和其他技术。