2017-02-15 1 views
1

Следующий код приводит к: TypeError: __call__() takes at least 4 arguments (3 given).Scikit-learn GridSearchCV не подходит для модели EM с силуэтом_score из-за загадочного TypeError

Я создал экземпляр кластерного классификатора и созданный метод оценки, подходящий для кластеризации. Я предоставил простой набор данных для подгонки и словарь параметров для поиска сетки. Мне очень трудно увидеть, где у меня ошибка, и трассировка довольно бесполезна.

from sklearn.mixture import GaussianMixture 
from sklearn.model_selection import GridSearchCV 
from sklearn.metrics import silhouette_score, make_scorer 

parameters = {'n_components': range(1, 6), 'covariance_type': ['full', 'tied', 'diag', 'spherical']} 

silhouette_scorer = make_scorer(silhouette_score) 

gm = GaussianMixture() 
clusterer = GridSearchCV(gm, parameters, scoring=silhouette_scorer) 
clusterer.fit(data) 

отслеживающий маскировочная и, насколько я могу сказать, что я слежу за синтаксис и рабочий процесс, описанный в документации sklearn для GridSearchCV точно. Что я могу сделать неправильно здесь, что приведет к этой ошибке?

Вот содержание данных:

 Dimension 1 Dimension 2 
0  -0.837489 -1.076500 
1  1.746697  0.193893 
2  -0.141929 -2.772168 
3  -2.809583 -3.645926 
4  -2.070939 -2.485348 
..   ...   ... 
401 -0.477716 -0.347241 
402  0.742407  0.005890 
403 -2.152810  5.385891 
404 -0.074108 -1.691082 
405  0.555363 -0.002872 
416 -1.597249 -0.804744 

Вот последние несколько строк TRACEBACK:

/usr/local/lib/python2.7/site-packages/sklearn/externals/joblib/parallel.pyc in __call__(self) 
    129 
    130  def __call__(self): 
--> 131   return [func(*args, **kwargs) for func, args, kwargs in self.items] 
    132 
    133  def __len__(self): 

/usr/local/lib/python2.7/site-packages/sklearn/model_selection/_validation.pyc in _fit_and_score(estimator, X, y, scorer, train, test, verbose, parameters, fit_params, return_train_score, return_parameters, return_n_test_samples, return_times, error_score) 
    258  else: 
    259   fit_time = time.time() - start_time 
--> 260   test_score = _score(estimator, X_test, y_test, scorer) 
    261   score_time = time.time() - start_time - fit_time 
    262   if return_train_score: 

/usr/local/lib/python2.7/site-packages/sklearn/model_selection/_validation.pyc in _score(estimator, X_test, y_test, scorer) 
    284  """Compute the score of an estimator on a given test set.""" 
    285  if y_test is None: 
--> 286   score = scorer(estimator, X_test) 
    287  else: 
    288   score = scorer(estimator, X_test, y_test) 

TypeError: __call__() takes at least 4 arguments (3 given) 
+0

Посмотрите на это! Я не уверен, что это поможет! https://github.com/scikit-learn/scikit-learn/pull/4301 – MhFarahani

ответ

2

Ну, дело в том, что вы используете неправильную функцию в качестве параметра make_scorer. documentation for make_scorer говорит:

score_func - функция Score (или функция потерь) с подписью score_func (y_true, y_pred, ** kwargs)

И вы передаете silhouette_score в него, который имеет signature(X, labels, metric='euclidean' ...), который, очевидно, не соответствует требованию make_scorer, отсюда и ошибка.

Попробуйте изменить это на какой-либо другой показатель, чтобы устранить эту ошибку.

Смежные вопросы