Разница между cross_val_score и другим способом вычисления точности - PullRequest
0 голосов
/ 09 сентября 2018

Я пытался вычислить точность и был озадачен тем фактом, что cross_val_score дает довольно низкий результат, чем при сравнении предсказанных результатов с правильными.

Первый способ подсчета, который дает

[0.8033333333333333, 0.7908333333333334, 0.8033333333333333, 0.7925,0.8066666666666666]

kf = KFold(shuffle=True, n_splits=5)
scores = []

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]

    model = KNeighborsClassifier(n_jobs=-1, n_neighbors=5)
    model.fit(X_train, y_train)

    y_pred = model.predict(X_test)

    scores.append(np.sum(y_pred == y_test) / len(y_test))

Второй способ дает array([0.46166667, 0.53583333, 0.40916667, 0.44666667, 0.3775 ]):

model = KNeighborsClassifier(n_jobs=-1, n_neighbors=5)
cross_val_score(model, X, y, cv = 5, scoring='accuracy')

В чем моя ошибка?

Ответы [ 2 ]

0 голосов
/ 10 сентября 2018

cross_val_score будет использовать итератор StratifiedKFold cv, если не указано иное. StratifiedKFold сохранит соотношение классов, сбалансированное одинаково, при разделении на поезда и тесты. Для более подробного объяснения см. Мой другой ответ здесь: -

С другой стороны, при первом подходе вы используете KFold, который не будет поддерживать баланс классов. Кроме того, вы делаете перетасовку данных в этом.

Таким образом, в каждом сгибе есть разница в данных в ваших двух подходах и, следовательно, разные результаты.

0 голосов
/ 10 сентября 2018

Низкий балл в cross_val_score, вероятно, связан с тем, что вы предоставляете ему полные данные, а не разбиваете их на тестовые и обучающие наборы. Как правило, это приводит к утечке информации, в результате чего ваша модель дает неверные прогнозы. См. этот пост для более подробного объяснения.

Ссылки

...