scikit-learn
Выбор модели
Поиск…
Перекрестная проверка
Изучение параметров функции прогнозирования и тестирование ее на одних и тех же данных является методологической ошибкой: модель, которая только что повторила бы метки образцов, которые она только что увидела, имела бы идеальный результат, но не смогла бы предсказать ничего полезного, невидимые данные. Эта ситуация называется переопределением . Чтобы избежать этого, обычно при проведении (контролируемого) теста машинного обучения удерживать часть доступных данных в качестве тестового набора X_test, y_test
. Обратите внимание, что слово «эксперимент» не предназначено для обозначения академического использования, потому что даже в коммерческих условиях машинное обучение обычно начинается экспериментально.
В scikit-learn случайное разделение на тренировки и тестовые наборы можно быстро вычислить с помощью вспомогательной функции train_test_split . Давайте загрузим набор данных диафрагмы, чтобы он соответствовал линейной машине поддержки вектора:
>>> import numpy as np
>>> from sklearn import cross_validation
>>> from sklearn import datasets
>>> from sklearn import svm
>>> iris = datasets.load_iris()
>>> iris.data.shape, iris.target.shape
((150, 4), (150,))
Теперь мы можем быстро опробовать учебный набор, одновременно проведя 40% данных для тестирования (оценки) нашего классификатора:
>>> X_train, X_test, y_train, y_test = cross_validation.train_test_split(
... iris.data, iris.target, test_size=0.4, random_state=0)
>>> X_train.shape, y_train.shape
((90, 4), (90,))
>>> X_test.shape, y_test.shape
((60, 4), (60,))
Теперь, после того, как у нас есть тренировочные и тестовые наборы, давайте использовать его:
>>> clf = svm.SVC(kernel='linear', C=1).fit(X_train, y_train)
>>> clf.score(X_test, y_test)
Проверка K-Fold Cross
Кросс-валидация K-fold - это систематический процесс повторения процедуры разделения поездов / испытаний несколько раз, чтобы уменьшить дисперсию, связанную с одним испытанием разделения поездов / испытаний. Вы по существу разделяете весь набор данных на K равными размерами «складки», и каждая сводка используется один раз для тестирования модели и K-1 раз для обучения модели.
В библиотеке scikit имеется несколько методов сгибания. Их использование зависит от характеристик входных данных. Некоторые примеры
K-Fold
Вы по существу разделяете весь набор данных на K равными размерами «складки», и каждая сводка используется один раз для тестирования модели и K-1 раз для обучения модели.
from sklearn.model_selection import KFold
X = np.array([[1, 2], [3, 4], [5, 6], [7, 8]])
y = np.array([1, 2, 1, 2])
cv = KFold(n_splits=3, random_state=0)
for train_index, test_index in cv.split(X):
... print("TRAIN:", train_index, "TEST:", test_index)
TRAIN: [2 3] TEST: [0 1]
TRAIN: [0 1 3] TEST: [2]
TRAIN: [0 1 2] TEST: [3]
StratifiedKFold
- это вариация k-fold, которая возвращает слоистые складки: каждый набор содержит примерно одинаковый процент выборок каждого целевого класса в качестве набора
ShuffleSplit
Используется для генерации определенного пользователем количества независимых разделов набора данных поезда / теста. Образцы сначала перетасовываются, а затем разбиваются на пару поездов и испытательных комплектов.
from sklearn.model_selection import ShuffleSplit
X = np.array([[1, 2], [3, 4], [5, 6], [7, 8]])
y = np.array([1, 2, 1, 2])
cv = ShuffleSplit(n_splits=3, test_size=.25, random_state=0)
for train_index, test_index in cv.split(X):
... print("TRAIN:", train_index, "TEST:", test_index)
TRAIN: [3 1 0] TEST: [2]
TRAIN: [2 1 3] TEST: [0]
TRAIN: [0 2 1] TEST: [3]
StratifiedShuffleSplit
- это вариация ShuffleSplit, которая возвращает слоистые расщепления, то есть создает разделители, сохраняя одинаковый процент для каждого целевого класса, как в полном наборе.
Другие методы складывания, такие как Leave One / p Out и TimeSeriesSplit (вариация K-fold) доступны в библиотеке scicit model_selection.