如何比较 python 中的层次回归模型?
how to compare hierarchical regression models in python?
我拟合了两个回归模型,一个只有 1 个预测变量,另一个有 3 个预测变量。现在我想比较这两个模型。我怎样才能做到这一点?我知道如何在 R 中执行此操作,但不确定如何在 python 中执行此操作。这是 R 中用于比较两个模型的代码 -
anova(albumSales.2, albumSales.3)
结果-
Model 1: sales ~ adverts
Model 2: sales ~ adverts + airplay + attract
Res.Df RSS Df Sum of Sq F Pr(>F)
1 198 862264
2 196 434575 2 427690 96.447 < 2.2e-16 ***
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
>
根据以上结果,我们可以看到 albumSales.3 与 albumSales.2 相比,模型对数据的拟合度显着提高,F(2, 196) = 96.44, p < .001.
如何在 python 中完成?
我不知道有哪个函数可以像 R 中的示例那样直接比较两个模型,但是 Scikit-Learn 包是一个非常常用的 Python 数据科学和机器包学习。它支持与回归模型相关的各种指标,允许您创建自己的比较。
例如,它支持 R2 度量。下面的示例来自 Scikit 的 documentation on R2:
>>> from sklearn.metrics import r2_score
>>> y_true = [3, -0.5, 2, 7]
>>> y_pred = [2.5, 0.0, 2, 8]
>>> r2_score(y_true, y_pred)
0.948...
>>> y_true = [[0.5, 1], [-1, 1], [7, -6]]
>>> y_pred = [[0, 2], [-1, 2], [8, -5]]
>>> r2_score(y_true, y_pred,
... multioutput='variance_weighted')
0.938...
>>> y_true = [1, 2, 3]
>>> y_pred = [1, 2, 3]
>>> r2_score(y_true, y_pred)
1.0
>>> y_true = [1, 2, 3]
>>> y_pred = [2, 2, 2]
>>> r2_score(y_true, y_pred)
0.0
>>> y_true = [1, 2, 3]
>>> y_pred = [3, 2, 1]
>>> r2_score(y_true, y_pred)
-3.0
通过对您的两个模型执行此操作,您可以获得与从 R 获得的类似的比较。
在方差分析中,你基本上是计算RSS 的差异。
您可以在 vignette for ANOVA in statsmodels:
下查看更多内容
import pandas as pd
import seaborn as sns
import numpy as np
iris = sns.load_dataset('iris')
from statsmodels.formula.api import ols
from statsmodels.stats.anova import anova_lm
iris.head()
sepal_length sepal_width petal_length petal_width species
0 5.1 3.5 1.4 0.2 setosa
1 4.9 3.0 1.4 0.2 setosa
2 4.7 3.2 1.3 0.2 setosa
3 4.6 3.1 1.5 0.2 setosa
4 5.0 3.6 1.4 0.2 setosa
我们 运行 两个模型并进行方差分析:
full_lm = ols("sepal_length ~ petal_length+petal_width", data=iris).fit()
reduced_lm = ols("sepal_length ~ petal_length", data=iris).fit()
anova_lm(reduced_lm,full_lm)
df_resid ssr df_diff ss_diff F Pr(>F)
0 148.0 24.525034 0.0 NaN NaN NaN
1 147.0 23.880694 1.0 0.64434 3.9663 0.048272
它会发出一些警告(您可以在我上面链接的网站上看到它)因为对于第一行它无法计算 F 等
请注意,这与其他答案中建议的计算 Rsquare 不同。需要注意的一个重要问题是,如果你包含更多项,理论上你的 R 平方会增加,你想看看这些项是否显着解释了额外的方差,这就是你使用方差分析的原因。
我拟合了两个回归模型,一个只有 1 个预测变量,另一个有 3 个预测变量。现在我想比较这两个模型。我怎样才能做到这一点?我知道如何在 R 中执行此操作,但不确定如何在 python 中执行此操作。这是 R 中用于比较两个模型的代码 -
anova(albumSales.2, albumSales.3)
结果-
Model 1: sales ~ adverts
Model 2: sales ~ adverts + airplay + attract
Res.Df RSS Df Sum of Sq F Pr(>F)
1 198 862264
2 196 434575 2 427690 96.447 < 2.2e-16 ***
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
>
根据以上结果,我们可以看到 albumSales.3 与 albumSales.2 相比,模型对数据的拟合度显着提高,F(2, 196) = 96.44, p < .001.
如何在 python 中完成?
我不知道有哪个函数可以像 R 中的示例那样直接比较两个模型,但是 Scikit-Learn 包是一个非常常用的 Python 数据科学和机器包学习。它支持与回归模型相关的各种指标,允许您创建自己的比较。
例如,它支持 R2 度量。下面的示例来自 Scikit 的 documentation on R2:
>>> from sklearn.metrics import r2_score
>>> y_true = [3, -0.5, 2, 7]
>>> y_pred = [2.5, 0.0, 2, 8]
>>> r2_score(y_true, y_pred)
0.948...
>>> y_true = [[0.5, 1], [-1, 1], [7, -6]]
>>> y_pred = [[0, 2], [-1, 2], [8, -5]]
>>> r2_score(y_true, y_pred,
... multioutput='variance_weighted')
0.938...
>>> y_true = [1, 2, 3]
>>> y_pred = [1, 2, 3]
>>> r2_score(y_true, y_pred)
1.0
>>> y_true = [1, 2, 3]
>>> y_pred = [2, 2, 2]
>>> r2_score(y_true, y_pred)
0.0
>>> y_true = [1, 2, 3]
>>> y_pred = [3, 2, 1]
>>> r2_score(y_true, y_pred)
-3.0
通过对您的两个模型执行此操作,您可以获得与从 R 获得的类似的比较。
在方差分析中,你基本上是计算RSS 的差异。 您可以在 vignette for ANOVA in statsmodels:
下查看更多内容import pandas as pd
import seaborn as sns
import numpy as np
iris = sns.load_dataset('iris')
from statsmodels.formula.api import ols
from statsmodels.stats.anova import anova_lm
iris.head()
sepal_length sepal_width petal_length petal_width species
0 5.1 3.5 1.4 0.2 setosa
1 4.9 3.0 1.4 0.2 setosa
2 4.7 3.2 1.3 0.2 setosa
3 4.6 3.1 1.5 0.2 setosa
4 5.0 3.6 1.4 0.2 setosa
我们 运行 两个模型并进行方差分析:
full_lm = ols("sepal_length ~ petal_length+petal_width", data=iris).fit()
reduced_lm = ols("sepal_length ~ petal_length", data=iris).fit()
anova_lm(reduced_lm,full_lm)
df_resid ssr df_diff ss_diff F Pr(>F)
0 148.0 24.525034 0.0 NaN NaN NaN
1 147.0 23.880694 1.0 0.64434 3.9663 0.048272
它会发出一些警告(您可以在我上面链接的网站上看到它)因为对于第一行它无法计算 F 等
请注意,这与其他答案中建议的计算 Rsquare 不同。需要注意的一个重要问题是,如果你包含更多项,理论上你的 R 平方会增加,你想看看这些项是否显着解释了额外的方差,这就是你使用方差分析的原因。