遍历三行然后进行线性回归

时间:2019-06-14 07:14:08

标签: python pandas loops linear-regression

我只想对两行中的三行进行迭代,然后在迭代函数中,对那三行进行线性回归。因此,迭代三行,进行线性回归,迭代三行,进行线性回归,依此类推。

我输入了数据输入here。我想对Year和Value列中的三行进行迭代,然后进行线性回归,然后对Year and 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 个答案:

答案 0 :(得分: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],精确给出前三行。为了确保此方法与期望列向量的线性回归很好地配合,我将数组重塑为包含.reshape(-1, 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)

    ...