首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >随机森林分类器的变化阈值

随机森林分类器的变化阈值
EN

Stack Overflow用户
提问于 2019-08-01 10:35:39
回答 1查看 4.7K关注 0票数 5

我需要开发一个模型,它将是免费的(或接近免费的)假负值。为此,我绘制了召回-精度曲线,并确定阈值应设置为0.11

我的问题是,如何定义模型培训的阈值?以后在评估时定义它没有意义,因为它不会考虑新的数据。

代码语言:javascript
复制
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)

有什么想法吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 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,然后操作这些返回的概率以获得所需的结果。下面是一个使用虚拟数据的示例:

代码语言:javascript
复制
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:

代码语言:javascript
复制
clf.predict(X)[0] 
# 0

因为

代码语言:javascript
复制
clf.predict_proba(X)[0]
# array([0.85266881, 0.14733119])

p0 > p1.

要获得您想要的(即在这里返回类1,因为p1 > threshold的阈值为0.11),下面是您必须做的事情:

代码语言:javascript
复制
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))]

在此之后,我们很容易看到,对于第一个预测样本,我们有:

代码语言:javascript
复制
preds[0]
# 1

因为,如上面所示,对于这个示例,我们有p1 = 0.14733119 > threshold

票数 11
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57307095

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档