【问题标题】:Move imaginary decision boundary in sklearn RandomForestClassifier在 sklearn RandomForestClassifier 中移动假想的决策边界
【发布时间】:2019-05-18 10:54:25
【问题描述】:

我正在为我的任务使用 RandomForestClassifier。拟合数据(数据平衡),进行交叉验证。当然在预测中会出现一些错误,但这是可以接受的。我的任务是二元的,但不正确的样本定义作为第一类比第二类更重要。有什么方法可以将假想的决策边界移向第二类,通过牺牲第二类的准确性来最小化第一类的错误?

    ml_model = RandomForestClassifier(random_state=17, n_jobs=-1, class_weight='balanced')
    ml_params = {'max_depth': range(5, 16), 'max_features': range(4, 15)}

    skf = StratifiedKFold(n_splits=5, shuffle=True, random_state=17)
    ml_grid = GridSearchCV(ml_model, ml_params, cv=skf, n_jobs=-1, scoring='roc_auc')
    ml_grid.fit(x_train, y_train)

...
    ml_grid.best_estimator_.predict(some_sample)

【问题讨论】:

  • 您似乎在寻找class_weight 参数。试一试,看看你的类错误是如何变化的。
  • 您也可以尝试将GridSearchCVscoring 参数更改为您希望被视为重要的类的召回率或精度。
  • @FatihAkici 我用不同的 class_weight 参数尝试了我的模型,但看起来这对结果没有影响。而且我并不孤单:stats.stackexchange.com/questions/326125/…
  • @FatihAkici 几个实验表明class_weight 有效,但不是很有效。可能是因为这个参数目标是提供不平衡的训练数据...请将您的评论格式化为 anwer - 我会提交它
  • @VivekKumar 这也有效,但我不知道提交哪个答案

标签: python scikit-learn


【解决方案1】:

如果您使用连续概率,那么您可以移动决策阈值以使一个类优于另一类。然后您将使用estimator.predict_proba() < 0.3< 0.7 而不是estimator.predict()

您可以使用 RandomForest 做到这一点,但使用直接提供连续输出的梯度提升树可能会获得更好的结果。

您可以使用 ROC 曲线图来确定合适的阈值,以提供适合您应用的精度/召回率曲线。

【讨论】:

    猜你喜欢
    • 2013-10-04
    • 2019-01-18
    • 2018-12-31
    • 2018-12-20
    • 2017-10-11
    • 2017-10-02
    • 2015-11-11
    • 2019-11-03
    • 2013-12-13
    相关资源
    最近更新 更多