Python Pandas/sklearn:将大量线性回归计算矢量化

Python Pandas/sklearn:将大量线性回归计算矢量化,python,pandas,sklearn-pandas,Python,Pandas,Sklearn Pandas,我有一个熊猫数据框,在这里我需要计算大量的回归系数。每次计算将仅为二维计算。自变量将是一个['Base'],对于所有情况都是相同的。因变量系列是沿着我的数据框架中的列组织的 这很容易通过for循环来实现,但在我的实际数据帧中,我有数千列可以运行回归,因此这需要花费很长时间。有没有一种矢量化的方法来实现这一点 以下是MRE: import pandas as pd import numpy as np from sklearn import linear_model import time df

我有一个熊猫数据框,在这里我需要计算大量的回归系数。每次计算将仅为二维计算。自变量将是一个
['Base']
,对于所有情况都是相同的。因变量系列是沿着我的数据框架中的列组织的

这很容易通过
for
循环来实现,但在我的实际数据帧中,我有数千列可以运行回归,因此这需要花费很长时间。有没有一种矢量化的方法来实现这一点

以下是MRE:

import pandas as pd
import numpy as np
from sklearn import linear_model
import time

df_data = {
        'Base':np.random.randint(1, 100, 1000),
        'Adder':np.random.randint(-3, 3, 1000)}

df = pd.DataFrame(data=df_data)
result_df = pd.DataFrame()

df['Thing1'] = df['Base'] * 3 + df['Adder']
df['Thing2'] = df['Base'] * 6 + df['Adder']
df['Thing3'] = df['Base'] * 12 + df['Adder']
df['Thing4'] = df['Base'] * 4 + df['Adder']
df['Thing5'] = df['Base'] * 2.67 + df['Adder']

things = ['Thing1', 'Thing2', 'Thing3', 'Thing4', 'Thing5']

for t in things:
    reg = linear_model.LinearRegression()
    X, y = df['Base'].values.reshape(-1,1), df[t].values.reshape(-1,1)
    reg.fit(X, y)
    b = reg.coef_[0][0]
    result_df.loc[t, 'Beta'] = b

print(result_df.to_string())


您可以使用
np.polyfit
进行线性回归:

pd.DataFrame(np.polyfit(df['Base'], df.filter(like='Thing'), deg=1)).T
输出:

           0            1
0   3.002379    -0.714256
1   6.002379    -0.714256
2   12.002379   -0.714256
3   4.002379    -0.714256
4   2.672379    -0.714256

您可以使用
np.polyfit
进行线性回归:

pd.DataFrame(np.polyfit(df['Base'], df.filter(like='Thing'), deg=1)).T
输出:

           0            1
0   3.002379    -0.714256
1   6.002379    -0.714256
2   12.002379   -0.714256
3   4.002379    -0.714256
4   2.672379    -0.714256

@QuangHoang使用df.filter的想法解决了这个问题。如果您真的想使用sklearn,这也可以:

reg = linear_model.LinearRegression()
X = df['Base'].values.reshape(-1,1)
y = df.filter(items=things).values
reg.fit(X, y)
result_df['Betas'] = reg.coef_
y_predict = reg.predict(X)
result_df['Rsq'] = r2_score(y, y_predict)

@QuangHoang使用df.filter的想法解决了这个问题。如果您真的想使用sklearn,这也可以:

reg = linear_model.LinearRegression()
X = df['Base'].values.reshape(-1,1)
y = df.filter(items=things).values
reg.fit(X, y)
result_df['Betas'] = reg.coef_
y_predict = reg.predict(X)
result_df['Rsq'] = r2_score(y, y_predict)