В этом посте я проведу вас через простое упражнение, чтобы понять два распространенных способа разделения данных на обучающий набор и тестовый набор в scikit-learn. Блокнот Jupyter доступен здесь.

Давайте начнем и создадим список чисел от 0 до 9 Python с помощью range ():

X =  list(range(10))
print (X)
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

Затем мы создаем другой список, который содержит квадратные значения чисел в X, используя понимание списка:

y = [x*x for x in X]
print (y)
[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]

Затем мы импортируем model_selection из scikit-learn и используем функцию train_test_split (), чтобы разделить наши данные на два набора:

import sklearn.model_selection as model_selection
X_train, X_test, y_train, y_test = model_selection.train_test_split(X, y, train_size=0.75,test_size=0.25, random_state=101)
print ("X_train: ", X_train)
print ("y_train: ", y_train)
print(“X_test: ", X_test)
print ("y_test: ", y_test)
X_train:  [4, 9, 3, 5, 7, 6, 1]
y_train:  [16, 81, 9, 25, 49, 36, 1]
X_test:  [8, 2, 0]
y_test:  [64, 4, 0]

Указывая для параметра train_size значение 0,75, мы стремимся поместить 75% данных в наш обучающий набор, а остальные данные - в набор тестов. Поскольку у нас есть только десять точек данных, программа автоматически округлила соотношение до 7: 3. Можно опустить параметр test_size, если вы уже указали train_size и не возражаете против надоедливого предупреждающего сообщения :)

Другое наблюдение заключается в том, что числа в списках после разделения не следуют тому же порядку возрастания, что и раньше. Другими словами, по умолчанию программа игнорирует исходный порядок данных. Он случайным образом выбирает данные для формирования набора для обучения и тестирования, что обычно является желательной функцией в реальных приложениях, чтобы избежать возможных артефактов, существующих в процессе подготовки данных. Чтобы отключить эту функцию, просто установите для параметра перемешивания значение False (по умолчанию = True).

Вы, наверное, видели, как люди используют cross_validation.train_test_split () для решения сложных задач. Фактически, это просто старый способ сделать то же самое. Сделайте следующее

import sklearn.cross_validation as cross_validation
X_train, X_test, y_train, y_test = cross_validation.train_test_split(X, y, train_size=0.75, random_state=101)

будет генерировать точно такие же выходные данные, что и выше, при условии, что мы присвоили тот же номер Random_state. Если вы хотите, чтобы ваши результаты были стохастическими каждый раз, просто оставьте для него значение по умолчанию «Нет».

Я предполагаю, что вы уже знакомы с концепцией перекрестной проверки. В scikit-learn вы можете использовать функцию KFold (), чтобы разделить набор данных на n последовательных складок.

from sklearn.model_selection import KFold
import numpy as np
kf = KFold(n_splits=5)
X = np.array(X)
y = np.array(y)
for train_index, test_index in kf.split(X):
    X_train, X_test = X[train_index], X[test_index]
    y_train, y_test = y[train_index], y[test_index]
    print(“X_test: ", X_test)
X_test: [0 1]
X_test: [2 3]
X_test: [4 5]
X_test: [6 7]
X_test: [8 9]

Если указать для параметра n_splits значение 5, оба набора X и y были разделены на пять складок (наборы y теперь показаны здесь). Вы, наверное, заметили, что на этот раз программа всегда выбирала два соседних числа из исходных наборов данных, что означает, что точки данных не перемешивались (почему настройка параметра перемешивания по умолчанию здесь отличается от настройки в train_test_split ?) Тем не менее, используйте

kf = KFold (n_splits = 5, перемешать = True)

даст вам тот же эффект смешивания для исходных наборов данных, что мы видели раньше.

Кроме того, scikit-learn предоставляет полезные встроенные функции для расчета показателей ошибок нескольких наборов тестов для оценки моделей машинного обучения. Например,

model_selection.cross_val_score (модель, X, y, cv = kf, scoring =‘ neg_mean_absolute_error ’)

сообщит один балл средней абсолютной ошибки.

Не стесняйтесь создать свой собственный блокнот jupyter и поэкспериментировать с этими функциями! Повеселись!