Я обучил модель 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 грн.Подскажите, пожалуйста, что здесь не так?