Настройка параметров леса изоляции с помощью gridSearchCV - PullRequest
1 голос
/ 10 мая 2019

У меня есть данные с различными переменными временными рядами, я хочу обнаружить аномалии с помощью алгоритма леса изоляции. хотите получить лучшие параметры из 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)

после выполнения подгонки получил ошибку ниже.

ValueError: Цель мультиклассовая, но средняя = «двоичная». Пожалуйста, выберите другую среднюю настройку.

Может кто-нибудь подсказать мне, о чем идет речь, пробовал средний = «вес», но все равно не повезло, здесь что-то не так. пожалуйста, дайте мне знать, как получить F-Score.

1 Ответ

0 голосов
/ 12 мая 2019

Вы столкнулись с этой ошибкой, потому что вы не установили параметр average при преобразовании f1_score в бомбардир. Фактически, как описано в документации :

среднее: строка, [Нет, «двоичный» (по умолчанию), «микро», «макро», ‘Samples’, ‘weighted’] Этот параметр необходим для мультиклассовые / многослойные цели. Если нет, баллы за каждый класс вернулся.

Следствием этого является то, что оценщик возвращает несколько баллов для каждого класса в вашей задаче классификации вместо одного показателя. Решение состоит в том, чтобы объявить одно из возможных значений параметра 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)
...