Python - 多元线性回归 - 每个输入变量的确定系数
Posted
技术标签:
【中文标题】Python - 多元线性回归 - 每个输入变量的确定系数【英文标题】:Python - Multiple Linear Regression - Coefficient of Determination for each Input Variable 【发布时间】:2021-12-30 01:57:49 【问题描述】:我正在使用 sklearn 在 Python 中执行相当直接的多元线性回归。请参阅下面的代码 sn-p - full_results 是一个数据框,其中所有变量都是数字。
这段代码的结果是一个单一的决定系数,我相信它表示 y 的变化是由于 x1 - x4 的组合造成的。
我的问题是确定系数是否可以在 4 个输入变量之间进行拆分,因此我可以看到 y 的变化分别归因于每个变量。
我当然可以为每个变量独立运行单变量线性回归,但这感觉不是正确的解决方案。
我记得很多年前在统计课上,并在 R 中做类似的事情。
from sklearn.linear_model import LinearRegression
x = full_results[['x1','x2','x3','x4']].values
y = full_results['y'].values
mlr = LinearRegression()
mlr.fit(x, y)
mlr.score(x, y)
【问题讨论】:
这里通常会使用 PCA 吗? “y 有多少变化”是什么意思?你拟合了一个线性模型,所以只有线性权重决定了 y 受 x1, ... x4 变化的影响程度。决定系数衡量模型解释/预测结果/数据点的程度。它是对整个模型的度量。这里解释得更好:stats.stackexchange.com/questions/412526/… 您可以执行优势分析。结果为您提供了每个变量解释的 y 方差百分比。确定单个变量的 R2 不会提供正确的信息,因为对单个变量的解释方差的贡献也受到模型中其他变量的影响。例如,具有 X1 的模型和具有 X2 的模型的 R2 之和与具有 X1 和 X2 组合的模型不同。 github.com/dominance-analysis/dominance-analysis 【参考方案1】:决定系数是解释的总方差的比例。所以另一种看待它的方法是查看每个术语解释的方差比例,也解释了here。为此,我们使用方差分析来计算每个项的平方和。
您必须注意的一件事是,如果您的预测变量不相关,则此方法有效。如果是,那么在模型中指定的每个它们的顺序都会对计算产生影响。
使用示例数据集:
from sklearn.linear_model import LinearRegression
from sklearn.datasets import make_regression
import pandas as pd
X,y = make_regression(n_samples=100, n_features=4,
n_informative=3, noise=20, random_state=99)
df = pd.DataFrame(X,columns = ['x1','x2','x3','x4'])
df['y'] = y
mlr = LinearRegression()
mlr.fit(df[['x1','x2','x3','x4']], y)
mlr.coef_
array([ 8.33369861, 29.1717497 , 26.6294007 , -1.82445836])
mlr.score(df[['x1','x2','x3','x4']], y)
0.8465893941639528
使用statsmodels 更容易计算并进行线性拟合,您可以看到系数非常相似:
import statsmodels.api as sm
from statsmodels.formula.api import ols
from statsmodels.stats.anova import anova_lm
lm = ols('y ~ x1 + x2 + x3 + x4',df).fit()
lm.params
Intercept -0.740399
x1 8.333699
x2 29.171750
x3 26.629401
x4 -1.824458
我们得到方差分析:
anova_table = anova_lm(lm)
anova_table
df sum_sq mean_sq F PR(>F)
x1 1.0 10394.554366 10394.554366 28.605241 6.110239e-07
x2 1.0 113541.846572 113541.846572 312.460911 8.531356e-32
x3 1.0 66267.787822 66267.787822 182.365304 7.899193e-24
x4 1.0 298.584632 298.584632 0.821688 3.669804e-01
Residual 95.0 34521.039456 363.379363 NaN NaN
除了平方和列中的残差之外的所有内容都会为您提供类似于 sklearn 的 r 平方:
anova_table['sum_sq'][:-1].sum() / anova_table['sum_sq'].sum()
0.8465893941639528
现在解释的方差比例(我们很少称之为 r-squared)例如 'x1' 是:
anova_table.loc['x1','sum_sq'] / anova_table['sum_sq'].sum()
0.046193130558342954
【讨论】:
以上是关于Python - 多元线性回归 - 每个输入变量的确定系数的主要内容,如果未能解决你的问题,请参考以下文章