python - 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 将调整选择最佳分割的函数,使其有利于准确分类具有较高权重的类。基于这种理解,我认为将其中一个权重设置得非常高会使模型始终预测该类,但这对我来说并没有发生。有谁知道我可能做错了什么?
解决方案
推荐阅读
- angular - AAD身份验证后Angular 6重定向到实际组件而不是主页
- cmake - cmake_parse_arguments 存储空字符串
- react-native - 将世博会相机胶卷图像上传到服务器
- javascript - 将数组内的对象值显示为 HTML
- prestashop - Db::getInstance()->insert() 没有显示错误,不起作用
- python - 如何在python中的iterrows中找到列中的平均值
- flutter - 在脚手架主体中显示 TabBar
- javascript - 如何定位 DataTables 导出按钮组?
- java - 无法解析配置“:pushwoosh-react-native-plugin:classpath”的所有工件
- azure - 如何在 SonarQube 中重用项目