187
правок
Изменения
→k-fold кросс-валидация
Но, конечно же, без минусов нельзя. Проблема ''MASE'' в том, что её тяжело интерпретировать. Например, ''MASE''=1.21 ни о чём, по сути, не говорит. Это просто означает, что ошибка прогноза оказалась в 1.21 раза выше среднего абсолютного отклонения ряда в первых разностях, и ничего более.
== k-fold кроссКросс-валидация ==
Хороший способ оценки модели предусматривает применение [[Кросс-валидация|кросс-валидациявалидации]], как делалось в главе 2# Обучающая выборка разбивается на <tex> k </tex> непересекающихся одинаковых по объему частей;# Производится <tex> k </tex> итераций. На каждой итерации происходит следующее:## Модель обучается на <tex> k - 1 </tex> части обучающей выборки;## Модель тестируется на части обучающей выборки, которая не участвовала в обучении.Каждая из <tex>k</tex> частей единожды используется для тестирования. Как правило, <tex>k = 10</tex> (5 в случае малого размера выборки). [[Файл:K-fold-validation.png|500px]] <tex>T^l = F_1 \cup \dots \cup F_k, |F_i| \approx \frac{l}{k}, \\ CV_k = \frac{1}{k} \sum_{i=1}^{k} Q(\mu(T^l \setminus F_i),F_i) \to min </tex>. <font color="green"># Пример кода для k-fold кросс-валидация:</font> ''' '''import numpy as np '''from sklearn.model_selection import StratifiedKFold '''from sklearn.datasets import fetch_openml '''from sklearn.base import clone '''from sklearn.linear_model import SGDClassifier ''' '''mnist = fetch_openml('mnist_784', version=1) '''X, y = mnist["data"], mnist["target"] '''some_digit = X[0] # признаки цифры пять '''some_digit_image = some_digit.reshape(28, 28) '''y = y.astype(np.uint8) '''X_train, X_test, y_train, y_test = X[:60000], X[60000:], y[:60000], y[60000:] '''y_train_5 = (y_train == 5) # True для всех пятерок, False для в сех остальных цифр '''y_test_5 = (y_test == 5) '''sgd_clf = SGDClassifier(random_state=42) '''sgd_clf.fit(X_train, y_train_5) '''sgd_clf.predict([some_digit]) '''skfolds = StratifiedKFold(n_splits=3, random_state=42) '''for train_index, test_index in skfolds.split(X_train, y_train_5): ''''' ''''' clone_clf = clone(sgd_clf) ''''' X_train_folds = X_train[train_index] ''''' y_train_folds = y_train_5[train_index] ''''' X_test_fold = X_train[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)) '''''# print 0.95035, 0.96035, 0.9604
== Примечания ==