Следует ли проводить перекрестную валидацию по исходным или разделенным данным? - PullRequest
0 голосов
/ 19 марта 2020

Когда я хочу оценить свою модель с помощью перекрестной проверки, должен ли я выполнять перекрестную проверку на оригинале (данные, которые не делятся на данные об обучении и тестировании) или на данные об обучении / тестировании?

Я знаю, что данные об обучении используется для подгонки модели и тестирования для оценки. Если я использую перекрестную проверку, я все равно должен разделить данные на обучающие и тестируемые или нет?

features = df.iloc[:,4:-1]
results = df.iloc[:,-1]

x_train, x_test, y_train, y_test = train_test_split(features, results, test_size=0.3, random_state=0)

clf = LogisticRegression()
model = clf.fit(x_train, y_train)

accuracy_test = cross_val_score(clf, x_test, y_test, cv = 5)

Или я должен сделать это так:

features = df.iloc[:,4:-1]
results = df.iloc[:,-1]

clf = LogisticRegression()
model = clf.fit(features, results)

accuracy_test = cross_val_score(clf, features, results, cv = 5)), 2)

Или, может быть, что-то другое?

Ответы [ 2 ]

1 голос
/ 19 марта 2020

Оба ваших подхода неверны.

  • В первом из них вы применяете перекрестную проверку к набору test , который не имеет смысла

  • Во втором случае вы сначала подгоняете модель к целым данным, а затем выполняете перекрестную проверку, что опять же не имеет смысла. Более того, этот подход избыточен (ваш установленный clf не используется методом cross_val_score, который выполняет свою собственную подгонку)

Поскольку вы не выполняете никакой настройки гиперпараметра (т.е. вас, кажется, интересует только оценка производительности), есть два способа:

  • Либо с отдельным набором тестов
  • Или с перекрестной проверкой

Первый способ (набор тестов):

from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score

x_train, x_test, y_train, y_test = train_test_split(features, results, test_size=0.3, random_state=0)

clf = LogisticRegression()
model = clf.fit(x_train, y_train)

y_pred = clf.predict(x_test)

accuracy_test = accuracy_score(y_test, y_pred)

Второй способ (перекрестная проверка):

from sklearn.model_selection import cross_val_score
from sklearn.metrics import accuracy_score
from sklearn.utils import shuffle

clf = LogisticRegression()

# shuffle data first:
features_s, results_s = shuffle(features, results)
accuracy_cv = cross_val_score(clf, features_s, results_s, cv = 5, scoring='accuracy')

# fit the model afterwards with the whole data, if satisfied with the performance:
model = clf.fit(features, results)
0 голосов
/ 19 марта 2020

Я постараюсь обобщить «лучшие практики» здесь:

1) Если вы хотите обучить вашу модель, настроить параметры и сделать окончательную оценку, я рекомендую вам разбить ваши данные на training | val | test.

Вы подходите для своей модели, используя деталь training, а затем проверяете различные комбинации параметров в детали val. Наконец, когда вы уверены, какой классификатор / параметр получает наилучший результат в части val, вы оцениваете в test, чтобы получить окончательный остаток.

Как только вы оцениваете в части test , вам больше не следует изменять параметры.

2) С другой стороны, некоторые люди следуют другим путем, они разбивают свои данные на training и test и тонко настраивают свою модель, используя перекрестные - проверка на обучающей части, и в конце они оценивают ее на test части.

Если ваши данные достаточно велики, я рекомендую использовать первый способ, но если ваши данные небольшие, то 2.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...