当前位置: 首页 > 知识库问答 >
问题:

SVR:预测值与实际值相差很远,尽管R平方很高,MSE很低

拓拔迪
2023-03-14

我使用scikit learn训练了一个SVR模型,该模型通过使用比特币以前日期的收盘价来预测比特币的未来价格。我已使用以下函数将日期从第一个可用日期转换为增量:

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

我的DataFrame头部看起来如下所示:

<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]

但是,当我尝试在对date_delta进行转换并对预测输出进行反向转换之后,预测数据点的btc价格时,结果却大相径庭。需要帮助知道哪里出了问题。

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      ]])

共有1个答案

景子安
2023-03-14

有很多话要说:

>

  • 我真的不明白你的目的是什么:基本上,你试着把一个起始日期的天数与btc的价格匹配起来,这实际上是不相关的(delta的数值是完全独立的)。你最好试着将某一天的btc价格与前几天的btc价格相匹配

    通过随机选取80%的数据进行训练,您可以将训练/测试数据分开。为什么不把前80%的分用来学习,把后20%的分用来预测呢?在当前配置中,数据采样的方式会有偏差

    现在想象一下,您的模型覆盖(它学习了一个非常复杂的date_delta/price曲线),它很好地拟合了您的训练点。测试数据上的预测很有可能会与事实相去甚远。尝试改变支持向量回归的参数。

    但是你的结果离它应该做的太远了。我可能会问你把价值1654.0拿到哪儿去了?你看过线性html" target="_blank">模型的结果了吗?

  •  类似资料:
    • 然而,由于某些原因,所有这些按钮都相距很远,我不太确定它们的确切位置是由什么逻辑决定的。这是我的代码,用于设置窗口和按钮: 如果有人能告诉我为什么以及如何让按钮和字段离得更近,我将不胜感激。

    • 主要思想是根据输入特征预测2个目标输出。 > 输入特征已经使用sklearn中的Standard caler()进行了缩放。X_train的大小是(190 x 6),Y_train=(190 x 2)。X_test是(20 x 6),Y_test=(20x2) 线性和rbf内核还利用Gridsearch chCV来查找最佳C(线性)、gamma和C('rbf') [问题]我在线性和rbf内核上使用

    • 问题内容: 我对以下算法有一些疑问,可以判断数字是否为质数,我也知道使用Eratosthenes筛子可以更快地响应。 为什么计算速度更快。比只有一次? 为什么比我的方法快? 这些算法O(n),O(sqrt(n)),O(n log(n))的复杂度是多少? 这也是我的代码的链接:http : //ideone.com/Fapj1P 问题答案: 查看下面的复杂性。计算平方根的额外费用。 Math.sqr

    • 有人知道的时间复杂度是多少吗?

    • 在某个时刻,我的应用程序开始创建许多临时阵列,这是预期的行为,我想给年轻一代提供大量空间,所以临时阵列不会被提升到终身一代。 JVM选项: 在某些时候,我的GC日志开始看起来像这样: 我非常困惑的事实,年轻一代的大小是629120K(=629M),而我预计它是约1/2(因为NewRatio=2)的终身一代大小这是158690816K(=158G)。终身大小生成对应于NewRatio和Xms的预期,

    • 为了尽快获得一个可以高效使用的工作软件系统,不仅需要为开发做计划,还需要为文档,部署,市场做计划。在一个商业工程里,这还需要销售和金融计划。没有对开发时间的预测能力,是不可能高效预测以上这些东西的。 好的估计提供了预测能力。管理者喜欢,而且应该这么做。事实是这不可能,不论是理论上还是实践上,准确预测开发软件所消耗的时间总是被管理者所忽视。我们总是被要求做那些不可能的事情,而且我们必须诚实地面对它。