代码之家  ›  专栏  ›  技术社区  ›  Leo

如何在scikit学习中修复奇怪的预测结果

  •  -1
  • Leo  · 技术社区  · 6 年前

    我在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。如您所见,特性值与TARGET1和TARGET2值之间存在一种趋势:

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

    例如,如果我为第一个、第二个和第三个特性提供值:1600、800和480,我希望得到800和 十二点五 分别用于TARGET1和TARGET2。代码如下:

    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的预测值正是预期值。 而TARGET2的预测值(-284.58)与预期值(12.5)相差甚远

    有人知道这里有什么问题吗?我怎么解决这个问题?提前谢谢你的帮助。

    1 回复  |  直到 6 年前
        1
  •  2
  •   Tacratis    6 年前

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

    编辑2:我的错,只是1/x

    也。。(原文如下) 我不是专家,但似乎你的输入特征不仅高度相关,它们实际上是完全相关的(即线性相关)-这通常会导致回归中断。 直观的原因是,因为它们是相互关联的,所以存在着无限多的可能系数,它们相互抵消,预测结果仍然完全相同(假设在您的情况下,first second与2first-3second或0first-1second等完全相同)。 我也认为这会导致线性回归的正态方程产生一个不能倒转的矩阵。