- mongodb - 在 MongoDB mapreduce 中,如何展平值对象?
- javascript - 对象传播与 Object.assign
- html - 输入类型 ="submit"Vs 按钮标签它们可以互换吗?
- sql - 使用 MongoDB 而不是 MS SQL Server 的优缺点
我在理解 scikit-learn 的逻辑回归中的 class_weight
参数如何运作时遇到了很多麻烦。
情况
我想使用逻辑回归对非常不平衡的数据集进行二元分类。类别标记为 0(阴性)和 1(阳性),观察数据的比例约为 19:1,大多数样本的结果为阴性。
第一次尝试:手动准备训练数据
我将拥有的数据拆分为不相交的数据集以进行训练和测试(大约 80/20)。然后我手动对训练数据进行随机抽样,得到不同比例的训练数据,而不是 19:1;从 2:1 -> 16:1。
然后,我对这些不同的训练数据子集进行逻辑回归训练,并将召回率 (= TP/(TP+FN)) 绘制为不同训练比例的函数。当然,召回是在不相交的 TEST 样本上计算的,这些样本的观察比例为 19:1。请注意,虽然我在不同的训练数据上训练了不同的模型,但我在相同(不相交的)测试数据上计算了所有模型的召回率。
结果与预期一致:在 2:1 的训练比例下,召回率约为 60%,并且在达到 16:1 时下降得相当快。有几个比例为 2:1 -> 6:1,召回率远高于 5%。
第二次尝试:网格搜索
接下来,我想测试不同的正则化参数,因此我使用了 GridSearchCV 并制作了一个由 C
参数和 class_weight
参数的多个值组成的网格。要将我的 n:m 比例的负:正训练样本翻译成 class_weight
的字典语言,我认为我只是指定了几个字典,如下所示:
{ 0:0.67, 1:0.33 } #expected 2:1
{ 0:0.75, 1:0.25 } #expected 3:1
{ 0:0.8, 1:0.2 } #expected 4:1
我还包括了 None
和 auto
。
这一次的结果完全出乎意料。除了 auto
之外,对于 class_weight
的每个值,我所有的记忆都很少(< 0.05)。所以我只能假设我对如何设置 class_weight
字典的理解是错误的。有趣的是,对于 C
的所有值,网格搜索中 'auto' 的 class_weight
值约为 59%,我猜它平衡到 1:1?
我的问题
您如何正确使用 class_weight
来实现训练数据与实际提供的数据不同的平衡?具体来说,我应该将什么字典传递给 class_weight
以使用 n:m 比例的负:正训练样本?
如果您将各种 class_weight
字典传递给 GridSearchCV,在交叉验证期间,它将根据字典重新平衡训练折叠数据,但使用真实给定的样本比例来计算我的评分函数测试折叠?这一点很关键,因为任何指标只有在来自观察到的比例数据时才对我有用。
就比例而言,class_weight
的 auto
值有什么作用?我阅读了文档,我假设“平衡数据与它们的频率成反比”只是意味着它是 1:1。这个对吗?如果不是,有人可以澄清一下吗?
最佳答案
首先,仅凭记忆可能不太好。您可以通过将所有内容归类为正类来简单地实现 100% 的召回率。我通常建议使用 AUC 来选择参数,然后找到您感兴趣的操作点(比如给定的精度水平)的阈值。
关于 class_weight
的工作原理:它用 class_weight[i]
而不是 1 来惩罚 class[i]
样本中的错误。所以更高class-weight 意味着你想更加强调一个类。从您所说的看来,0 类的频率似乎是 1 类的 19 倍。因此,您应该相对于 0 类增加 1 类的 class_weight
,例如 {0:.1, 1:.9} .如果class_weight
总和不为1,则基本上会改变正则化参数。
class_weight="auto"
的工作原理,你可以看看this discussion .在开发版本中,您可以使用 class_weight="balanced"
,这更容易理解:它基本上意味着复制较小的类,直到您拥有与较大类中一样多的样本,但以隐式方式.
关于python - scikit-learn 中的 class_weight 参数是如何工作的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30972029/
来自文档: sklearn.preprocessing.MinMaxScaler.min_ : ndarray, shape (n_features,) Per feature adjustment
这是我的数据:(我重置了索引。日期应该是索引) Date A B C D 0 2013-10-07 -0.002
我正在构建一个分类器,通过贷款俱乐部数据,选择最好的 X 笔贷款。我训练了一个随机森林,并创建了通常的 ROC 曲线、混淆矩阵等。 混淆矩阵将分类器的预测(森林中树木的多数预测)作为参数。但是,我希望
是否有类似于 的 scikit-learn 方法/类元成本 在 Weka 或其他实用程序中实现的算法以执行常量敏感分析? 最佳答案 不,没有。部分分类器提供 class_weight和 sample_
我发现使用相同数据的两种交叉验证技术之间的分类性能存在差异。我想知道是否有人可以阐明这一点。 方法一:cross_validation.train_test_split 方法 2:分层折叠。 具有相同
我正在查看 scikit-learn 文档中的这个示例:http://scikit-learn.org/0.18/auto_examples/model_selection/plot_nested_c
我想训练一个具有很多标称属性的数据集。我从一些帖子中注意到,要转换标称属性必须将它们转换为重复的二进制特征。另外据我所知,这样做在概念上会使数据集稀疏。我也知道 scikit-learn 使用稀疏矩阵
我正在尝试在 scikit-learn (sklearn.feature_selection.SelectKBest) 中通过卡方方法进行特征选择。当我尝试将其应用于多标签问题时,我收到此警告: 用户
有几种算法可以构建决策树,例如 CART(分类和回归树)、ID3(迭代二分法 3)等 scikit-learn 默认使用哪种决策树算法? 当我查看一些决策树 python 脚本时,它神奇地生成了带有
我正在尝试在 scikit-learn (sklearn.feature_selection.SelectKBest) 中通过卡方方法进行特征选择。当我尝试将其应用于多标签问题时,我收到此警告: 用户
有几种算法可以构建决策树,例如 CART(分类和回归树)、ID3(迭代二分法 3)等 scikit-learn 默认使用哪种决策树算法? 当我查看一些决策树 python 脚本时,它神奇地生成了带有
有没有办法让 scikit-learn 中的 fit 方法有一个进度条? 是否可以包含自定义的类似 Pyprind 的内容? ? 最佳答案 如果您使用 verbose=1 初始化模型调用前 fit你应
我正在尝试使用 grisSearchCV 在 scikit-learn 中拟合一些模型,并且我想使用“一个标准错误”规则来选择最佳模型,即从分数在 1 以内的模型子集中选择最简约的模型最好成绩的标准误
我有一个预定义的决策树,它是根据基于知识的拆分构建的,我想用它来进行预测。我可以尝试从头开始实现决策树分类器,但那样我就无法在 Scikit 函数中使用 predict 等内置函数。有没有办法将我的树
我正在使用随机森林解决分类问题。为此,我决定使用 Python 库 scikit-learn。但我对随机森林算法和这个工具都很陌生。我的数据包含许多因子变量。我用谷歌搜索,发现像我们在线性回归中所做的
我使用 Keras 回归器对数据进行回归拟合。我使用 Scikit-learn wrapper 和 Pipeline 来首先标准化数据,然后将其拟合到 Keras 回归器上。有点像这样: from s
在 scikit-learn ,有一个 的概念评分函数 .如果我们有一些预测标签和真实标签,我们可以通过调用 scoring(y_true, y_predict) 来获得分数。 .这种评分函数的一个例
我知道 train_test_split 方法将数据集拆分为随机训练和测试子集。并且使用 random_state=int 可以确保每次调用该方法时我们对该数据集都有相同的拆分。 我的问题略有不同。
我正在使用 scikit-learn 0.18.dev0。我知道之前有人问过完全相同的问题 here .我尝试了那里提供的答案,但出现以下错误 >>> def mydist(x, y): ...
我试图在 scikit-learn 中结合递归特征消除和网格搜索。正如您从下面的代码(有效)中看到的那样,我能够从网格搜索中获得最佳估计量,然后将该估计量传递给 RFECV。但是,我宁愿先进行 RFE
我是一名优秀的程序员,十分优秀!