如何在相当平衡的二元分类中解决非常高的误报率?
Posted
技术标签:
【中文标题】如何在相当平衡的二元分类中解决非常高的误报率?【英文标题】:How to fix a very high false negative rate in fairly balanced binary classification? 【发布时间】:2020-06-24 16:14:21 【问题描述】:我有一个项目要求根据大约 52 个特征和 2000 行数据对员工是否会离开公司进行二元分类。数据与 1200 neg 到 800 pos 有点平衡。我已经完成了广泛的 EDA 和数据清理。我选择从 sklearn、对数回归、SVM 和随机森林中尝试几种不同的模型。我从他们所有人那里得到了非常糟糕和相似的结果。这次运行我只使用了 52 个功能中的 15 个,但结果与我使用所有 52 个功能时的结果几乎相同。在 52 个特征中,有 6 个是分类的,我将其转换为虚拟对象(每个特征 3-6 个类别之间),3 个是我转换为 days-since-epoch 的日期时间。没有要填充的空值。
这是我最近使用随机森林运行的代码和混淆矩阵。
x_train, x_test, y_train, y_test = train_test_split(small_features, endreason, test_size=0.2, random_state=0)
RF = RandomForestClassifier(bootstrap = True,
max_features = 'sqrt',
random_state=0)
RF.fit(x_train, y_train)
RF.predict(x_test)
cm = confusion_matrix(y_test, rf_predictions)
plot_confusion_matrix(cm, classes = ['Negative', 'Positive'],
title = 'Confusion Matrix')
我可以采取哪些步骤来帮助更好地适应此模型?
【问题讨论】:
好像没有微调。您是否也尝试过一些更复杂的方法,例如 LightGBM 或 XGBoost? @CeliusStingher -- 你会建议什么样的微调?我尝试设置一些超参数无济于事,但也许您可以提出一些建议。不,我还没有尝试过这两种方法,我现在就这样做! 【参考方案1】:对于您提出的方法和您描述的数据的平衡,您展示的结果显然有点令人沮丧。但是,从问题的描述来看,确实有很大的改进空间。
当您使用train_test_split
时,请确保您传递stratify=endreason
以确保在拆分数据集时标签没有问题。继续讨论有助于改进模型的要点:
首先,降维:由于您要处理许多特征,其中一些可能无用,甚至会污染您要解决的分类问题。考虑为您的数据拟合不同的dimension reduction 技术并使用此拟合数据来提供您的模型非常重要。一些可能值得尝试的常见方法:
PCA(主成分分析) 低方差和相关过滤器 随机森林特征重要性其次理解模型:虽然逻辑回归可能被证明是线性分类器的优秀基线,但它可能不一定是您完成这项任务所需要的。 随机森林在捕捉非线性关系时似乎要好得多,但需要控制和修剪以避免过度拟合,并且可能需要大量数据。另一方面,SVM 是一种非常强大的非线性内核方法,但在处理大量数据时可能效率低下。 XGBoost 和 LightGBM 是非常强大的梯度提升算法,赢得了多个 kaggle 比赛并且几乎在所有情况下都运行良好,当然需要一些预处理作为 XGBoost 没有准备好使用分类特征(LightGBM 是)。我的建议是尝试这最后两种方法。从最坏到最后(在一般情况下)我会列出:
LightGBM / XGBoost RandomForest / SVM / Logistic 回归最后但同样重要的是超参数调整:无论您选择哪种方法,总会有一些微调需要进行。 Sklearn 提供了非常方便的 gridsearch。但是,您需要了解分类器的行为方式才能知道您应该寻找什么。我不会对此进行深入探讨,因为它会离题且不适合 SO,但您绝对可以阅读 here
【讨论】:
以上是关于如何在相当平衡的二元分类中解决非常高的误报率?的主要内容,如果未能解决你的问题,请参考以下文章