我正在尝试在非常不平衡的数据集上使用LightGBM建立分类器。不平衡率97:3
,即:
Class
0 0.970691
1 0.029309
我使用的参数和训练代码如下所示。
lgb_params = {
'boosting_type': 'gbdt',
'objective': 'binary',
'metric':'auc',
'learning_rate': 0.1,
'is_unbalance': 'true', #because training data is unbalance (replaced with scale_pos_weight)
'num_leaves': 31, # we should let it be smaller than 2^(max_depth)
'max_depth': 6, # -1 means no limit
'subsample' : 0.78
}
# Cross-validate
cv_results = lgb.cv(lgb_params, dtrain, num_boost_round=1500, nfold=10,
verbose_eval=10, early_stopping_rounds=40)
nround = cv_results['auc-mean'].index(np.max(cv_results['auc-mean']))
print(nround)
model = lgb.train(lgb_params, dtrain, num_boost_round=nround)
preds = model.predict(test_feats)
preds = [1 if x >= 0.5 else 0 for x in preds]
我运行简历来获得最好的模型和最好的回合。我的简历获得了0.994 AUC,并且在验证集中获得了类似的分数。
但是,当我在测试集上进行预测时,我得到的结果非常糟糕。我相信火车是完美采样的。
需要调整哪些参数?问题的原因是什么?我是否应该对数据集重新采样以减少最高等级?
问题是,尽管数据集中的极端类别失衡,但在确定最终硬分类时仍使用0.5的“默认”阈值
preds = [1 if x >= 0.5 else 0 for x in preds]
这里 不是 这种情况。
这是一个相当大的主题,我强烈建议您进行自己的研究(尝试使用谷歌搜索 阈值 或 切断概率不平衡的数据 ),但是以下是一些帮助您入门的指针…
从交叉验证的相关答案中(添加了重点):
不要忘记,您应该 明智
地进行预测。当模型概率大于0.5时,并不总是最好预测1。另一个阈值可能会更好。为此,您应该查看分类器的接收器工作特征(ROC)曲线,而不仅仅是其具有默认概率阈值的预测成功。
从相关的学术论文中,找到失衡分类的最佳分类阈值:
2.2。 如何设置测试集的分类阈值
最终根据预测概率确定预测结果。该阈值通常设置为0.5。如果预测概率超过0.5,则预测样本为正;否则,样本为正。否则为负面。但是,0.5在某些情况下并不理想,特别是对于不平衡的数据集。
从以上所有内容中吸取教训:AUC很少,但是ROC 曲线 本身通常是您最好的朋友…
在更一般的层面上,关于阈值本身在分类过程中的作用(至少根据我的经验,很多从业者会犯错),还请在交叉验证时检查分类概率阈值线程(和提供的链接);关键点:
当您为新样本的每个类别输出概率时,练习的统计部分结束。选择一个阈值,将新观察值分类为1 vs. 0不再是 统计信息的 一部分。它是 决策
组件的一部分。
我有一些机器学习的结果,我正试图弄明白。任务是预测/标记“爱尔兰人”与“非爱尔兰人”。Python 2.7的输出: 如您所见,准确率和召回率一般,但AUC-ROC较高(~0.90)。我试图找出原因,我怀疑这是由于数据不平衡(大约1:5)。基于混淆矩阵,并使用Irish作为目标(),我计算了TPR=0.51和FPR=0.04。如果我将非爱尔兰人视为(),那么TPR=0.96,FPR=0.49。那么,
本文向大家介绍数据不平衡怎么办?相关面试题,主要包含被问及数据不平衡怎么办?时的应答技巧和注意事项,需要的朋友参考一下 参考回答: 使用正确的评估标准,当数据不平衡时可以采用精度,调用度,F1得分,MCC,AUC等评估指标。 重新采样数据集,如欠采样和过采样。欠采样通过减少冗余类的大小来平衡数据集。当数据量不足时采用过采样,尝试通过增加稀有样本的数量来平衡数据集,通过使用重复,自举,SMOTE等方
问题内容: 我有2个文档,并且正在搜索关键字“ Twitter”。假设两个文档都是带有“标签”字段的博客文章。 文档A在“标签”字段中只有1个术语,即“ Twitter”。文档B在“标签”字段中有100个术语,但其中3个是“ Twitter”。 即使文档B的出现频率较高,“elasticsearch”也会给文档A更高的分数。但是该分数是“稀释的”,因为它具有更多的术语。由于文档B的搜索词频率较高,
比较函数是一个函数,它接受两个参数a和b,并返回一个描述其顺序的整数。如果a小于b,则结果为负整数。如果a大于b,则结果为某个正整数。否则,a和b相等,结果为零。 此函数通常用于参数化来自标准库的排序和搜索算法。 实现字符的比较功能相当容易;只需减去参数: 这是因为通常假设两个字符之间的差适合一个整数。(注意,此假设不适用于的系统) 这种技巧无法用于比较整数,因为两个整数之间的差通常不适合一个整数
问题内容: 我需要猜一个数字。我只能看到我建议的数字是较低还是较高。性能非常重要,因此我想到了以下算法: 假设我要猜测的数字是600。 我从数字1000开始(或者为了获得更高的性能,它是先前数字的平均结果)。 然后,我检查1000是否高于或低于600。 然后,我将数字除以2(现在是500),并检查它是否小于或大于600。它是否小于600。 然后,找到差异并将其除以2,以以下方式检索新的数字:(10
如果在AVL树中插入一个节点,则可能会发生new_node路径中的一个节点将失去高度平衡的情况。但是我的问题是,如果这个节点是固定的,那么它上面的其他节点(祖先直到根)是否仍然会保持高度不平衡(以防他们之前失去平衡)。 我做了一些书面工作,可以观察到这种情况是不可能的。一旦高度不平衡被固定在一个节点上,它的所有祖先都应该被自动固定(如果它们受到影响)。