Pandas/sklearn: 向量化大量 LinearRegression 计算
Pandas/sklearn: Vectorize large number of LinearRegression calculations
我有一个 Pandas DataFrame,我需要在其中计算大量回归系数。每个计算将只是二维的。自变量将是 ['Base']
,对于所有情况都相同。因变量系列在我的 DataFrame 中按列组织。
这很容易通过 for
循环完成,但在我现实生活中的 DataFrame 中,我有数千列可以在其上进行 运行 回归,所以它需要很长时间。有没有矢量化的方法来完成这个?
下面是一个 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
@Quang-Hoang 使用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)
我有一个 Pandas DataFrame,我需要在其中计算大量回归系数。每个计算将只是二维的。自变量将是 ['Base']
,对于所有情况都相同。因变量系列在我的 DataFrame 中按列组织。
这很容易通过 for
循环完成,但在我现实生活中的 DataFrame 中,我有数千列可以在其上进行 运行 回归,所以它需要很长时间。有没有矢量化的方法来完成这个?
下面是一个 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
@Quang-Hoang 使用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)