Причина, по которой все учебники рекомендуют вам использовать train_test_split
из sklearn.model.selection
, заключается в том, что они предполагают, что вы захотите оценить производительность вашей модели обучения и, возможно, настроить ее гиперпараметры, прежде чем, наконец, использовать ее для создания прогнозов дляваш тестовый набор данных.
Эта практика называется отложением набора "перекрестной проверки".Для этого вы на некоторое время оставляете свой тестовый набор нетронутым и фактически отделяете около 20% строк своего тренировочного набора.Вы тренируете свою модель на 80% строк вашего обучающего набора и используете эту модель для генерации прогнозов на оставшиеся 20% вашего тренировочного набора.
Вы можете выбрать показатель, например, точность , чтобы оценить производительность вашей модели.Часто именно в этот момент вам захочется поэкспериментировать с опробованием различных значений для гиперпараметров вашей модели, и посмотреть, есть ли его оценка в проверочном наборе (последние 20% обучающего набора).) улучшается.
Метод train_test_split
- это простой способ разбить данные о тренировках на эти 80/20 порций.Я рекомендую вам не пропустить этот шаг.Причина в том, что если вы измените свою модель или ее гиперпараметры после наблюдения, насколько хорошо она работает на вашем фактическом тестовом наборе , вы потеряете все основания для того, чтобы знать, как ваша модель будет работать на совершенно новых, реальныхмировые данные.
Это называется «подгонкой к тестовому набору», и это распространенная ошибка практики, которая приводит к моделям машинного обучения, которые действительно хорошо работают с набором ранее собранных данных, и все же (к удивлению ихсоздатели) в конечном итоге довольно ужасно работают с реальными данными, которые эти модели видят, когда они, наконец, запущены в производство.
Подводя итог, можно сказать, что вы:
- Trainна 80% данных о вашем поезде.
- Оцените на 20% данных о вашем поезде.
- Измените свою модель, пока вы не будете удовлетворены тем, как она оценивает данные, использованные в шаге (2.).
- Наконец, только в конце используйте свою модель для прогнозирования реальных тестовых данных.
Кстати, присвоение Склеарну метода train_test_split
несколько сбивает с толку, потому что цельметода является создание набора проверки.(train_val_split
может показаться мне более интуитивным именем ...)
Вот шаги в коде, я полагаю, вы хотели бы следовать, учитывая вашу конкретную ситуацию (данные разбиты на несколько.TXT-файлы):
- Импортирует модули и все ваши обучающие файлы .csv:
import pandas as pd
import numpy as np
from sklearn.metrics import accuracy_score
from sklearn.svm import SVC
from sklearn.model_selection import train_test_split
X_edu = pd.read_csv('Training/education.txt')
X_hor = pd.read_csv('Training/horror.txt')
...
Создайте столбец
Genre
в кадре данных каждого жанра, а затем объедините все это в один кадр данных:
train_dfs = [X_edu, X_hor, ...]
genres = ['edu', 'hor', ...]
for i, genre in enumerate(genres):
train_dfs[i]['Genre'] = genre
X = pd.concat[train_dfs].reset_index(drop=True) # reset the index so each row has a unique index
# important so we can be sure we can properly match each row with its label
Извлеките метки из обучающих данных (я предполагаю, что метки находятся в столбце с названием
Genre
или чем-то похожим) и удалите столбец
videoID
(так как не кажется, что это прогнозирующая функция):
y = X['Genre']
X = X.drop(['Genre', 'videoID'], axis=1)
Используйте
train_test_split
для создания ваших обучающих и проверочных наборов (приятный бонус:
train_test_split
автоматически перетасовывает строки всего вашего учебного информационного кадра перед его разбиением, поэтому вам не придется беспокоиться о том, что некоторые жанры не будут в вашей проверкенабор):
X_train, X_val, y_train, y_val = train_test_split(X, y, test_size = 0.20)
Установите вашу модель на
X_train
и сделайте прогноз на
X_val
:
clf = SVC()
clf.fit(X_train, y_train)
preds = clf.predict(X_val)
Проверьте производительность вашей модели на основе этих прогнозов, сделанных для набора проверки (здесь я использую точность, но вы можете использовать любую метрику, какую пожелаете - у Sklearn, вероятно, есть класс для любой метрики, которую вы хотите использовать.)
val_acc = accuracy_score(y_val, preds)
Поэкспериментируйте с различными значениями для гиперпараметров вашего ученика SVM и повторите шаги (5.) и (6.) выше.Когда вы будете удовлетворены производительностью вашей модели, сейчас самое время создать прогнозы для ваших реальных данных испытаний.
Вы можете загрузить в свой тестовый файл .csv для каждого жанра и собрать их все вместе в один информационный кадр, как вы это делали для своих тренировочных данных выше:
test_edu = pd.read_csv('Training/education.txt')
test_hor = pd.read_csv('Training/horror.txt')
...
test_dfs = [test_edu, test_hor, ...]
for i, genre in enumerate(genres):
test_dfs[i]['Genre'] = genre
test = pd.concat[test_dfs].reset_index(drop=True) # reset the index so each row has a unique index
y_test = test['Genre']
X_test = test.drop(['Genre', 'videoID'], axis=1)
test_preds = clf.predict(X_test)
test_acc = accuracy_score(y_test, test_preds)
И этоОценка точности набора тестов должна дать вам наиболее реалистичную оценку того, как будет выглядеть ваша модель, если ее попросят сделать прогноз для нового видео, которое она никогда не видела раньше.