偷偷摘套内射激情视频,久久精品99国产国产精,中文字幕无线乱码人妻,中文在线中文a,性爽19p

為機器學(xué)習(xí)模型設(shè)置最佳閾值:0.5是二元分類的最佳閾值嗎

人工智能 機器學(xué)習(xí)
對于二元分類,分類器輸出一個實值分?jǐn)?shù),然后通過對該值進行閾值的區(qū)分產(chǎn)生二元的相應(yīng)。例如,邏輯回歸輸出一個概率(一個介于0.0和1.0之間的值);得分等于或高于0.5的觀察結(jié)果產(chǎn)生正輸出(許多其他模型默認使用0.5閾值)。

對于二元分類,分類器輸出一個實值分?jǐn)?shù),然后通過對該值進行閾值的區(qū)分產(chǎn)生二元的相應(yīng)。例如,邏輯回歸輸出一個概率(一個介于0.0和1.0之間的值);得分等于或高于0.5的觀察結(jié)果產(chǎn)生正輸出(許多其他模型默認使用0.5閾值)。

但是使用默認的0.5閾值是不理想的。在本文中,我將展示如何從二元分類器中選擇最佳閾值。本文將使用Ploomber并行執(zhí)行我們的實驗,并使用sklearn-evaluation生成圖。

圖片

這里以訓(xùn)練邏輯回歸為例。假設(shè)我們正在開發(fā)一個內(nèi)容審核系統(tǒng),模型標(biāo)記包含有害內(nèi)容的帖子(圖片、視頻等);然后,人工會查看并決定內(nèi)容是否被刪除。

構(gòu)建簡單的二元分類器

下面的代碼片段訓(xùn)練我們的分類器:

import matplotlib.pyplot as plt
import matplotlib as mpl
from sklearn import datasets
from sklearn.linear_model import LogisticRegression
from sklearn.model_selection import train_test_split
from sklearn_evaluation.plot import ConfusionMatrix

# matplotlib settings
mpl.rcParams['figure.figsize'] = (4, 4)
mpl.rcParams['figure.dpi'] = 150

# create sample dataset
X, y = datasets.make_classification(1000, 10, n_informative=5, class_sep=0.4)
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3)

# fit model
clf = LogisticRegression()
_ = clf.fit(X_train, y_train)

現(xiàn)在讓我們對測試集進行預(yù)測,并通過混淆矩陣評估性能:

# predict on the test set
y_pred = clf.predict(X_test)

# plot confusion matrix
cm_dot_five = ConfusionMatrix(y_test, y_pred)
cm_dot_five

混淆矩陣總結(jié)了模型在四個區(qū)域的性能:

圖片

我們希望在左上和右下象限中獲得盡可能多的觀察值(從測試集),因為這些是我們的模型得到正確的觀察值。其他象限是模型錯誤。

改變模型的閾值將改變混淆矩陣中的值。在前面的示例中,使用clf.predict,返回一個二元響應(yīng)(即使用0.5作為閾值);但是我們可以使用clf.predict_proba函數(shù)獲取原始概率并使用自定義閾值:

y_score = clf.predict_proba(X_test)

我們可以通過設(shè)置一個較低的閾值(即標(biāo)記更多的帖子為有害的)來讓我們的分類器更具侵略性,并創(chuàng)建一個新的混淆矩陣:

cm_dot_four = ConfusionMatrix(y_score[:, 1] >= 0.4, y_pred)

sklearn-evaluation庫可以輕松比較兩個矩陣:

cm_dot_five + cm_dot_four

三角形的上面來自0.5的閾值,下面來自0.4的閾值:

  • 兩個模型對相同數(shù)量的觀測結(jié)果都預(yù)測為0(這是一個巧合)。0.5閾值:(90 + 56 = 146)。0.4閾值:(78 + 68 = 146)
  • 降低閾值會導(dǎo)致更多的假陰性(從56例降至68例)
  • 降低閾值將大大增加真陽性(從92例增加154例)

微小的閾值變化極大地影響了混淆矩陣。我們只分析了兩個閾值。那么如果能夠分析跨所有值的模型性能,我們就可以好地理解閾值動態(tài)。但是在此之前,需要定義用于模型評估的新指標(biāo)。

到目前為止,我們都是用絕對數(shù)字來評估我們的模型。為了便于比較和評估,我們現(xiàn)在將定義兩個標(biāo)準(zhǔn)化指標(biāo)(它們的值在0.0和1.0之間)。

精度precision是標(biāo)記的觀察事件的比例(例如,我們的模型認為有害的帖子,它們是有害的)。召回 recall是我們的模型檢索到的實際事件的比例(即,從所有有害的帖子中,我們能夠檢測到它們的哪個比例)。

圖片

以上圖片來自維基百科,可以很好的說明這兩個指標(biāo)是如何計算的,精確度和召回率都是比例關(guān)系,所以它們都是0比1的比例。

運行實驗

我們將根據(jù)幾個閾值獲得精度、召回率和其他統(tǒng)計信息,以便更好地理解閾值如何影響它們。我們還將多次重復(fù)這個實驗來測量可變性。

本節(jié)中的命令都是bash命令。需要在終端中執(zhí)行它們,如果使用Jupyter可以使用%%sh魔法命令。

這里使用Ploomber Cloud運行我們的實驗。因為它允許我們并行運行實驗并快速檢索結(jié)果。

創(chuàng)建了一個適合一個模型的Notebook,并為幾個閾值計算統(tǒng)計數(shù)據(jù),并行執(zhí)行同一個Notebook20次。

curl -O https://raw.githubusercontent.com/ploomber/posts/master/threshold/fit.ipynb?utm_source=medium&utm_medium=blog&utm_campaign=threshold

讓執(zhí)行這個Notebook(文件中的配置會告訴Ploomber Cloud并行運行它20次):

ploomber cloud nb fit.ipynb

幾分鐘后,我們就會看到的20個實驗完成了:

ploomber cloud status @latest --summary

status count
-------- -------
finished 20

Pipeline finished. Check outputs:
$ ploomber cloud products

讓我們下載存儲在.csv文件中的實驗結(jié)果:

ploomber cloud download 'threshold-selection/*.csv' --summary

可視化實驗結(jié)果

將加載所有實驗的結(jié)果,并一次性將它們繪制出來。

 from glob import glob

import pandas as pd
import numpy as np
paths = glob('threshold-selection/**/*.csv')
metrics = [pd.read_csv(path) for path in paths]

for idx, df in enumerate(metrics):
plt.plot(df.threshold, df.precision, color='blue', alpha=0.2,
label='precision' if idx == 0 else None)
plt.plot(df.threshold, df.recall, color='green', alpha=0.2,
label='recall' if idx == 0 else None)
plt.plot(df.threshold, df.f1, color='orange', alpha=0.2,
label='f1' if idx == 0 else None)


plt.grid()
plt.legend()
plt.xlabel('Threshold')
plt.ylabel('Metric value')

for handle in plt.legend().legendHandles:
handle.set_alpha(1)

ax = plt.twinx()

for idx, df in enumerate(metrics):
ax.plot(df.threshold, df.n_flagged,
label='flagged' if idx == 0 else None,
color='red', alpha=0.2)

plt.ylabel('Flagged')
ax.legend(loc=0)
ax.legend().legendHandles[0].set_alpha(1)

圖片

左邊的刻度(從0到1)是我們的三個指標(biāo):精度、召回率和F1。F1分為精度與查全率的調(diào)和平均值,F(xiàn)1分的最佳值為1.0,最差值為0.0;F1對精度和召回率都是相同對待的,所以你可以看到它在兩者之間保持平衡。如果你正在處理一個精確度和召回率都很重要的用例,那么最大化F1是一種可以幫助你優(yōu)化分類器閾值的方法。

這里還包括一條紅色曲線(右側(cè)的比例),顯示我們的模型標(biāo)記為有害內(nèi)容的案例數(shù)量。

在這個的內(nèi)容審核示例中,可能有X個的工作人員來人工審核模型標(biāo)記的有害帖子,但是他們?nèi)藬?shù)是有限的,因此考慮標(biāo)記帖子的總數(shù)可以幫助我們更好地選擇閾值:例如每天只能檢查5000個帖子,那么模型找到10,000帖并不會帶來任何的提高。如果我人工每天可以處理10000貼,但是模型只標(biāo)記了100貼,那么顯然也是浪費的。

當(dāng)設(shè)置較低的閾值時,有較高的召回率(我們檢索了大部分實際上有害的帖子),但精度較低(包含了許多無害的帖子)。如果我們提高閾值,情況就會反轉(zhuǎn):召回率下降(錯過了許多有害的帖子),但精確度很高(大多數(shù)標(biāo)記的帖子都是有害的)。

所以在為我們的二元分類器選擇閾值時,我們必須在精度或召回率上妥協(xié),因為沒有一個分類器是完美的。我們來討論一下如何推理選擇合適的閾值。

選擇最佳閾值

右邊的數(shù)據(jù)會產(chǎn)生噪聲(較大的閾值)。需要稍微清理一下,我們將重新創(chuàng)建這個圖,我們將繪制2.5%、50%和97.5%的百分位數(shù),而不是繪制所有值。

shape = (df.shape[0], len(metrics))
precision = np.zeros(shape)
recall = np.zeros(shape)
f1 = np.zeros(shape)
n_flagged = np.zeros(shape)
for i, df in enumerate(metrics):
precision[:, i] = df.precision.values
recall[:, i] = df.recall.values
f1[:, i] = df.f1.values
n_flagged[:, i] = df.n_flagged.values
precision_ = np.quantile(precision, q=0.5, axis=1)
recall_ = np.quantile(recall, q=0.5, axis=1)
f1_ = np.quantile(f1, q=0.5, axis=1)
n_flagged_ = np.quantile(n_flagged, q=0.5, axis=1)
plt.plot(df.threshold, precision_, color='blue', label='precision')
plt.plot(df.threshold, recall_, color='green', label='recall')
plt.plot(df.threshold, f1_, color='orange', label='f1')

plt.fill_between(df.threshold, precision_interval[0],
precision_interval[1], color='blue',
alpha=0.2)

plt.fill_between(df.threshold, recall_interval[0],
recall_interval[1], color='green',
alpha=0.2)


plt.fill_between(df.threshold, f1_interval[0],
f1_interval[1], color='orange',
alpha=0.2)
plt.xlabel('Threshold')
plt.ylabel('Metric value')
plt.legend()

ax = plt.twinx()
ax.plot(df.threshold, n_flagged_, color='red', label='flagged')
ax.fill_between(df.threshold, n_flagged_interval[0],
n_flagged_interval[1], color='red',
alpha=0.2)

ax.legend(loc=3)

plt.ylabel('Flagged')
plt.grid()

圖片

我們可以根據(jù)自己的需求選擇閾值,例如檢索盡可能多的有害帖子(高召回率)是否更重要?還是要有更高的確定性,我們標(biāo)記的必須是有害的(高精度)?

如果兩者都同等重要,那么在這些條件下優(yōu)化的常用方法就是最大化F-1分?jǐn)?shù):

idx = np.argmax(f1_)
prec_lower, prec_upper = precision_interval[0][idx], precision_interval[1][idx]
rec_lower, rec_upper = recall_interval[0][idx], recall_interval[1][idx]
threshold = df.threshold[idx]

print(f'Max F1 score: {f1_[idx]:.2f}')
print('Metrics when maximizing F1 score:')
print(f' - Threshold: {threshold:.2f}')
print(f' - Precision range: ({prec_lower:.2f}, {prec_upper:.2f})')
print(f' - Recall range: ({rec_lower:.2f}, {rec_upper:.2f})')

#結(jié)果
Max F1 score: 0.71
Metrics when maximizing F1 score:
- Threshold: 0.26
- Precision range: (0.58, 0.61)
- Recall range: (0.86, 0.90)

在很多情況下很難決定這個折中,所以加入一些約束條件會有一些幫助。

假設(shè)我們有10個人審查有害的帖子,他們可以一起檢查5000個。那么讓我們看看指標(biāo),如果我們修改了閾值,讓它標(biāo)記了大約5000個帖子:

idx = np.argmax(n_flagged_ <= 5000)

prec_lower, prec_upper = precision_interval[0][idx], precision_interval[1][idx]
rec_lower, rec_upper = recall_interval[0][idx], recall_interval[1][idx]
threshold = df.threshold[idx]

print('Metrics when limiting to a maximum of 5,000 flagged events:')
print(f' - Threshold: {threshold:.2f}')
print(f' - Precision range: ({prec_lower:.2f}, {prec_upper:.2f})')
print(f' - Recall range: ({rec_lower:.2f}, {rec_upper:.2f})')

# 結(jié)果
Metrics when limiting to a maximum of 5,000 flagged events:
- Threshold: 0.82
- Precision range: (0.77, 0.81)
- Recall range: (0.25, 0.36)

如果需要進行匯報,我們可以在在展示結(jié)果時展示一些替代方案:比如在當(dāng)前約束條件下(5000個帖子)的模型性能,以及如果我們增加團隊(比如通過增加一倍的規(guī)模),我們可以做得更好。

總結(jié)

二元分類器的最佳閾值是針對業(yè)務(wù)結(jié)果進行優(yōu)化并考慮到流程限制的閾值。通過本文中描述的過程,你可以更好地為用例決定最佳閾值。

另外,Ploomber Cloud!提供一些免費的算力!如果你需要一些免費的服務(wù)可以試試它。

責(zé)任編輯:華軒 來源: DeepHub IMBA
相關(guān)推薦

2018-08-03 10:30:16

算法回歸機器學(xué)習(xí)

2021-04-20 14:18:57

人工智能機器學(xué)習(xí)

2017-08-16 10:34:56

Andrew NGLogistic回歸

2023-04-04 08:00:00

LazyPredic機器學(xué)習(xí)ML模型

2023-01-30 07:58:30

繼承代碼復(fù)用

2022-07-01 16:02:36

開源安全

2017-02-05 17:10:41

機器學(xué)習(xí)深度學(xué)習(xí)框架

2014-11-11 10:39:13

2013-03-14 09:33:14

遺留應(yīng)用公有云云計算

2017-07-04 15:12:51

智慧城市PPP

2011-10-19 16:21:45

2023-11-02 12:48:00

游戲規(guī)則Flutter

2020-08-19 16:36:53

HashMap紅黑樹閾值

2014-07-22 09:08:40

2016-02-23 09:09:55

2017-03-28 19:57:43

DevOpsIT框架

2018-02-28 14:41:29

2021-12-28 08:37:32

CTypeScriptJavaScript

2022-06-20 07:16:25

機器學(xué)習(xí)模型Codex

2024-02-20 15:17:35

機器學(xué)習(xí)模型部署
點贊
收藏

51CTO技術(shù)棧公眾號