Я пытаюсь использовать GridSearchCV
и RandomizedSearchCV
, чтобы найти лучшие параметры для двух неконтролируемых алгоритмов обучения (для обнаружения новизны), а именно, OneClassSVM
и LocalOutlierFactor
, оба sklearn .
Ниже приведена функция, которую я написал (произвел изменения в этом примере ):
def gridsearch(clf, param_dist_rand, param_grid_exhaustive, X):
def report(results, n_top=3):
for i in range(1, n_top + 1):
candidates = np.flatnonzero(results['rank_test_score'] == i)
for candidate in candidates:
print("Model with rank: {0}".format(i))
print("Mean validation score: {0:.3f} (std: {1:.3f})".format(
results['mean_test_score'][candidate],
results['std_test_score'][candidate]))
print("Parameters: {0}".format(results['params'][candidate]))
print("")
n_iter_search = 20
random_search = RandomizedSearchCV(clf,
param_distributions=param_dist_rand, n_iter=n_iter_search, cv=5,
error_score=np.NaN, scoring='accuracy')
start = time()
random_search.fit(X)
print("RandomizedSearchCV took %.2f seconds for %d candidates"
" parameter settings." % ((time() - start), n_iter_search))
report(random_search.cv_results_)
grid_search = GridSearchCV(clf, param_grid=param_grid_exhaustive,
cv=5, error_score=np.NaN, scoring='accuracy')
start = time()
grid_search.fit(X)
print("GridSearchCV took %.2f seconds for %d candidate parameter
settings."
% (time() - start, len(grid_search.cv_results_['params'])))
report(grid_search.cv_results_)
Для проверки функции выше у меня есть следующий код:
X, W = train_test_split(all_data, test_size=0.2, random_state=42)
clf_lof = LocalOutlierFactor(novelty=True, contamination='auto')
lof_param_dist_rand = {'n_neighbors': np.arange(6, 101, 1), 'leaf_size':
np.arange(30, 101, 10)}
lof_param_grid_exhaustive = {'n_neighbors': np.arange(6, 101, 1),
'leaf_size': np.arange(30, 101, 10)}
gridsearch(clf=clf_lof, param_dist_rand=lof_param_dist_rand,
param_grid_exhaustive=lof_param_grid_exhaustive, X=X)
clf_svm = svm.OneClassSVM()
svm_param_dist_rand = {'nu': np.arange(0, 1.1, 0.01), 'kernel': ['rbf',
'linear','poly','sigmoid'], 'degree': np.arange(0, 7,
1), 'gamma': scipy.stats.expon(scale=.1),}
svm_param_grid_exhaustive = {'nu': np.arange(0, 1.1, 0.01), 'kernel':
['rbf', 'linear','poly','sigmoid'], 'degree':
np.arange(0, 7, 1), 'gamma': 0.25}
gridsearch(clf=clf_svm, param_dist_rand=svm_param_dist_rand,
param_grid_exhaustive=svm_param_grid_exhaustive, X=X)
Изначально я не включил параметр scoring
для обоих методов GridSearch
и получил эту ошибку:
TypeError: If no scoring is specified, the estimator passed should have a 'score' method.
Затем я добавил scoring='accuracy'
, так как хочу использоватьточность теста для оценки производительности различных конфигураций модели.Теперь я получаю эту ошибку:
TypeError: __call__() missing 1 required positional argument: 'y_true'
У меня нет меток, поскольку у меня есть данные из одного класса и нет данных из классов счетчиков, поэтому я не знаю, как поступить с этой ошибкой.Кроме того, я посмотрел на то, что предложено в этом вопросе , но это не помогло мне.Любая помощь будет принята с благодарностью.
Редактировать: В соответствии с предложением @FChm о предоставлении образцов данных, вы можете найти образец .csv
файла данных здесь .Краткое описание файла: состоит из четырех столбцов функций (сгенерированных PCA), которые я добавляю в свои модели.