Мне было интересно, если вы можете помочь мне с ошибкой, которую я получаю в режиме поиска сетки. Я думаю, что это может быть связано с неправильным пониманием того, как работает сетевой поиск.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
Похоже, что ошибка отслеживает то, что вызывает функция подсчета очков: 'matthews_corrcoef (y_true, y_pred)', и проблема заключается не в самом поиске сетки.Я бы предположил, что если вы использовали встроенную, а не настраиваемую функцию подсчета очков, ошибка не появлялась. Я хотел бы сосредоточиться на устранении неполадок функции подсчета очков, а не на поиске сетки. – Ryan
Пожалуйста, добавьте хотя бы некоторый снимок ваших данных. Подобно операторам 'print (X)', 'print (Y)', если вы хотите, чтобы мы могли вам помочь. С другой стороны, ваше назначение трех строк для точности, отзыва и f1_score может быть переписано как одна строка: 'precision, remember, f1_score, _ = precision_recall_fscore_support (фактическое, предсказание, среднее = 'двоичное')' – ldirer
@ user3914041 Спасибо за ответ ! да, я понимаю, что короткое сокращение полностью жизнеспособно, но по какой-то причине ipython-ноутбук был суетливым и не позволял мне использовать назначения кортежей для этой конкретной функции. Я не уверен, почему это так. Но теперь я добавил снимок моих данных для удобства. –