Ошибка склеарна: оценка R ^ 2 не определена менее чем с двумя образцами - PullRequest
0 голосов
/ 27 марта 2020

Я собрал data.csv, чтобы увидеть, как это работает. Итак, я сделал это.

s1;s2;s3;s4;result
1;2;3;4;5;15
2;1;3;1;2;9
19;21;0;0;0;40
11;9;0;1;5;26
5;5;5;5;5;25
80;1;1;1;1;84
1;2;3;1;1;8
1;0;0;1;1;3
10;10;10;10;20;60

Как видите, result - это сумма s1,s2,s3 and s4. Итак, я сделал это.

data = pd.read_csv('example.csv', sep=';', index_col=0)
data = data[['s1', 's2', 's3', 's4', 'result']]
predict = 'result'


x = np.array(data.drop([predict], 1))
y = np.array(data[predict])

x_train, x_test, y_train, y_test = sklearn.model_selection.train_test_split(x, y, test_size=0.1)

linear = linear_model.LinearRegression()
linear.fit(x_train, y_train)

acc = linear.score(x_test, y_test)
print(acc)

Но я получил эту ошибку.

C: \ Users \ Sharki \ Anaconda3 \ lib \ site-packages \ sklearn \ metrics \ regression.py: 543: UndefinedMetricWarning: оценка R ^ 2 не определена с меньшим, чем два образца. warnings.warn (msg, UndefinedMetricWarning)

Что происходит?

1 Ответ

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

Причина в том, что вы запросили слишком низкое значение test_size в вашем train_test_split; test_size=0.1 в вашем наборе данных, состоящем только из 10 строк, соответствует одной точке данных в вашем наборе тестов:

x_test, y_test
# (array([[2, 3, 4, 5]]), array([15]))

, следовательно, ошибка (фактически предупреждение, поскольку nan было возвращено).

Измените его как минимум на 0,2:

x_train, x_test, y_train, y_test = train_test_split(x, y, test_size=0.2, random_state=42)
[...]
print(acc)
# -88.65298209559413

x_train, x_test, y_train, y_test = train_test_split(x, y, test_size=0.3, random_state=42)
[...]
print(acc)
# -0.5210446297916358

и подготовьтесь к диким колебаниям в результирующем R ^ 2 (как уже показано в примерах выше) из-за очень маленький размер ваших данных.

Дополнительно , обратите внимание, что в вашем CSV-файле фактически есть 6 полей, но только 5 имен столбцов, в результате pandas интерпретирует первый столбец как индекс при чтении кадра данных (обратите внимание на то, что 1 отсутствует в переменной x_test, показанной выше). Вы должны добавить s5 в заголовок и удалить index_col=0, то есть:

data = pd.read_csv('example.csv', sep=';')

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

Не имеет значения для Ваш вопрос, но обозначать R ^ 2 как acc (подразумевая точность) не является хорошей практикой, поскольку R2 и точность являются различными показателями производительности, а точность не имеет значения в задачах регрессии (она имеет смысл только в классификации).

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