Изменения

Перейти к: навигация, поиск

Кросс-валидация

2050 байт добавлено, 14:09, 25 марта 2020
k-fold кросс-валидация
<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
mnist = fetch_openml('mnist_784', version=1)
X, y = mnist["data"], mnist["target"]
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) #классификатор на основе метода стохастического градиентного спуска (Stochastic Gradient Descent SGD)
# Разбиваем обучающий набора на 3 блока,
# выработку прогнозов и их оценку осуществляем на каждом блоке с использованием модели, обученной на остальных блоках
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
=== t×k-fold кросс-валидация ===
187
правок

Навигация