首页 > 解决方案 > sklearn RandomForestClassifier 的 class_weights 似乎没有效果

问题描述

我正在尝试使用 sklearn 的 RandomForestClassifier 将数据集分为两类。训练数据高度不平衡,大约有 100,000 个样本在“假”类中,10,000 个在“真”类中。在此数据上拟合模型产生的测试集准确率在“假”类上约为 97%,而在“真”类上仅为 78%。我尝试将“False”类下采样到与“True”类相同的大小,这导致两个类的测试准确率都在 88% 左右。不过,我对丢弃大约 90,000 个观察结果感到很遗憾,我想知道如果减少平衡问题是否可以获得更高的准确度。这导致我尝试将 RandomForestClassifier 的 class_weights 参数更改为“平衡”并适合原始数据集。

model = RandomForestClassifier(n_estimators=100, class_weight='balanced')
model.fit(X_train, y_train)
y_pred_test = model.predict(X_test)
confusion = metrics.confusion_matrix(y_test, y_pred_test)
print("False Accuracy: ", confusion[0, 0] / confusion[:, 0].sum(), "True Accuracy: ", confusion[1, 1] / confusion[:, 1].sum())

奇怪的是,这种变化完全没有效果。我尝试手动设置为 class_weight={True:1000000, False:1} ,这同样没有效果。反转以前的权重也是如此。我能得到效果的唯一方法是将其中一个权重设置为零,这破坏了一切。

我的理解是调整 class_weight 将调整选择最佳分割的函数,使其有利于准确分类具有较高权重的类。基于这种理解,我认为将其中一个权重设置得非常高会使模型始终预测该类,但这对我来说并没有发生。有谁知道我可能做错了什么?

标签: pythonmachine-learningscikit-learnrandom-forest

解决方案


推荐阅读