sklearn SGDClassifier 模型阈值与模型分数有何关系?

Posted

技术标签:

【中文标题】sklearn SGDClassifier 模型阈值与模型分数有何关系?【英文标题】:How do sklearn SGDClassifier model thresholds relate to model scores? 【发布时间】:2017-05-01 12:17:47 【问题描述】:

我已经训练了一个模型并确定了一个我想在其中部署它的“阈值”,但我无法理解阈值与分数的关系。

X = labeled_data[features].reset_index(drop=True)
Y = np.array(labeled_data['fraud'].reset_index(drop=True))

# (train/test etc.. settle on an acceptable model)

grad_des = SGDClassifier(alpha=alpha_optimum, l1_ratio=l1_optimum, loss='log')
grad_des.fit(X, Y)

score_Y = grad_des.predict_proba(X)
precision, recall, thresholds = precision_recall_curve(Y, score_Y[:,1])

好的,所以现在我绘制精度和召回率与阈值的关系,并决定我希望我的阈值是 0.4

什么是门槛?

我的模型系数,据我所知是通过计算 coefficients['x']*event_values['x'] 对事件进行“评分”,总和为 29。阈值介于 0 和 1 之间。

我如何理解从阈值到什么的翻译,我猜是原始分数?对于所有特征(都是二元的)具有1 的事件,计算得分是否为 29,因为这是所有系数的总和?

我是否需要为所有事件计算这个“原始”分数指标,然后根据精度而不是阈值绘制它?

编辑和更新:

因此,正如 Mikhail Korobov 在下面指出的那样,我的问题在于对逻辑功能缺乏了解。无论“原始分数”如何,逻辑函数都会强制 [0, 1] 范围内的值。

为了将该值“解包”回我正在寻找的“原始分数”,我可以执行scipy.special.logit(0.8) - grad_des.intercept_,这将返回该行的“分数”。

【问题讨论】:

this answer 有帮助吗? 【参考方案1】:

    概率不只是 coefficients['x']*event_values['x'] - logistic function 应用于这些分数以获得 [0, 1] 范围内的概率值。

    predict_proba 方法返回这些概率;它们在 [0, 1] 范围内。

    要获得具体的是/否预测,必须选择一个概率阈值。一个明显而理智的方法是使用 0.5:如果概率大于 0.5,则预测“yep”,否则预测“nope”。这就是.predict() 方法的作用。

    precision_recall_curve 尝试不同的概率阈值并为它们计算精度和召回率。如果基于精度和召回分数,您认为其他阈值更适合您的应用程序,您可以使用它而不是 0.5,例如bool_prediction = score_Y[:,1] > threshold

【讨论】:

是否有一个参数可以扩展 .predict_proba 以用作具有设定阈值的布尔分类器?正如您所建议的那样,我将 .predict_proba 与包装器一起使用,但我更愿意使用阈值腌制模型,而不是稍后将其传递。 不,没有这样的论点。如果你想腌制阈值,那么你总是可以创建一个包装类并腌制它。

以上是关于sklearn SGDClassifier 模型阈值与模型分数有何关系?的主要内容,如果未能解决你的问题,请参考以下文章

sklearn中的SGDClassifier

sklearn 使用SGDClassifier 使用 kerasMNIST数据集 进行图片二分类

Sklearn SGDClassifier 部分拟合

sklearn SGDClassifier,当没有匹配时产生标签?

Scikit-learn——LogisticRegression与SGDClassifier

grid-search建模过程中自动调优