我有多个时间序列数据,想用隔离森林算法检测异常。 想要从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分数。
答案 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)