我遇到了数据高度不平衡的多类问题。
他们是一类具有数千名成员的多数类,有些是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_matrix
和classRepo
的每个位置,然后自己进行检查。
是否有更优雅的解决方案,例如手动融合classRepo
和cnf_matrix
,以便获得与cross_val_predict(x,y, cv=x)
相同的结果?
是否有更好的指标来解决我的问题?
答案 0 :(得分:1)
“不可能进行采样,因为它可能导致错误的类权重。”
这是一个强有力的断言,因为您假设训练数据可以完美表示所有剩余的,将来可观察的数据。如果我在您的团队中,我将挑战您以实验数据支持该假设。
实际上,有许多专门用于处理少数群体失衡的方法。例如SMOTE和ADASYN。我会向您指出imbalanced learn的python软件包,该软件包在sklearn框架内实现了这些技术和其他技术。