Ошибка при реализации перекрестной проверки

#python #machine-learning #scikit-learn #cross-validation #k-fold

#python #машинное обучение #scikit-learn #перекрестная проверка #k-кратный

Вопрос:

Я пытаюсь оценить модель (MNIST) с помощью перекрестной проверки:

 from sklearn.model_selection import StratifiedKFold
from sklearn.base import clone
skfolds = StratifiedKFold(n_splits=5, random_state=42)
  

при запуске 3-й строки я получаю это предупреждение:

C:UsersnextgDesktopsample_projectenvlibsite-packagessklearnmodel_selection_split.py:293 : FutureWarning: Установка random_state не имеет никакого эффекта, поскольку shuffle имеет значение False. Это вызовет ошибку в 0.24. Вы должны оставить random_state по умолчанию (None) или установить shuffle=True. предупреждения.предупреждать(

Игнорируя предупреждение, я пишу этот код

 for train_index, test_index in skfolds.split(X_train, y_test_5):
   clone_clf = clone(sgd_clf)
   X_train_folds = X_train[train_index]
   y_train_folds = y_train[train_index]
   X_test_fold = X_test[test_index]
   y_test_fold = y_test_5[test_index]

   clone_clf.fit(X_train_folds, y_train_folds)
   y_pred = clone_clf.predict(X_test_fold)
   n_correct = sum(y_pred == y_test_fold)
   print(n_correct / len(y_pred))
  

После запуска этого кода ошибка

 ValueError                                Traceback (most recent call last)
<ipython-input-66-7e786591c439> in <module>
 ----> 1 for train_index, test_index in skfolds.split(X_train, y_test_5):
  2     clone_clf = clone(sgd_clf)
  3     X_train_folds = X_train[train_index]
  4     y_train_folds = y_train[train_index]
  5     X_test_fold = X_test[test_index]

 ~Desktopsample_projectenvlibsite- 
 packagessklearnmodel_selection_split.py in split(self, X, y, groups)
     326             The testing set indices for that split.
     327         """
 --> 328         X, y, groups = indexable(X, y, groups)
     329         n_samples = _num_samples(X)
     330         if self.n_splits > n_samples:

   ~Desktopsample_projectenvlibsite-packagessklearnutilsvalidation.py in indexable(*iterables)
    291     """
    292     result = [_make_indexable(X) for X in iterables]
--> 293     check_consistent_length(*result)
    294     return result
    295 

 ~Desktopsample_projectenvlibsite-packagessklearnutilsvalidation.py in check_consistent_length(*arrays)
    254     uniques = np.unique(lengths)
    255     if len(uniques) > 1:
--> 256         raise ValueError("Found input variables with inconsistent numbers of"
257                          " samples: %r" % [int(l) for l in lengths])
258 

 ValueError: Found input variables with inconsistent numbers of samples: [60000, 10000]
  

Может ли кто-нибудь помочь устранить ошибку

Комментарии:

1. Где именно появляется ошибка — в fit или в predict ? Пожалуйста, обновите свой вопрос с полной трассировкой.

2. Спасибо за ответ. Проблема заключается в 3-й строке кода перед подгонкой или прогнозированием. Модель уже работает. С помощью этого кода я пытаюсь оценить свою модель. при оценке я получил предупреждение о будущем.

3. Пожалуйста, укажите точно в вопросе. Я говорю об ошибке, не предупреждении (которое само по себе объяснимо).

4. Я обновил полную ошибку. Должен ли я написать всю модель MNIST для лучшего понимания ошибки.

Ответ №1:

Это работает:

 from sklearn.model_selection import StratifiedKFold
from sklearn.base import clone

skfolds = StratifiedKFold(n_splits=3, random_state=42, shuffle=True)

for train_index, test_index in skfolds.split(X_train, y_train_5):  
    clone_clf = clone(sgd_clf)
    X_train_folds = X_train.values[train_index]
    y_train_folds = y_train_5[train_index]
    X_test_fold = X_train.values[test_index]
    y_test_fold = y_train_5[test_index]
    
    clone_clf.fit(X_train_folds, y_train_folds)
    y_pred = clone_clf.predict(X_test_fold)
    n_correct = sum(y_pred == y_test_fold)
    print(n_correct / len(y_pred))
  

Ответ №2:

Это выражение не имеет смысла: skfolds.split(X_train, y_test_5) .

Это должно быть skfolds.split(X, y) с X.shape[0] == y.shape[0]

Из документа:

 for train_index, test_index in skf.split(X, y):
    print("TRAIN:", train_index, "TEST:", test_index)
    X_train, X_test = X[train_index], X[test_index]
    y_train, y_test = y[train_index], y[test_index]
  

Ответ №3:

Это должно быть skfolds.split(X_train, y_train_5) не skfolds.split(X_train, y_test_5) , и во 2-й строке цикла for его y_test_fold = y_train_5[test_index] нет y_train_folds = y_train[train_index]

Вся проблема началась из-за клавиши tab.

Ответ №4:

Глядя на ваш код и предполагая, что вы разделяете (самостоятельно данные), вы переходите к X_train и y_test_5.

И для ошибки, которую вы получили, у вас есть 6000 выборок для поезда и 1000 выборок для теста. Вот почему возникает ошибка (разные размеры матрицы (формы)).

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

Надеюсь, это поможет!!!