绍兴网站建设专业的公司,红酒 网站 模板,wordpress+标签消失,运城市盐湖区姚孟精诚网站开发中心摘要#xff1a; 本文的主要目标是处理数据不平衡问题。文中描述了用来克服数据不平衡问题的三种技术#xff0c;分别是集成交叉验证、类别权重以及过大预测 。对于深度学习而言#xff0c;数据集非常重要#xff0c;但在实际项目中#xff0c;或多或少会碰见数据不平衡问…摘要 本文的主要目标是处理数据不平衡问题。文中描述了用来克服数据不平衡问题的三种技术分别是集成交叉验证、类别权重以及过大预测 。对于深度学习而言数据集非常重要但在实际项目中或多或少会碰见数据不平衡问题。什么是数据不平衡呢举例来说现在有一个任务是判断西瓜是否成熟这是一个二分类问题——西瓜是生的还是熟的该任务的数据集由两部分数据组成成熟西瓜与生西瓜假设生西瓜的样本数量远远大于成熟西瓜样本的数量针对这样的数据集训练出来的算法“偏向”于识别新样本为生西瓜存心让你买不到甜的西瓜以解夏天之苦这就是一个数据不平衡问题。针对数据不平衡问题有相应的处理办法比如对多数样本进行采样使得其样本数量级与少样本数相近或者是对少数样本重复使用等。最近恰好在面试中遇到一个数据不平衡问题这也是面试中经常会出现的问题之一现向读者分享此次解决问题的心得。数据集 训练数据中有三个标签分别标记为[1、2、3]这意味着该问题是一个多分类问题。训练数据集有17个特征以及38829个独立数据点。而在测试数据中有16个没有标签的特征和16641个数据点。该训练数据集非常不平衡大部分数据是1类95而2类和3类分别有3.0和0.87的数据如下图所示。算法 经过初步观察决定采用随机森林RF算法因为它优于支持向量机、Xgboost以及LightGBM算法。在这个项目中选择RF还有几个原因1机森林对过拟合具有很强的鲁棒性2.参数化仍然非常直观3.在这个项目中有许多成功的用例将随机森林算法用于高度不平衡的数据集4.个人有先前的算法实施经验 为了找到最佳参数使用scikit-sklearn实现的GridSearchCV对指定的参数值执行网格搜索更多细节可以在本人的Github上找到。为了处理数据不平衡问题使用了以下三种技术A.使用集成交叉验证CV 在这个项目中使用交叉验证来验证模型的鲁棒性。整个数据集被分成五个子集。在每个交叉验证中使用其中的四个子集用于训练剩余的子集用于验证模型此外模型还对测试数据进行了预测。在交叉验证结束时会得到五个测试预测概率。最后对所有类别的概率取平均值。模型的训练表现稳定每个交叉验证上具有稳定的召回率和f1分数。这项技术也帮助我在Kaggle比赛中取得了很好的成绩前1%。以下部分代码片段显示了集成交叉验证的实现for j, (train_idx, valid_idx) in enumerate(folds):X_train X[train_idx]Y_train y[train_idx]X_valid X[valid_idx]Y_valid y[valid_idx]clf.fit(X_train, Y_train)valid_pred clf.predict(X_valid)recall recall_score(Y_valid, valid_pred, averagemacro)f1 f1_score(Y_valid, valid_pred, averagemacro)recall_scores[i][j] recallf1_scores[i][j] f1train_pred[valid_idx, i] valid_predtest_pred[:, test_col] clf.predict(T)test_col 1## Probabilitiesvalid_proba clf.predict_proba(X_valid)train_proba[valid_idx, :] valid_probatest_proba clf.predict_proba(T)test_proba / self.n_splits
B.设置类别权重/重要性 代价敏感学习是使随机森林更适合从非常不平衡的数据中学习的方法之一。随机森林有倾向于偏向大多数类别。因此对少数群体错误分类施加昂贵的惩罚可能是有作用的。由于这种技术可以改善模型性能所以我给少数群体分配了很高的权重即更高的错误分类成本。然后将类别权重合并到随机森林算法中。我根据类别1中数据集的数量与其它数据集的数量之间的比率来确定类别权重。例如类别1和类别3数据集的数目之间的比率约为110而类别1和类别2的比例约为26。现在我稍微对数量进行修改以改善模型的性能以下代码片段显示了不同类权重的实现from sklearn.ensemble import RandomForestClassifier
class_weight dict({1:1.9, 2:35, 3:180})rdf RandomForestClassifier(bootstrapTrue,class_weightclass_weight, criteriongini,max_depth8, max_featuresauto, max_leaf_nodesNone,min_impurity_decrease0.0, min_impurity_splitNone,min_samples_leaf4, min_samples_split10,min_weight_fraction_leaf0.0, n_estimators300,oob_scoreFalse,random_staterandom_state,verbose0, warm_startFalse)C.过大预测标签而不是过小预测Over-Predict a Label than Under-Predict 这项技术是可选的通过实践发现这种方法对提高少数类别的表现非常有效。简而言之如果将模型错误分类为类别3则该技术能最大限度地惩罚该模型对于类别2和类别1惩罚力度稍差一些。 为了实施该方法我改变了每个类别的概率阈值将类别3、类别2和类别1的概率设置为递增顺序即P3 0.25P2 0.35P1 0.50以便模型被迫过度预测类别。该算法的详细实现可以在Github上找到。最终结果 以下结果表明上述三种技术如何帮助改善模型性能1.使用集成交叉验证的结果2.使用集成交叉验证类别权重的结果3.使用集成交叉验证类别权重过大预测标签的结果结论 由于在实施过大预测技术方面的经验很少因此最初的时候处理起来非常棘手。但是研究该问题有助于提升我解决问题的能力。对于每个任务而言起初可能确实是陌生的这个时候不要害怕一次次尝试就好。由于时间的限制48小时无法将精力分散于模型的微调以及特征工程存在改进的地方还有很多比如删除不必要的功能并添加一些额外功能。此外也尝试过LightGBM和XgBoost算法但在实践过程中发现随机森林的效果优于这两个算法。在后面的研究中可以进一步尝试一些其他算法比如神经网络、稀疏编码等。原文链接本文为云栖社区原创内容未经允许不得转载。