以向量作为自变量而不是多个单值变量进行回归?

问题描述 投票:0回答:1

我正在做一个项目,试图通过绘制书中句子的情绪来预测用户对书籍的评分(评论)。

A graph to give you an idea:

红色是得分最高的25%书籍的平均情绪图, 蓝色最差。

正如你所看到的,这些书一开始相当中等,在结束之前就下降了,而且最后都有很高的情绪。您还可以看到,最好得分 25%(红色)最终达到最高点。

我想做的是使用回归来根据包含书中每个句子的情感分数的向量来预测一本书的分数。

我尝试了一些方法,但没有效果。

我的想法是将所有书籍分成 100 个部分,对每本书取这 100 个部分的平均值,并在此数据上训练支持向量回归模型(带有多边形内核)。然而,它的表现并不比每次都预测平均分数更好。

所以:

1 自变量 = [avg_sentiment1,avg_sentiment2,...avg_sentiment100] 1 因变量 = 分数(1 到 5 之间的数字,或者更具体地说,在我们的数据集中,介于 ~3.200 和 ~4.700 之间)

因此,虽然使用此设置拟合 sklearn SVR 模型不会给出任何错误,但它似乎并没有学习(它的表现比始终预测平均值的虚拟预测器更差)。我尝试了几种具有不同参数的不同回归模型(Ridge、具有不同内核的 SVR、添加 SplineTransformer)。没有比随机做得更好的了。

我可以在网上找到的所有回归示例似乎都使用奇异值预测奇异值(因此自变量年龄 = 12,因变量高度 = 160 厘米,类似的东西),或者最多使用多个变量(添加更多奇异值,比如体重 = 67(公斤),作为自变量)。

我的回归是否将 100 个数字向量解释为 100 个不相关的变量?这有关系吗?

帮助,我已经超出了我的能力范围。哪种技术最适用于此?最好是我可以在 SKLearn 上找到的东西,我不是专家(正如你可能知道的那样)

python machine-learning scikit-learn regression
1个回答
0
投票

听起来你已经开始将输入大小从 2000 压缩到 100,即降维。通常这会带来速度和内存方面的好处,并且可能还会提高性能。

但是,在尝试降维之前,我认为值得看看原始特征的表现如何。您可以将数据直接输入

ExtraTreesClassifier
RandomForestClassifier
Hist/GradientBoostingClassifier
,看看效果如何。无需为上述分类器预处理特征。

我的想法是将所有书籍分成 100 个部分,对每本书取这 100 个部分的平均值,并在此数据上训练支持向量回归模型(带有聚核)。

查看您显示的图表,我认为这种降维方法可能会淡化数据的一些关键判别特征。比较红色和蓝色类,它们的共同点是它们具有周期性(每大约 250 步循环一次);它们的趋势相同;最后它们会向上摆动(不同程度)。蓝色图偏移了大约半个周期。

当将此数据下采样到 100 点时,周期性特性将会减弱,您将只剩下总体趋势,这对于红色和蓝色来说是相似的。此外,上涨仅持续相对较短的时间,因此对其进行平均可能会使红色和蓝色尾部变得不那么明显。简而言之,新功能似乎可能会使类在特征空间中更加紧密地结合在一起,而不是帮助将它们分开。

使用

sklearn
降维的一些替代方法:

  • cross_decomposition.PLSRegression
    降低数据维度,同时考虑目标标签。
  • decomposition.PCA
    通过丢弃变化不大的特征来降低数据的维度。但是,它不查看类,因此可能会错过有用的信息。
  • neural_network.MLPRegressor
    配置为自动编码器会执行与 PCA 类似的操作,但更能够表示复杂的模式。

您拥有的数据本质上是连续的,但上面的方法没有考虑到这一点。如果顺序特征很重要,那么可能值得考虑 PyTorch 或类似的工具来训练基于序列的模型。

© www.soinside.com 2019 - 2024. All rights reserved.