Scikit-learn 微调:在评估前对预测标签进行后处理

Posted

技术标签:

【中文标题】Scikit-learn 微调:在评估前对预测标签进行后处理【英文标题】:Scikit-learn fine-tuning: Postprocess predicted labels before evaluation 【发布时间】:2018-11-22 13:03:18 【问题描述】:

我想知道是否有办法在 sklearn 中对预测的标签进行后处理。 我的训练数据具有以下形式的基本事实标签 0, 1

但是,问题是我目前正在使用隔离森林,它预测:

-1 表示异常值,相当于真实标签1 1 用于普通数据,相当于真实标签0

如果我要编写一个函数来对预测进行后处理,那就很简单了:

def process_anomaly_labels(raw_y_pred):
    y_pred = raw_y_pred.copy()
    y_pred[raw_y_pred == 1] = 0
    y_pred[raw_y_pred == -1] = 1
    return y_pred

但是当我使用 RandomSearchCV 微调模型时,我不知道如何对预测标签进行后处理:

from sklearn.model_selection import RandomizedSearchCV
# fine tuning
forest_params = 
    "n_estimators": [50, 200, 800],
    "max_samples": [1000, 4000, 16000, 64000, 120000],
    "max_features": [1, 5, 15, 30],
    "contamination": [0.001, 0.1, 0.2, 0.5]

forest_grid_search = RandomizedSearchCV(
    IsolationForest(),
    param_distributions=forest_params,
    scoring="f1",
    n_jobs=8,
    n_iter=50,
    cv=3,
    verbose=2
)
forest_grid_search.fit(X_train_trans, y_train)

我无法将真实标签转换为与预测标签匹配,因为我想在评估时使用 二进制 F1 分数。

【问题讨论】:

您可以提供您的自定义记分器,它将首先根据需要转换标签,然后发送到计算f1 【参考方案1】:

按照 cmets 中的建议,编写一个执行所需映射的自定义记分器。

示例代码

from sklearn.metrics import make_scorer, f1_score
from sklearn.ensemble import IsolationForest
from sklearn.datasets import make_blobs
from sklearn.model_selection import RandomizedSearchCV
import numpy as np

def relabeled_f1_score(y_true, y_pred):
    y_pred_c = y_pred.copy()
    y_pred_c[y_pred_c == 1] = 0
    y_pred_c[y_pred_c == -1] = 1
    return f1_score(y_true=y_true, y_pred=y_pred_c)

n_samples = 1000
n_features = 40

X, _ = make_blobs(n_samples=n_samples, n_features=n_features)
y = np.random.choice([0, 1], n_samples)  # 1 = outlier, 0 = inliner

param_grid = 
    "n_estimators": [50, 200, 800],
    "max_samples": [1000, 4000, 16000, 64000, 120000],
    "max_features": [1, 5, 15, 30],
    "contamination": [0.001, 0.1, 0.2, 0.5]


custom_scorer = make_scorer(score_func=relabeled_f1_score, greater_is_better=True)
my_rs = RandomizedSearchCV(IsolationForest(), param_distributions=param_grid, scoring=custom_scorer, verbose=3)

my_rs.fit(X, y)

【讨论】:

谢谢它正在工作,尽管我需要对标签数据执行转换。然后放入交叉验证数据中。

以上是关于Scikit-learn 微调:在评估前对预测标签进行后处理的主要内容,如果未能解决你的问题,请参考以下文章

《自然语言处理实战入门》深度学习 ---- 预训练模型的使用(ALBERT 进行多标签文本分类与微调 fine tune)

《自然语言处理实战入门》深度学习 ---- 预训练模型的使用(ALBERT 进行多标签文本分类与CPU 下的微调 fine tune)

Scikit-learn:用于集群评估的 ARI 分数

将 scikit-learn (sklearn) 预测添加到 pandas 数据帧

评估 NB 模型的预测准确性

scikit-learn 分类指标中的 classification_report 与 f1_score