使用gridSearchCV进行隔离林参数调整

时间:2019-05-10 13:36:27

标签: python-3.x scikit-learn data-science

我有多个时间序列数据,想用隔离森林算法检测异常。 想要从gridSearchCV获得最佳参数,这是gridSearch CV的代码段。

使用以下代码段加载的输入数据集。

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:目标是多类的,但average ='binary'。请选择其他平均设置。

有人可以指导我这是什么意思,尝试过average ='weight',但还是没有运气,这里有什么地方做错了。 请让我知道如何获得F分数。

2 个答案:

答案 0 :(得分:1)

使用此更新make_scorer使其起作用。

make_scorer(f1_score, average='micro')

答案 1 :(得分:0)

您会发生此错误,因为在将f1_score转换为记分器时未设置参数average。实际上,如documentation中所述:

  

平均值:字符串,[无,“二进制”(默认),“微”,“宏”,   “样本”,“加权”]   多类/多标签目标。如果为None,则每个课程的分数为   返回。

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

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)