.. currentmodule:: sklearn.model_selection .. _TunedThresholdClassifierCV: ================================================== 调整分类预测的决ç–阈值 ================================================== 分类问题最好分为两个部分: * 统计问题,å¦ä¹ 一个模型æ¥é¢„æµ‹ï¼Œç†æƒ³æƒ…况下是类概率; * 决ç–é—®é¢˜ï¼Œæ ¹æ®è¿™äº›æ¦‚率预测采å–具体行动。 让我们以一个与天气预报相关的简å•ä¾‹åæ¥è¯´æ˜Žï¼šç¬¬ä¸€ç‚¹æ¶‰åŠå›žç”“明天é™é›¨çš„æ¦‚率是多少?â€ï¼Œè€Œç¬¬äºŒç‚¹æ¶‰åŠå›žç”“我明天应该带伞å—?â€ã€‚ 在 scikit-learn API ä¸ï¼Œç¬¬ä¸€ç‚¹é€šè¿‡ä½¿ç”¨ :term:`predict_proba` 或 :term:`decision_function` æä¾›åˆ†æ•°æ¥è§£å†³ã€‚å‰è€…返回æ¯ä¸ªç±»çš„æ¡ä»¶æ¦‚çŽ‡ä¼°è®¡ :math:`P(y|X)` ,而åŽè€…返回æ¯ä¸ªç±»çš„决ç–分数。 ä¸Žæ ‡ç¾å¯¹åº”çš„å†³ç–æ˜¯é€šè¿‡ :term:`predict` 获得的。在二分类ä¸ï¼Œé€šè¿‡é˜ˆå€¼åŒ–分数æ¥å®šä¹‰å†³ç–规则或行动,从而为æ¯ä¸ªæ ·æœ¬é¢„测一个å•ä¸€çš„ç±»æ ‡ç¾ã€‚在 scikit-learn 的二分类ä¸ï¼Œç±»æ ‡ç¾é¢„测是通过硬编ç 的截æ¢è§„则获得的:当æ¡ä»¶æ¦‚率 :math:`P(y|X)` 大于 0.5(通过 :term:`predict_proba` 获得)或决ç–分数大于 0(通过 :term:`decision_function` 获得)时,预测为æ£ç±»ã€‚ 在这里,我们展示了一个示例,说明了æ¡ä»¶æ¦‚率估计 :math:`P(y|X)` ä¸Žç±»æ ‡ç¾ä¹‹é—´çš„关系:: >>> from sklearn.datasets import make_classification >>> from sklearn.tree import DecisionTreeClassifier >>> X, y = make_classification(random_state=0) >>> classifier = DecisionTreeClassifier(max_depth=2, random_state=0).fit(X, y) >>> classifier.predict_proba(X[:4]) array([[0.94 , 0.06 ], [0.94 , 0.06 ], [0.0416..., 0.9583...], [0.0416..., 0.9583...]]) >>> classifier.predict(X[:4]) array([0, 0, 1, 1]) 虽然这些硬编ç 规则在一开始作为默认行为å¯èƒ½çœ‹èµ·æ¥åˆç†ï¼Œä½†å®ƒä»¬ç»å¯¹ä¸æ˜¯å¤§å¤šæ•°ç”¨ä¾‹çš„ç†æƒ³é€‰æ‹©ã€‚è®©æˆ‘ä»¬ç”¨ä¸€ä¸ªä¾‹åæ¥è¯´æ˜Žã€‚ 考虑一个场景,一个预测模型被部署æ¥ååŠ©åŒ»ç”Ÿæ£€æµ‹è‚¿ç˜¤ã€‚åœ¨è¿™ç§æƒ…况下,医生最有å¯èƒ½å¯¹è¯†åˆ«æ‰€æœ‰æ‚£æœ‰ç™Œç—‡çš„æ‚£è€…å¹¶ä¸é”™è¿‡ä»»ä½•患有癌症的人感兴趣,以便他们å¯ä»¥ä¸ºä»–们æä¾›æ£ç¡®çš„æ²»ç–—。æ¢å¥è¯è¯´ï¼ŒåŒ»ç”Ÿä¼˜å…ˆè€ƒè™‘实现高å¬å›žçŽ‡ã€‚å½“ç„¶ï¼Œè¿™ç§å¯¹å¬å›žçš„强调伴éšç€å¯èƒ½æ›´å¤šçš„å‡é˜³æ€§é¢„测,从而é™ä½Žäº†æ¨¡åž‹çš„ç²¾ç¡®åº¦ã€‚è¿™æ˜¯ä¸€ä¸ªåŒ»ç”Ÿæ„¿æ„æ‰¿æ‹…çš„é£Žé™©ï¼Œå› ä¸ºé”™è¿‡ç™Œç—‡çš„æˆæœ¬è¿œé«˜äºŽè¿›ä¸€æ¥è¯Šæ–æµ‹è¯•çš„æˆæœ¬ã€‚å› æ¤ï¼Œåœ¨å†³å®šæ˜¯å¦å°†æ‚£è€…分类为患有癌症时,当æ¡ä»¶æ¦‚率估计远低于0.5时,将其分类为癌症阳性å¯èƒ½æ›´æœ‰ç›Šã€‚ 调整决ç–é˜ˆå€¼åŽ ================ è§£å†³å¼•è¨€ä¸æåˆ°çš„é—®é¢˜çš„ä¸€ä¸ªè§£å†³æ–¹æ¡ˆæ˜¯åœ¨æ¨¡åž‹è®ç»ƒåŽè°ƒæ•´åˆ†ç±»å™¨çš„决ç–阈值。:class:`~sklearn.model_selection.TunedThresholdClassifierCV` 使用内部交å‰éªŒè¯æ¥è°ƒæ•´æ¤é˜ˆå€¼ã€‚é€‰æ‹©æœ€ä½³é˜ˆå€¼ä»¥æœ€å¤§åŒ–ç»™å®šæŒ‡æ ‡ã€‚ 下图说明了梯度æå‡åˆ†ç±»å™¨çš„决ç–阈值调整。虽然普通分类器和调整åŽçš„分类器æä¾›äº†ç›¸åŒçš„ :term:`predict_proba` è¾“å‡ºï¼Œå› æ¤å…·æœ‰ç›¸åŒçš„æŽ¥æ”¶å™¨æ“作特å¾ï¼ˆROC)和精确度-å¬å›žæ›²çº¿ï¼Œä½†ç”±äºŽè°ƒæ•´åŽçš„é˜ˆå€¼ï¼Œç±»æ ‡ç¾é¢„测ä¸åŒã€‚ 决ç–é˜ˆå€¼ã€‚ä¼ ç»Ÿçš„åˆ†ç±»å™¨åœ¨æ¡ä»¶æ¦‚率大于0.5时预测感兴趣的类别,而ç»è¿‡è°ƒä¼˜çš„分类器在éžå¸¸ä½Žçš„æ¦‚率(大约0.02)时预测感兴趣的类别。这个决ç–é˜ˆå€¼ä¼˜åŒ–äº†ç”±ä¸šåŠ¡ï¼ˆåœ¨æœ¬ä¾‹ä¸æ˜¯ä¸€å®¶ä¿é™©å…¬å¸ï¼‰å®šä¹‰çš„æ•ˆç”¨æŒ‡æ ‡ã€‚ .. figure:: ../auto_examples/model_selection/images/sphx_glr_plot_cost_sensitive_learning_002.png :target: ../auto_examples/model_selection/plot_cost_sensitive_learning.html :align: center 调优决ç–阈值的选项 -------------------- 决ç–阈值å¯ä»¥é€šè¿‡ç”±å‚æ•° `scoring` 控制的多ç§ç–略进行调优。 一ç§è°ƒä¼˜é˜ˆå€¼çš„æ–¹æ³•是通过最大化预定义的scikit-learnæŒ‡æ ‡ã€‚è¿™äº›æŒ‡æ ‡å¯ä»¥é€šè¿‡è°ƒç”¨å‡½æ•° :func:`~sklearn.metrics.get_scorer_names` æ‰¾åˆ°ã€‚é»˜è®¤æƒ…å†µä¸‹ï¼Œä½¿ç”¨å¹³è¡¡å‡†ç¡®çŽ‡ä½œä¸ºæŒ‡æ ‡ï¼Œä½†è¯·æ³¨æ„应为您的用例选择有æ„ä¹‰çš„æŒ‡æ ‡ã€‚ .. note:: éœ€è¦æ³¨æ„çš„æ˜¯ï¼Œè¿™äº›æŒ‡æ ‡å¸¦æœ‰é»˜è®¤å‚æ•°ï¼Œç‰¹åˆ«æ˜¯æ„Ÿå…´è¶£ç±»åˆ«çš„æ ‡ç¾ï¼ˆå³ `pos_label` ï¼‰ã€‚å› æ¤ï¼Œå¦‚æžœè¿™ä¸ªæ ‡ç¾ä¸é€‚用于您的应用,您需è¦å®šä¹‰ä¸€ä¸ªè¯„åˆ†å™¨å¹¶ä¼ é€’æ£ç¡®çš„ `pos_label` (以åŠé™„åŠ å‚æ•°ï¼‰ï¼Œä½¿ç”¨ :func:`~sklearn.metrics.make_scorer` 。请å‚阅 :ref:`scoring` 以获å–定义自己的评分函数的信æ¯ã€‚例如,我们展示了如何在最大化 :func:`~sklearn.metrics.f1_score` æ—¶ä¼ é€’æ„Ÿå…´è¶£æ ‡ç¾ä¸º `0` 的信æ¯:: >>> from sklearn.linear_model import LogisticRegression >>> from sklearn.model_selection import TunedThresholdClassifierCV >>> from sklearn.metrics import make_scorer, f1_score >>> X, y = make_classification( ... n_samples=1_000, weights=[0.1, 0.9], random_state=0) >>> pos_label = 0 >>> scorer = make_scorer(f1_score, pos_label=pos_label) >>> base_model = LogisticRegression() >>> model = TunedThresholdClassifierCV(base_model, scoring=scorer) >>> scorer(model.fit(X, y), X, y) 0.88... >>> # 与通过交å‰éªŒè¯æ‰¾åˆ°çš„内部评分进行比较 >>> model.best_score_ 0.86... 关于内部交å‰éªŒè¯çš„é‡è¦è¯´æ˜Ž ------------------------------------------------------- 默认情况下,:class:`~sklearn.model_selection.TunedThresholdClassifierCV` 使用 5 折分层交å‰éªŒè¯æ¥è°ƒæ•´å†³ç–é˜ˆå€¼ã€‚å‚æ•° `cv` å…许控制交å‰éªŒè¯ç–略。å¯ä»¥é€šè¿‡è®¾ç½® `cv="prefit"` å¹¶æä¾›ä¸€ä¸ªå·²æ‹Ÿåˆçš„分类器æ¥ç»•过交å‰éªŒè¯ã€‚åœ¨è¿™ç§æƒ…况下,决ç–é˜ˆå€¼æ˜¯æ ¹æ®æä¾›ç»™ `fit` 方法的数æ®è¿›è¡Œè°ƒæ•´çš„。 然而,在使用æ¤é€‰é¡¹æ—¶åº”æžå…¶å°å¿ƒã€‚由于过拟åˆçš„风险,永远ä¸åº”将相åŒçš„æ•°æ®ç”¨äºŽè®ç»ƒåˆ†ç±»å™¨å’Œè°ƒæ•´å†³ç–阈值。有关更多详细信æ¯ï¼Œè¯·å‚阅以下示例部分(å‚è§ :ref:`TunedThresholdClassifierCV_no_cv` ï¼‰ã€‚å¦‚æžœèµ„æºæœ‰é™ï¼Œå¯ä»¥è€ƒè™‘为 `cv` 使用一个浮点数,以é™åˆ¶ä¸ºå†…部å•一è®ç»ƒ-测试分割。 选项 `cv="prefit"` 仅应在æä¾›çš„分类器已ç»è®ç»ƒè¿‡ï¼Œå¹¶ä¸”æ‚¨åªæƒ³ä½¿ç”¨æ–°çš„验è¯é›†æ‰¾åˆ°æœ€ä½³å†³ç–阈值时使用。 .. _FixedThresholdClassifier: 手动设置决ç–阈值 --------------------------------------- å‰å‡ 节讨论了寻找最优决ç–阈值的ç–略。也å¯ä»¥é€šè¿‡ç±» :class:`~sklearn.model_selection.FixedThresholdClassifier` 手动设置决ç–阈值。如果您ä¸å¸Œæœ›åœ¨è°ƒç”¨ `fit` æ—¶é‡æ–°æ‹Ÿåˆæ¨¡åž‹ï¼Œå¯ä»¥è®¾ç½®å‚æ•° `prefit=True` 。 示例 -------- - å‚è§æ ‡é¢˜ä¸º :ref:`sphx_glr_auto_examples_model_selection_plot_tuned_decision_threshold.py` , 以了解决ç–阈值调优åŽçš„è§è§£ã€‚ - å‚è§å为 :ref:`sphx_glr_auto_examples_model_selection_plot_cost_sensitive_learning.py` , 的示例,å¦ä¹ æˆæœ¬æ•感å¦ä¹ 和决ç–阈值调优。