Как исправить странные предсказания результатов в scikit-learn - PullRequest
0 голосов
/ 13 января 2019

У меня есть простой пример в scikit-learn для прогнозирования. Вот мой файл данных (data.csv):

first second third target1 target2
 800   400    240    400     25
 400   200    120    200     50
 200   100    60     100     100
 100   50     30     50      200
 50    25     15     25      400

функции включают в себя: первое, второе и третье

цели включают в себя: target1 и target2

Теперь я хочу предоставить новые значения для объектов и прогнозировать target1 и target2. Как видите, существует тенденция между значениями объектов и значениями target1 и target2:

При удвоении значений признаков значение target1 также удваивается, а значение target2 уменьшается вдвое

Например, если я предоставлю значения: 1600, 800 и 480 для первой, второй и третьей функций, я ожидаю получить 800 и 12,5 для target1 и target2 соответственно. Вот код:

import pandas as pd
from sklearn.model_selection import train_test_split
from collections import *
from sklearn.linear_model import LinearRegression

features = pd.read_csv('data.csv')

features.head()
features_name = ['first' , 'second' , 'third']
target_name = ['target1','target2']

X = features[features_name]
y = features[target_name]

# Split the data into training and testing sets
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size = 0.155, random_state = 42)

linear_regression_model = LinearRegression()
linear_regression_model.fit(X_train,y_train)

new_data  = OrderedDict([('first',1600) ,('second',800),('third',480) ])
new_data = pd.Series(new_data).values.reshape(1,-1)
ss = linear_regression_model.predict(new_data)

print (ss)

Вот вывод:

[[ 800.         -284.58549223]]

Как вы можете видеть, прогнозируемое значение для target1 точно соответствует ожидаемому , в то время как прогнозируемое значение для target2 (-284.58) далеко от ожидаемого (12.5)

Кто-нибудь знает, что здесь не так и как я могу решить эту проблему? Заранее спасибо за помощь.

1 Ответ

0 голосов
/ 13 января 2019

Изменить: нет линейной корреляции между вашими входами (любой из них, они по сути все одинаковы) и вашей целью2. Кажется, это экспоненциальный спад. Попробуйте преобразовать вашу функцию в другую функцию (1 / exp (x)), а затем вы можете выполнить линейную регрессию для этой функции

Edit2: моя ошибка, это просто 1 / x

Также .. (оригинальный пост ниже) Я не эксперт, но кажется, что ваши входные функции не только сильно коррелированы, они фактически идеально коррелированы (то есть линейная корреляция) - это обычно приводит к разрывам регрессии. Интуитивно понятная причина заключается в том, что поскольку они коррелированы, существует бесконечное количество возможных коэффициентов, в которых они противостоят друг другу, и прогноз все равно будет таким же (представьте, что в вашем случае первая секунда точно такая же, как 2 первая 3 секунды или 0-первая секунда и т. д.). Я также думаю, что это приводит к тому, что нормальное уравнение линейной регрессии генерирует матрицу, которая не может быть инвертирована ..

...