#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 уже будет знать изображения, и это сделает алгоритм бесполезным).
Надеюсь, это поможет!!!