使用 gridSearchCV 调整隔离林参数

Posted

技术标签:

【中文标题】使用 gridSearchCV 调整隔离林参数【英文标题】:Isolation Forest Parameter tuning with gridSearchCV 【发布时间】:2019-09-28 10:27:26 【问题描述】:

我有多变量时间序列数据,想用隔离森林算法检测异常。 想从gridSearchCV中得到最好的参数,这里是gridSearch CV的sn-p代码。

使用以下 sn-p 加载的输入数据集。

df = pd.read_csv("train.csv")
df.drop(['dataTimestamp','Anomaly'], inplace=True, axis=1)
X_train = df
y_train = df1[['Anomaly']] ( Anomaly column is labelled data).

定义隔离森林的参数。

clf = IsolationForest(random_state=47, behaviour='new', score="accuracy")
param_grid = 'n_estimators': list(range(100, 800, 5)), 'max_samples': list(range(100, 500, 5)), 'contamination': [0.1, 0.2, 0.3, 0.4, 0.5], 'max_features': [5,10,15], 'bootstrap': [True, False], 'n_jobs': [5, 10, 20, 30]

f1sc = make_scorer(f1_score)
grid_dt_estimator = model_selection.GridSearchCV(clf, param_grid,scoring=f1sc, refit=True,cv=10, return_train_score=True)
grid_dt_estimator.fit(X_train, y_train)

执行 fit 后,出现以下错误。

ValueError:目标是多类但平均值='二进制'。请选择其他平均设置。

有人可以指导我这是怎么回事,尝试了平均='体重',但仍然没有运气,这里有什么问题。 请告诉我如何获得 F 分数。

【问题讨论】:

【参考方案1】:

您会出现此错误,因为您在将 f1_score 转换为记分器时没有设置参数 average。其实详情见documentation:

average : string, [None, ‘binary’ (默认), ‘micro’, ‘macro’, ‘samples’, ‘weighted’] 这个参数是必需的 多类/多标签目标。如果没有,每个班级的分数是 返回。

结果是记分器为分类问题中的每个类别返回多个分数,而不是单个度量。解决方案是根据您的需要为f1_score 声明average 参数的可能值之一。因此,我重构了您作为示例提供的代码,以便为您的问题提供可能的解决方案:

from sklearn.ensemble import IsolationForest
from sklearn.metrics import make_scorer, f1_score
from sklearn import model_selection
from sklearn.datasets import make_classification

X_train, y_train = make_classification(n_samples=500, 
                                       n_classes=2)

clf = IsolationForest(random_state=47, behaviour='new')

param_grid = 'n_estimators': list(range(100, 800, 5)), 
              'max_samples': list(range(100, 500, 5)), 
              'contamination': [0.1, 0.2, 0.3, 0.4, 0.5], 
              'max_features': [5,10,15], 
              'bootstrap': [True, False], 
              'n_jobs': [5, 10, 20, 30]

f1sc = make_scorer(f1_score(average='micro'))

grid_dt_estimator = model_selection.GridSearchCV(clf, 
                                                 param_grid,
                                                 scoring=f1sc, 
                                                 refit=True,
                                                 cv=10, 
                                                 return_train_score=True)
grid_dt_estimator.fit(X_train, y_train)

【讨论】:

嗨 Luca,非常感谢您的回复。修改代码 f1sc = make_scorer(f1_score(average='micro')) 后出现以下错误,错误消息如下(TypeError:f1_score()缺少2个必需的位置参数:'y_true'和'y_pred')。 用 1 和 -1 而不是 0 和 1 标记数据后问题已得到解决。 即使将其更改为 -1 和 1 Counter(-1: 250, 1: 250) 我也会收到相同的错误 --------------- -------------------------------------------------- ---------- TypeError: f1_score() 缺少 2 个必需的位置参数:'y_true' 和 'y_pred' 对于IsolationForest 的无监督情况,scoring 参数是什么?【参考方案2】:

用这个更新 make_scorer 让它工作。

make_scorer(f1_score, average='micro')

【讨论】:

你能帮我解决这个问题吗,我已经尝试过你的解决方案,但它不起作用。我的数据没有标记。 ***.com/questions/58186702/…【参考方案3】:

您调整的参数并非全部必需。 例如:contamination是异常率,您可以通过调整model.score_samples上的阈值来确定拟合模型后的最佳值

n_jobs 是您使用的 CPU 内核。

【讨论】:

以上是关于使用 gridSearchCV 调整隔离林参数的主要内容,如果未能解决你的问题,请参考以下文章

使用 GridSearchCV 调整 scikit-learn 的随机森林超参数

在 python 中使用 gridsearchcv 进行梯度提升分类器的参数调整

如何使用 GridSearchCV 比较多个模型以及 python 中的管道和超参数调整

使用 GridSearchCv 优化 SVR() 参数

实现 GridSearchCV 和 Pipelines 以执行 KNN 算法的超参数调整

GridSearchCV 的替代方法,用于查找 SVM 模型的参数