Оставьте одну перекрестную проверку с помощью Sklearn

Я пытаюсь использовать перекрестную проверку для тестирования моего классификатора с помощью Sklearn.

У меня 3 класса, всего 50 образцов.

  • В классе 1: 5 образцов
  • В классе 2: 15 образцов
  • Класс 3: 30 образцов

Следующие запуски выполняются, как и ожидалось, что предположительно дает 5-кратную перекрестную проверку.

result = cross_validation.cross_val_score(classifier, X, y, cv=5)

Я пытаюсь сделать одноразовое исключение с использованием cv = 50 сгибов, поэтому я делаю следующее:

result = cross_validation.cross_val_score(classifier, X, y, cv=50)

Однако, что удивительно, это дает следующую ошибку:

/Library/Python/2.7/site-packages/sklearn/cross_validation.py:413: Warning: The least populated class in y has only 5 members, which is too few. The minimum number of labels for any class cannot be less than n_folds=50.
  % (min_labels, self.n_folds)), Warning)
/System/Library/Frameworks/Python.framework/Versions/2.7/Extras/lib/python/numpy/core/_methods.py:55: RuntimeWarning: Mean of empty slice.
  warnings.warn("Mean of empty slice.", RuntimeWarning)
/System/Library/Frameworks/Python.framework/Versions/2.7/Extras/lib/python/numpy/core/_methods.py:67: RuntimeWarning: invalid value encountered in double_scalars
  ret = ret.dtype.type(ret / rcount)
Traceback (most recent call last):
  File "b.py", line 96, in <module>
    scores1 = cross_validation.cross_val_score(classifier, X, y, cv=50)
  File "/Library/Python/2.7/site-packages/sklearn/cross_validation.py", line 1151, in cross_val_score
    for train, test in cv)
  File "/Library/Python/2.7/site-packages/sklearn/externals/joblib/parallel.py", line 653, in __call__
    self.dispatch(function, args, kwargs)
  File "/Library/Python/2.7/site-packages/sklearn/externals/joblib/parallel.py", line 400, in dispatch
    job = ImmediateApply(func, args, kwargs)
  File "/Library/Python/2.7/site-packages/sklearn/externals/joblib/parallel.py", line 138, in __init__
    self.results = func(*args, **kwargs)
  File "/Library/Python/2.7/site-packages/sklearn/cross_validation.py", line 1240, in _fit_and_score
    test_score = _score(estimator, X_test, y_test, scorer)
  File "/Library/Python/2.7/site-packages/sklearn/cross_validation.py", line 1296, in _score
    score = scorer(estimator, X_test, y_test)
  File "/Library/Python/2.7/site-packages/sklearn/metrics/scorer.py", line 176, in _passthrough_scorer
    return estimator.score(*args, **kwargs)
  File "/Library/Python/2.7/site-packages/sklearn/base.py", line 291, in score
    return accuracy_score(y, self.predict(X), sample_weight=sample_weight)
  File "/Library/Python/2.7/site-packages/sklearn/neighbors/classification.py", line 147, in predict
    neigh_dist, neigh_ind = self.kneighbors(X)
  File "/Library/Python/2.7/site-packages/sklearn/neighbors/base.py", line 332, in kneighbors
    return_distance=return_distance)
  File "binary_tree.pxi", line 1307, in sklearn.neighbors.kd_tree.BinaryTree.query (sklearn/neighbors/kd_tree.c:10506)
  File "binary_tree.pxi", line 226, in sklearn.neighbors.kd_tree.get_memview_DTYPE_2D (sklearn/neighbors/kd_tree.c:2715)
  File "stringsource", line 247, in View.MemoryView.array_cwrapper (sklearn/neighbors/kd_tree.c:24789)
  File "stringsource", line 147, in View.MemoryView.array.__cinit__ (sklearn/neighbors/kd_tree.c:23664)
ValueError: Invalid shape in axis 0: 0.

Еще одна странность: когда я использую cv = 5, я не получаю никаких предупреждений. Когда я делаю cv = 50, я получаю указанное выше предупреждение, которое выглядит странно. Потому что я думаю, что когда cv становится больше, даже если это может быть сложнее в вычислительном отношении, результат должен быть более точным. Есть ли какие-нибудь пробелы в моих рассуждениях? Почему я получаю предупреждение и ошибку?

Как правильно выполнить перекрестную проверку исключения по одному в этом сценарии?


person Sait    schedule 06.04.2015    source источник


Ответы (1)


По умолчанию cv = 5 для классификации выполняет стратифицированную 5-кратную перекрестную проверку. Это означает, что он пытается сохранить долю выборок из одного класса постоянной. Может случиться так, что это приведет к проблемам, если количество складок совпадает с количеством образцов. На какой у вас версии? Это сообщение об ошибке, конечно, не очень полезно.

Кстати, в общем, я бы посоветовал вам использовать StratifiedShuffleSplit для такого небольшого набора данных.

[править]: текущая версия выдает предупреждение, которое, вероятно, должно быть ошибкой:

sklearn / cross_validation.py: 399: Предупреждение: наименее заполненный класс в y имеет только 13 членов, что слишком мало. Минимальное количество меток для любого класса не может быть меньше n_folds = 68. % (min_labels, self.n_folds)), Предупреждение)

person Andreas Mueller    schedule 06.04.2015
comment
Он говорит: ВЕРСИЯ: 0.15.2. На самом деле я вообще не имел в виду использовать стратифицированную перекрестную проверку. Я хочу только провести перекрестную проверку с исключением одного. - person Sait; 06.04.2015
comment
Затем нужно пройти cv=KFold(5). В документации указано, что по умолчанию для классификации используется расслоение: scikit-learn.org/dev/modules/generated/ - person Andreas Mueller; 06.04.2015