2015-07-24 3 views
1

Мне было интересно, если вы можете помочь мне с ошибкой, которую я получаю в режиме поиска сетки. Я думаю, что это может быть связано с неправильным пониманием того, как работает сетевой поиск.sklearn GridSearchCV (Ошибка функции подсчета очков)

Теперь я запускаю приложение, где мне нужен поиск сетки, чтобы оценить лучшие параметры, используя другую функцию подсчета очков. Я использую RandomForestClassifier для размещения большого набора данных X для вектора характеристик Y, который является списком 0s и 1s. (полностью двоичный). Моя функция подсчета очков (MCC) требует, чтобы вход прогнозирования и фактический вход были полностью бинарными. Однако по какой-то причине я продолжаю получать ValueError: multiclass не поддерживается.

Мое понимание состоит в том, что поиск сетки, перекрестная проверка в наборе данных, содержит вход предсказания, основанный на перекрестной проверке, а затем вставляет вектор характеристики и предсказание в функцию. Поскольку мой вектор характеризации полностью двоичный, мой вектор предсказания также должен быть двоичным и не создавать проблем при оценке оценки. Когда я запускаю случайный лес с одним определенным параметром (без использования поиска сетки), вставка предсказанных данных и вектора характеристик в функции подсчета очков MCC выполняется отлично. Поэтому я немного потерял, как работает поиск в сетке, что приведет к ошибкам.

Snapshot данных:

 print len(X) 
     print X[0] 
     print len(Y) 
     print Y[2990:3000] 
17463699 
[38.110903683955435, 38.110903683955435, 38.110903683955435, 9.899495124816895, 294.7808837890625, 292.3835754394531, 293.81494140625, 291.11065673828125, 293.51739501953125, 283.6424865722656, 13.580912590026855, 4.976086616516113, 1.1271398067474365, 0.9465181231498718, 0.5066819190979004, 0.1808401197195053, 0.0] 
17463699 
[0.0, 0.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0] 

Код:

def overall_average_score(actual,prediction): 
    precision = precision_recall_fscore_support(actual, prediction, average = 'binary')[0] 
    recall = precision_recall_fscore_support(actual, prediction, average = 'binary')[1] 
    f1_score = precision_recall_fscore_support(actual, prediction, average = 'binary')[2] 
    total_score = matthews_corrcoef(actual, prediction)+accuracy_score(actual, prediction)+precision+recall+f1_score 
    return total_score/5 

grid_scorer = make_scorer(overall_average_score, greater_is_better=True) 
parameters = {'n_estimators': [10,20,30], 'max_features': ['auto','sqrt','log2',0.5,0.3], } 
random = RandomForestClassifier() 
clf = grid_search.GridSearchCV(random, parameters, cv = 5, scoring = grid_scorer) 
clf.fit(X,Y) 

Ошибка:

ValueError        Traceback (most recent call last) 
<ipython-input-39-a8686eb798b2> in <module>() 
    18 random = RandomForestClassifier() 
    19 clf = grid_search.GridSearchCV(random, parameters, cv = 5, scoring = grid_scorer) 
---> 20 clf.fit(X,Y) 
    21 
    22 

/shared/studies/nonregulated/neurostream/neurostream/local/lib/python2.7/site-packages/sklearn/grid_search.pyc in fit(self, X, y) 
    730 
    731   """ 
--> 732   return self._fit(X, y, ParameterGrid(self.param_grid)) 
    733 
    734 

/shared/studies/nonregulated/neurostream/neurostream/local/lib/python2.7/site-packages/sklearn/grid_search.pyc in _fit(self, X, y, parameter_iterable) 
    503          self.fit_params, return_parameters=True, 
    504          error_score=self.error_score) 
--> 505     for parameters in parameter_iterable 
    506     for train, test in cv) 
    507 

/shared/studies/nonregulated/neurostream/neurostream/local/lib/python2.7/site-packages/sklearn/externals/joblib/parallel.pyc in __call__(self, iterable) 
    657    self._iterating = True 
    658    for function, args, kwargs in iterable: 
--> 659     self.dispatch(function, args, kwargs) 
    660 
    661    if pre_dispatch == "all" or n_jobs == 1: 

/shared/studies/nonregulated/neurostream/neurostream/local/lib/python2.7/site-packages/sklearn/externals/joblib/parallel.pyc in dispatch(self, func, args, kwargs) 
    404   """ 
    405   if self._pool is None: 
--> 406    job = ImmediateApply(func, args, kwargs) 
    407    index = len(self._jobs) 
    408    if not _verbosity_filter(index, self.verbose): 

/shared/studies/nonregulated/neurostream/neurostream/local/lib/python2.7/site-packages/sklearn/externals/joblib/parallel.pyc in __init__(self, func, args, kwargs) 
    138   # Don't delay the application, to avoid keeping the input 
    139   # arguments in memory 
--> 140   self.results = func(*args, **kwargs) 
    141 
    142  def get(self): 

/shared/studies/nonregulated/neurostream/neurostream/local/lib/python2.7/site-packages/sklearn/cross_validation.pyc in _fit_and_score(estimator, X, y, scorer, train, test, verbose, parameters, fit_params, return_train_score, return_parameters, error_score) 
    1476 
    1477  else: 
-> 1478   test_score = _score(estimator, X_test, y_test, scorer) 
    1479   if return_train_score: 
    1480    train_score = _score(estimator, X_train, y_train, scorer) 

/shared/studies/nonregulated/neurostream/neurostream/local/lib/python2.7/site-packages/sklearn/cross_validation.pyc in _score(estimator, X_test, y_test, scorer) 
    1532   score = scorer(estimator, X_test) 
    1533  else: 
-> 1534   score = scorer(estimator, X_test, y_test) 
    1535  if not isinstance(score, numbers.Number): 
    1536   raise ValueError("scoring must return a number, got %s (%s) instead." 

/shared/studies/nonregulated/neurostream/neurostream/local/lib/python2.7/site-packages/sklearn/metrics/scorer.pyc in __call__(self, estimator, X, y_true, sample_weight) 
    87   else: 
    88    return self._sign * self._score_func(y_true, y_pred, 
---> 89             **self._kwargs) 
    90 
    91 

<ipython-input-39-a8686eb798b2> in overall_average_score(actual, prediction) 
     3  recall = precision_recall_fscore_support(actual, prediction, average = 'binary')[1] 
     4  f1_score = precision_recall_fscore_support(actual, prediction, average = 'binary')[2] 
----> 5  total_score = matthews_corrcoef(actual, prediction)+accuracy_score(actual, prediction)+precision+recall+f1_score 
     6  return total_score/5 
     7 def show_score(actual,prediction): 

/shared/studies/nonregulated/neurostream/neurostream/local/lib/python2.7/site-packages/sklearn/metrics/classification.pyc in matthews_corrcoef(y_true, y_pred) 
    395 
    396  if y_type != "binary": 
--> 397   raise ValueError("%s is not supported" % y_type) 
    398 
    399  lb = LabelEncoder() 

ValueError: multiclass is not supported 
+0

Похоже, что ошибка отслеживает то, что вызывает функция подсчета очков: 'matthews_corrcoef (y_true, y_pred)', и проблема заключается не в самом поиске сетки.Я бы предположил, что если вы использовали встроенную, а не настраиваемую функцию подсчета очков, ошибка не появлялась. Я хотел бы сосредоточиться на устранении неполадок функции подсчета очков, а не на поиске сетки. – Ryan

+0

Пожалуйста, добавьте хотя бы некоторый снимок ваших данных. Подобно операторам 'print (X)', 'print (Y)', если вы хотите, чтобы мы могли вам помочь. С другой стороны, ваше назначение трех строк для точности, отзыва и f1_score может быть переписано как одна строка: 'precision, remember, f1_score, _ = precision_recall_fscore_support (фактическое, предсказание, среднее = 'двоичное')' – ldirer

+0

@ user3914041 Спасибо за ответ ! да, я понимаю, что короткое сокращение полностью жизнеспособно, но по какой-то причине ipython-ноутбук был суетливым и не позволял мне использовать назначения кортежей для этой конкретной функции. Я не уверен, почему это так. Но теперь я добавил снимок моих данных для удобства. –

ответ

1

я воспроизвел эксперимент, но я не получаю сообщение об ошибке. Ошибка указана в одном из ваших векторов actual или predictionсодержит более двух дискретных значений.

Это действительно странно, что вы можете выиграть случайный лес, обученный снаружи GridSearchCV.
Не могли бы вы предоставить точный код, который вы выполняете для этого?

Вот код, который я использовал, чтобы попытаться воспроизвести ошибку:

from sklearn.datasets import make_classification 
from sklearn.grid_search import GridSearchCV 
from sklearn.metrics import precision_recall_fscore_support, accuracy_score, \ 
    matthews_corrcoef, make_scorer 
from sklearn.ensemble import RandomForestClassifier 
from sklearn.cross_validation import train_test_split 

def overall_average_score(actual,prediction): 
    precision, recall, f1_score, _ = precision_recall_fscore_support(
     actual, prediction, average='binary') 
    total_score = (matthews_corrcoef(actual, prediction) + 
     accuracy_score(actual, prediction) + precision + recall + f1_score) 
    return total_score/5 

grid_scorer = make_scorer(overall_average_score, greater_is_better=True) 

print("Without GridSearchCV") 
X, y = make_classification(n_samples=500, n_informative=10, n_classes=2) 
X_train, X_test, y_train, y_test = train_test_split(X, y, 
    test_size=0.5, random_state=0) 
rf = RandomForestClassifier() 
rf.fit(X_train, y_train) 
y_pred = rf.predict(X_test) 
print("Overall average score: ", overall_average_score(y_test, y_pred)) 

print("-" * 30) 
print("With GridSearchCV:") 

parameters = {'n_estimators': [10,20,30], 
       'max_features': ['auto','sqrt','log2',0.5,0.3], } 
gs_rf = GridSearchCV(rf, parameters, cv=5, scoring=grid_scorer) 
gs_rf.fit(X_train,y_train) 
print("Best score with grid search: ", gs_rf.best_score_) 

Теперь я хотел бы сделать несколько замечаний по коду вы предоставили:

  • Это не большая практика использовать имена переменных, такие как random (обычно это модуль) или f1_score (это противоречит методу sklearn.metrics.f1_score).
  • Вы можете распаковать precision, recall и f1_score непосредственно вместо того, чтобы звонить 3 раза precision_recall_fscore_support.
  • На самом деле нет смысла искать сетку на n_estimators: больше деревьев всегда лучше. Если вас беспокоит переобучение, вы можете уменьшить сложность отдельных моделей, используя другие параметры, такие как max_depth или min_samples_split.
Смежные вопросы