Различные оценки R-квадрата в разное время - PullRequest
0 голосов
/ 13 июля 2020

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

Это код для построения модели регрессии, и результат в R-квадрате был примерно 0,5:

from sklearn.datasets import load_boston
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LinearRegression
import matplotlib.pyplot as plt
import numpy as np
boston = load_boston()
X = boston.data
y = boston['target']
X_rooms = X[:,5]
X_train, X_test, y_train, y_test = train_test_split(X_rooms, y)
reg = LinearRegression()
reg.fit(X_train.reshape(-1,1), y_train)
prediction_space = np.linspace(min(X_rooms), max(X_rooms)).reshape(-1,1)
plt.scatter(X_test, y_test)
plt.plot(prediction_space, reg.predict(prediction_space), color = 'black')
reg.score(X_test.reshape(-1,1), y_test)

Теперь, когда я даю перекрестную проверку для X_train, X_test и X (соответственно), он показывает разные значения R-квадрат.

Вот аргументы X_test и y_test:

from sklearn.model_selection import cross_val_score
cv = cross_val_score(reg, X_test.reshape(-1,1), y_test, cv = 8)
cv

Результат:

array([ 0.42082715,  0.6507651 , -3.35208835,  0.6959869 ,  0.7770039 ,
        0.59771158,  0.53494622, -0.03308137])

Теперь, когда я использую аргументы, X_train и y_train, выводятся разные результаты.

from sklearn.model_selection import cross_val_score
cv = cross_val_score(reg, X_train.reshape(-1,1), y_train, cv = 8)
cv

Результат:

array([0.46500321, 0.27860944, 0.02537985, 0.72248968, 0.3166983 ,
       0.51262191, 0.53049663, 0.60138472])

Теперь, когда я снова ввожу другие аргументы; на этот раз X (который в моем случае - X_rooms) и y, я снова получаю разные значения R-квадрат.

from sklearn.model_selection import cross_val_score
cv = cross_val_score(reg, X_rooms.reshape(-1,1), y, cv = 8)
cv

Результат:

array([ 0.61748403,  0.79811218,  0.61559222,  0.6475456 ,  0.61468198,
       -0.7458466 , -3.71140488, -1.17174927])

Какой из них я должен использовать ?

Я знаю, что это длинный вопрос, поэтому спасибо !!

1 Ответ

1 голос
/ 13 июля 2020

Набор поездов должен явно использоваться для обучения вашей модели, а набор тестов предназначен для окончательной оценки. Но, к сожалению, вам нужно протестировать оценку вашей модели на каком-то наборе, прежде чем проверять его на конечном результате (наборе тестов): например, когда вы пытаетесь настроить некоторые гиперпараметры. Есть и другие причины использовать cv, это только одна из них.

Обычно процесс следующий:

  • Разделить поезд и тест
  • Модель поезда использует cv для проверьте стабильность, включая параметры гипер-настройки (что не имеет значения в вашем случае)
  • Оцените оценку модели на тестовом наборе.

scikit-learn cross_val_score получает объект (перед обучением !) и данные. Он каждый раз тренирует модель на разных участках данных, а затем возвращает результат. Это похоже на множество проверок «поезд-тест».

Следовательно, вы должны:

from sklearn.model_selection import cross_val_score
reg = LinearRegression()
cv = cross_val_score(reg, X_train.reshape(-1,1), y_train, cv = 8)

только на наборе поездов. Набор тестов следует использовать для других целей.

Вы получите список показателей точности. Вы можете увидеть, является ли ваша модель стабильной (находится ли точность в одном диапазоне для всех складок?) Или общие характеристики модели (средняя оценка)

...