SVR: прогнозируемые значения далеки от фактических, несмотря на высокий r-квадрат и низкий MSE - PullRequest
0 голосов
/ 27 мая 2018

Я обучил модель SVR, используя scikit learn, которая предсказывает будущую цену биткойна, используя цену его закрытия в предыдущие даты.Я преобразовал дату в дельту из первой доступной даты, используя следующую функцию:

btc['Date'] = pd.to_datetime(btc['Date'])     
btc['date_delta'] = (btc['Date'] - btc['Date'].min())  / np.timedelta64(1,'D')

Голова моего информационного кадра выглядит примерно так:

<table>
  <tr>
    <th>date_delta</th>
    <th>Close</th>
  </tr>
  <tr>
    <td>1654.0</td>
    <td>7144.38</td>
  </tr>
  <tr>
    <td>1653.0</td>
    <td>7022.76</td>
  </tr>
</table>

Затем я делю набор тестовых и тренировочных данных следующим образом:

msk = np.random.rand(len(btc_select)) < 0.8
btc_train = btc_select[msk]
btc_test = btc_select[~msk]

и выполняю минимальное максимальное масштабирование набора данных перед тренировкой модели следующим образом.:

from sklearn.preprocessing import MinMaxScaler
scaler = MinMaxScaler()
scaler.fit(btc_train)
btc_train = scaler.transform(btc_train)
btc_test = scaler.transform(btc_test)

Моя модель обучена с использованием следующей функции, и я считаю, что полиномиальное ядро ​​дает наилучший результат:

def predict_prices(dates_train, prices_train, dates_test, price_test):
    dates_train=np.reshape(dates_train, (len(dates_train),1))
    dates_test=np.reshape(dates_test, (len(dates_test),1))
    svr_lin = SVR(kernel='linear', C=1e3)
    svr_poly = SVR(kernel = 'poly', C=1e3, degree=8)
    svr_rbf = SVR(kernel='rbf', C=1e3, gamma=0.8)
    svr_lin.fit(dates_train,prices_train)
    svr_poly.fit(dates_train,prices_train)
    svr_rbf.fit(dates_train,prices_train)
    plt.figure(figsize=(14,10))
    plt.scatter(dates_train, prices_train, color='black', label='Data')
    plt.plot(dates_train, svr_rbf.predict(dates_train), color='red', label='RBF model')
    plt.plot(dates_train, svr_lin.predict(dates_train), color='green', label='Linear model')
    plt.plot(dates_train, svr_poly.predict(dates_train), color='blue', label='Polynomial model')
    plt.xlabel('Date')
    plt.ylabel('Price')
    plt.title('Support Vector Regression')
    plt.legend()
    plt.show()
    print('Lin Score:', svr_lin.score(dates_test, price_test))
    print('Poly Score:', svr_poly.score(dates_test, price_test))
    print('Rbf Score:', svr_rbf.score(dates_test, price_test))
    scores = cross_val_score(svr_poly, dates_train, prices_train, cv=6, scoring='neg_mean_squared_error')
    accuracy = metrics.r2_score(price_test, svr_poly.predict(dates_test))
    print('R-Squared Value for the Polynomial Kernel:', accuracy)
    print('Cross Validation Mean Squared Error for the Polynomial Kernel:', scores)
    return svr_poly

Я получаю следующие оценки точности и перекрестной проверки:

Lin Score: 0.3290332147578777
Poly Score: 0.8724266575682722
Rbf Score: 0.836449334307112
R-Squared Value for the Polynomial Kernel: 0.8724266575682722
Cross Validation Mean Squared Error for the Polynomial Kernel: [-0.13853584 -0.00069995 -0.00043713 -0.00041959 -0.00341142 -0.00352207]

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

transform_inp = scaler.transform([[1654.0,0.0]])
transform_inp[0,0]
1.000604960677556

predicted_val = model.predict(np.array(transform_inp[0,0]))
predicted_val
array([0.73674025])

Теперь, делая обратное преобразование, я получаю следующее:

scaler.inverse_transform([[predicted_val[0],0]])
array([[1217.83164131,   68.43      ]])

Вывод 1217 долларов США, что далеко от фактической цены7144 грн.Подскажите, пожалуйста, что здесь не так?

1 Ответ

0 голосов
/ 28 мая 2018

Много вещей, чтобы сказать:

  1. Я не совсем понимаю, какова ваша цель: в основном, вы пытаетесь сопоставить количество дней с даты отправления с ценой BTCкоторые на самом деле не связаны (числовое значение дельты полностью независимы).Лучше попытаться сопоставить цену btc данного дня с ценами btc нескольких предыдущих дней

  2. Вы разделили свои данные поезда / теста, выбрав случайным образом 80%для тренировки.Почему бы вам не использовать первые 80% баллов за обучение и последние 20% за прогнозирование?В вашей текущей конфигурации предвзято то, как данные отбираются

  3. Теперь представьте, что ваша модель подходит (она изучает очень сложную кривую дата_дельта / цена), которая хорошо подходит для ваших тренировочных точек.Весьма вероятно, что прогнозы на тестовых данных будут далеки от истины.Попробуйте изменить параметр регрессии опорных векторов.

Тем не менее, ваш результат слишком далек от того, что должен.Я мог бы спросить, где вы взяли значение 1654.0?А вы смотрели на результаты с линейной моделью?

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