【问题标题】:How to fix strange prediction results in scikit-learn如何修复 scikit-learn 中的奇怪预测结果
【发布时间】:2019-06-07 13:21:46
【问题描述】:

我在 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。可以看到,features 的值与 target1 和 target2 的值之间有一个趋势:

通过将特征值加倍,target1 的值也加倍,而 target2 的值减半

例如,如果我为第一个、第二个和第三个特征提供值:1600、800 和 480,我希望 target1 和 target2 分别得到 800 和 12.5。代码如下:

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

如您所见,目标 1 的预测值正是预期值而目标 2 的预测值 (-284.58) 与预期值 (12.5) 相差甚远

有谁知道这里出了什么问题以及如何解决这个问题?在此先感谢您的帮助。

【问题讨论】:

  • 问题与random-forest无关(标签已删除并替换为linear-regression)。

标签: python machine-learning scikit-learn linear-regression


【解决方案1】:

编辑:您的输入(其中任何一个,它们基本上都是相同的)和您的目标 2 之间没有线性相关性。这似乎是一个指数衰减。尝试将您的特征转换为另一个特征 (1/exp(x)),然后您可以对该特征进行线性回归

Edit2:我的错误,它只是 1/x

还有..(下面的原帖) 我不是专家,但看来你的输入功能不仅高度相关,它们实际上是完全相关的(线性相关性) - 这通常会使回归断裂。 直观的原因是,因为它们是相关的,所以存在无限数量的可能系数,它们相互抵消,并且预测仍然完全相同(想象在你的情况下 first-second 与 2first-3second 完全相同或 0first-1second 等)。 我也认为这会导致线性回归的正规方程生成一个无法反转的矩阵..

【讨论】:

  • 感谢您的回复。但是,当您说“指数衰减”时,我不清楚,因为它肯定不是指数衰减。当我说“奇怪的预测”时,我的意思是 target1 的预测是绝对正确的,而 target2 则不是。 Target1和Target2都有类似的趋势(虽然是逆的),但它有点奇怪。你能操纵上面的示例代码来获得两个目标的正确预测吗?
  • 我在初始帖子中犯了一个错误,它只是1 / x。我试图实现纠正,但我没有生成2个输出的线性回归的经验,所以我仅使用首先作为输入(因为第二和第三)单独创建2个回归(下面的代码)lr_1.fit(X['first'],y['target1']) 987654322 lr_1.fit(X['first'],y['target1']) 987654322 @ 987654322 987654323 @ lr_2.fit(np.vectorize(lambda x: 1/x)(X['first']),y['target2']注意,对于改造预测的输入至关重要:lr_2.predict(1/1600)您必须修改此处 span>的形状和类型
猜你喜欢
  • 2013-03-20
  • 2016-10-29
  • 2018-01-31
  • 2017-12-22
  • 1970-01-01
  • 2016-05-15
  • 2016-04-03
  • 2022-11-25
  • 2018-03-12
相关资源
最近更新 更多