如何提高随机森林多类分类模型的准确率?
Posted
技术标签:
【中文标题】如何提高随机森林多类分类模型的准确率?【英文标题】:How to improve accuracy of random forest multiclass classification model? 【发布时间】:2019-05-07 04:05:29 【问题描述】:我正在研究多类别分类,以便根据客户的购买行为和人口统计数据将客户分为 3 个不同的类别。我无法完全披露数据集,但总的来说它包含大约 300 个特征和 50000 行。我尝试了以下方法,但无法达到 50% 以上的准确率:
-
调整超参数(我在执行 GridSearchCV 后使用调整后的超参数)
规范化数据集,然后运行我的模型
尝试了不同的分类方法:OneVsRestClassifier、RandomForestClassification、SVM、KNN 和 LDA
我还删除了不相关的功能并尝试运行我的模型
我的类不平衡,因此我也尝试使用 class_weight = 平衡、使用 SMOTE 进行过采样、下采样和重采样。
还有什么我可以尝试提高我的准确度(准确度是指 f 分数、精度和召回率)。
任何帮助将不胜感激。
【问题讨论】:
不同的机器学习算法需要不同的数据预处理。随机森林非常简单,不需要对特征进行缩放或归一化。你玩过n_estimators
、max_features
和min_samples_leaf
吗?
是的,我在调整超参数时做过。我还做了一个 GridSearchCV 来确定最佳参数。
我不得不承认我更喜欢用困难的方式进行网格搜索(丑陋的 for 循环)并保存我获得的分数。通过这种方式,我可以轻松检查我是否真正收敛到全局最小值,或者是否需要扩展搜索范围。您应该考虑的另一个想法是对您的数据执行 PCA。随机森林不喜欢特征之间的相关性,因为单个树不独立于另一个
我也尝试过丑陋的 for 循环。手动检查每个超参数。我会尝试做 PCA 并检查是否有变化。
希望解决方案有所帮助
【参考方案1】:
您的培训情况如何?我假设您的 acc 是您的验证。如果您的训练速度过高,则可能是正常的过度拟合。随机森林通常可以很好地处理过度拟合。
您可以尝试对数据进行 PCA,然后尝试对其进行分类。这为您提供了解释数据中大部分变化的特征,因此如果您无法对原始数据进行分类(并且它也会减少您的特征),那么尝试一下是个好主意。
附注:请记住,SVM 的拟合在点数上是二次的,因此将您的数据减少到 10-20000 左右以调整参数,然后在完整数据集上拟合 SVM,并为子集提供最佳参数,也可能加快进程。 还记得考虑为 SVM 尝试不同的内核。
【讨论】:
我的模型没有过拟合。在所有情况下,我的训练准确率约为 60-70% 但您应该明确使用 PCA。如果特征相互关联,300 个特征对于 RF 来说可能太多了。 我同意尝试 PCA 看看是否有帮助【参考方案2】:尝试先使用 PCA 或随机森林进行特征选择,然后拟合链式分类器,其中首先进行 oneversesall,然后是随机森林或决策树。你应该得到一个稍微好一点的准确度。
【讨论】:
【参考方案3】:尝试调整以下参数
n_estimators
这是在进行最大投票或预测平均值之前您要构建的树数。更多的树可以为您提供更好的性能,但会使您的代码变慢。您应该选择处理器可以处理的尽可能高的值,因为这会使您的预测更加强大和稳定。由于您的数据量较大,因此每次迭代需要更多时间,但请尝试此操作。
最大特征
这些是随机森林允许在单个树中尝试的最大特征数。 Python 中有多个选项可用于分配最大功能。其中很少有:
自动/无:这将简单地采用所有有意义的功能 在每一棵树中。这里我们根本不对 一棵树。
sqrt :此选项将取总数量的平方根 个人运行中的功能。例如,如果总人数 变量是 100,我们只能单独取其中的 10 个 树。“log2”是 max_features 的另一种类似类型的选项。
0.2 :此选项允许随机森林在单个运行中采用 20% 的变量。我们可以用“0.x”格式赋值和赋值 想要考虑 x% 的特征。
min_sample_leaf
叶子是决策树的结束节点。较小的叶子使模型更容易捕获训练数据中的噪声。您可以从一些最小值(例如 75)开始,然后逐渐增加它。看看你的准确率是什么值。
【讨论】:
以上是关于如何提高随机森林多类分类模型的准确率?的主要内容,如果未能解决你的问题,请参考以下文章