python - 如何在相当平衡的二元分类中解决非常高的误报率?
问题描述
我有一个项目要求根据大约 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')
我可以采取哪些步骤来帮助更好地适应这个模型?
解决方案
对于您提出的方法和您描述的数据的平衡,您所展示的结果显然有点令人沮丧。但是,从问题的描述来看,确实有很大的改进空间。
当您使用时,请train_test_split
确保您通过stratify=endreason
以确保在拆分数据集时没有关于标签的问题。继续讨论有助于改进模型的要点:
首先,降维:由于您要处理许多特征,其中一些可能是无用的,甚至会污染您要解决的分类问题。考虑为您的数据拟合不同的降维技术并使用这些拟合数据来为您的模型提供数据非常重要。一些可能值得尝试的常见方法:
- PCA(主成分分析)
- 低方差和相关滤波器
- 随机森林特征重要性
其次理解模型:虽然逻辑回归可能被证明是线性分类器的优秀基线,但它可能不一定是您完成这项任务所需要的。在捕获非线性关系时,随机森林似乎要好得多,但需要控制和修剪以避免过度拟合,并且可能需要大量数据。另一方面,SVM是一种非常强大的非线性内核方法,但在处理大量数据时可能效率低下。XGBoost和LightGBM是非常强大的梯度提升算法,已经赢得了多个 kaggle 比赛并且几乎在每种情况下都运行良好,当然需要进行一些预处理,因为XGBoost还没有准备好使用分类特征(LightGBM)。我的建议是尝试这最后两种方法。从更糟到最后(在一般情况下)我会列出:
- LightGBM / XGBoost
- RandomForest / SVM / Logistic 回归
最后但并非最不重要的超参数调整:无论您选择哪种方法,总会有一些微调需要完成。Sklearn提供了非常方便的网格搜索。但是,您需要了解分类器的行为方式才能知道您应该寻找什么。我不会对此进行深入探讨,因为它会离题且不适合 SO,但您绝对可以在这里阅读
推荐阅读
- c++ - 用动态规划找到最长的卡片序列
- r - R:可变长度不同
- c# - 如何在不等待的情况下在后台启动 Redis 连接
- android - Android PaymentsClient.isReadyToPay 中的 Google Pay 返回 false
- javascript - 如何防止在 Windows 10 中更改音量时显示 YouTube 视频名称。[YouTube IFrame Api]
- sql - 索引是否有助于 sql 选择排序性能?
- bash - 从表中提取值小于和大于shell中列的行
- amazon-s3 - 安装 Ambari,无法从 amazon S3 下载 hortonworks HDP
- vue.js - 是否可以为客户端渲染的 Quasar 应用程序加载动态元标记?
- python - 如何编写光栅图?