我需要开发一个模型,它将是免费的(或接近免费的)假负值。为此,我绘制了召回-精度曲线,并确定阈值应设置为0.11
我的问题是,如何定义模型培训的阈值?以后在评估时定义它没有意义,因为它不会考虑新的数据。
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=101)
rfc_model = RandomForestClassifier(random_state=101)
rfc_model.fit(X_train, y_train)
rfc_preds = rfc_model.predict(X_test)
recall_precision_vals = []
for val in np.linspace(0, 1, 101):
predicted_proba = rfc_model.predict_proba(X_test)
predicted = (predicted_proba[:, 1] >= val).astype('int')
recall_sc = recall_score(y_test, predicted)
precis_sc = precision_score(y_test, predicted)
recall_precision_vals.append({
'Threshold': val,
'Recall val': recall_sc,
'Precis val': precis_sc
})
recall_prec_df = pd.DataFrame(recall_precision_vals)有什么想法吗?
发布于 2019-08-02 01:03:41
如何定义模型训练的阈值?
在模型训练过程中存在简单的无阈值,随机森林是一种概率分类器,它只输出类概率。“硬”类(即0/1)确实需要一个阈值,但在模型培训的任何阶段-仅在预测期间-既不产生也不使用-即使是在预测期间,即使是在预测的情况下,我们也确实需要严格的分类(并非总是如此)。有关更多细节,请参见预测类或类概率?。
实际上,scikit--学习RF的实现实际上根本不使用阈值,甚至对于硬类预测也是如此;仔细阅读文档的predict方法:
预测类是树的平均概率估计值最高的类。
简单地说,这意味着实际的RF输出是[p0, p1] (假设二进制分类),predict方法只是从其中返回值最高的类,如果p0 > p1为0,则为1。
假设您实际上想要返回1,如果p1从小于0.5的阈值中返回1,则必须放弃predict,而使用predict_proba,然后操作这些返回的概率以获得所需的结果。下面是一个使用虚拟数据的示例:
from sklearn.ensemble import RandomForestClassifier
from sklearn.datasets import make_classification
X, y = make_classification(n_samples=1000, n_features=4,
n_informative=2, n_redundant=0,
n_classes=2, random_state=0, shuffle=False)
clf = RandomForestClassifier(n_estimators=100, max_depth=2,
random_state=0)
clf.fit(X, y)在这里,简单地使用predict作为X的第一个元素,就会给出0:
clf.predict(X)[0]
# 0因为
clf.predict_proba(X)[0]
# array([0.85266881, 0.14733119])即p0 > p1.
要获得您想要的(即在这里返回类1,因为p1 > threshold的阈值为0.11),下面是您必须做的事情:
prob_preds = clf.predict_proba(X)
threshold = 0.11 # define threshold here
preds = [1 if prob_preds[i][1]> threshold else 0 for i in range(len(prob_preds))]在此之后,我们很容易看到,对于第一个预测样本,我们有:
preds[0]
# 1因为,如上面所示,对于这个示例,我们有p1 = 0.14733119 > threshold。
https://stackoverflow.com/questions/57307095
复制相似问题