【问题标题】:Iterate over three rows then do linear regression迭代三行然后进行线性回归
【发布时间】:2019-06-14 07:14:08
【问题描述】:

我只想在两列中迭代三行,然后在迭代函数中,我在这三行中进行线性回归。所以,迭代三行,做线性回归,迭代三行,做线性回归,等等。

我把数据输入here。我想在 Year 和 Value 列中迭代三行,然后进行线性回归,然后在 Year 和 Value 列中迭代三行,然后进行线性回归,依此类推。

我已经尝试过这段代码,但是有一个错误

year=data_['Year']
value=data_['Value']
i=0
count=0

for a,b in zip(year,value):
    print(a,b)
    count = count+1

    if count%3 == 0:

        x=np.array([[a]])
        y=np.array([[b]])

        reg=linear_model.LinearRegression()
        x_train,x_test,y_train,y_test=train_test_split(x,y,test_size = 0.2 ,random_state=3)
        reg.fit(x_train,y_train)

        y4=4*reg.coef_ + reg.intercept_
        plt.scatter(x,y)
        plt.show()
        print(reg.coef_)
        print("R^2 : ",reg.score(x, y))
        print("Equation : 4 *", reg.coef_, "+", reg.intercept_)
        print("Y4 : ", y4)
        print("====")

我希望每三行的输出产生一个斜率、系数和方程。

【问题讨论】:

  • 1) 报错,不要只说有错误。 2) 为什么你想只用 1 个数据点做线性回归?无限多的线经过 1 个点;所以你至少需要 2 个。另外,为什么要尝试只用 1 个数据点进行训练测试拆分? 3)您需要查找以下内容:a)使用 pandas 进行索引,b)使用 pandas 进行迭代,c)S.O. 中的其他答案。在发布之前。
  • 现在,您的代码每 2 次迭代什么都不做,并尝试每隔三分之一对单个 x,y 对进行一次线性回归...您至少应该将 reg.fit(x,y) 替换为 reg.fit(x_train,y_train)
  • @Energya 出现错误“TypeError: Singleton array array(3) cannot be considered a valid collection.”
  • @KostasMouratidis 1) 错误“”TypeError:单例数组数组(3) 不能被视为有效集合。” 2) 我想用来自年份列的 x 和来自值列的 y 进行线性回归. 所以,我可以每隔三行预测第 4 年。如果这是我想要的,它真的需要训练测试拆分
  • 不,您不需要训练测试拆分。此外,您可能想要的不是像您那样遍历行,您需要遍历 pandas 索引,可能会执行以下操作:x = years[idx-3:idx](选择行idx-3idx-2idx-1 ) 并预测 y = values[idx],这将需要对 x 进行重新整形(可能像这样:x.values.reshape((1,-1))),对于 y(y.reshape((1,1)))也是如此。即便如此,这也不是最优的,您可能还想做其他事情,比如使用窗口 3 进行滚动预测。也许最好遵循一些关于时间序列的教程。

标签: python pandas loops linear-regression


【解决方案1】:

如果您希望每三年进行一次简单的线性回归,请尝试以下操作:

# Hardcoded input data for clarity
#all_years = data_['Year'].values
#all_values = data_['Value'].values
all_years = np.array([1,2,3,
                      1,2,3,
                      1,2,3,
                      1,2,3,
                      1,2,3])
all_values = np.array([  6.262008,   5.795994,   5.082662,
                       285.433511, 260.436601, 238.713124,
                         2.596145,   2.508278,   2.67997, 
                        90.823952,  91.0962765, 93.821241,
                        19.677544,  18.464335,  18.035489])


w = 3  # window size
for i in range(len(all_years)//w):

    years = all_years[w*i : w*(i+1)].reshape(-1,1)
    values = all_values[w*i : w*(i+1)].reshape(-1,1)
    #print(years, values)

    reg=linear_model.LinearRegression()
    reg.fit(years, values)

    y=(w+1)*reg.coef_ + reg.intercept_
    plt.scatter(years, values)
    plt.show()
    print(reg.coef_)
    print("R^2 : ",reg.score(years, values))
    print("Equation : (w+1) *", reg.coef_, "+", reg.intercept_)
    print("Y4 : ", y)
    print("====")

在这种情况下,长度将为15,因此for循环将通过i= 1, ..., 4。然后我使用 numpy 的数组切片选择你想要的年份和值。

例如,对于 i=1,这将选择 [3*(1-1) : 3*1] = [0 : 3],准确给出前三行。然后,为了确保这与期望列向量的线性回归很好地配合,我将数组重新整形为由 1 列和 .reshape(-1, 1) 组成。

然后就是随心所欲的训练和绘图了。

对于更易于阅读并避免手动索引问题的版本,您可能还需要查看more-itertools 包。具体来说,chunked 方法在这种情况下很有用,可以将数据分成固定长度的块,在这种情况下为 3:

from more_itertools import chunked

...

w = 3  # window size  
for years, values in zip(chunked(all_years, n=w), chunked(all_values, n=w)):

    years = years.reshape(-1,1)
    values = values.reshape(-1,1)
    #print(years, values)

    ...

【讨论】:

  • 我尝试使用 all_years = data_['Year'] & all_values = data_['Value'],但出现错误“AttributeError: 'Series' object has no attribute 'reshape'”,因为data_ 实际上有 552 行。
  • 啊,是的,我忘了它被提取为一个系列而不是一个数组。只需将.values 添加到data_['Year'],正如我在答案中更新的那样。
  • 不好意思问一下,为什么最后三行没有出现在结果中?有551条数据,但输出中只有548条
  • @WindyAuliaR。索引错误:for 循环中的范围太短。我已经在答案中更新了它并添加了一个不需要手动索引的版本
猜你喜欢
  • 2018-07-31
  • 1970-01-01
  • 2019-01-06
  • 2018-02-03
  • 2018-07-23
  • 2022-01-21
  • 2020-08-06
  • 1970-01-01
相关资源
最近更新 更多