Python sklearn - 如何计算p值

18

这可能是一个简单的问题,但我正在尝试使用分类器进行分类问题或回归器进行回归来计算我的特征的p值。请问针对每种情况最好的方法是什么,并提供示例代码?我只想看到每个特征的p值,而不像文档中解释的那样保留k个最佳/百分位的特征等。

谢谢


1
在显著性检验中,p 值通常必须小于 0.05。 - user1096808
虽然我相信feature_extraction做了一些不同的事情,但它可以将任意数据转换为数值数据。 - user1096808
3个回答

23

您可以使用 statsmodels

import statsmodels.api as sm
logit_model=sm.Logit(y_train,X_train)
result=logit_model.fit()
print(result.summary())

结果会是这样的。

                           Logit Regression Results                           
==============================================================================
Dep. Variable:                      y   No. Observations:               406723
Model:                          Logit   Df Residuals:                   406710
Method:                           MLE   Df Model:                           12
Date:                Fri, 12 Apr 2019   Pseudo R-squ.:                0.001661
Time:                        16:48:45   Log-Likelihood:            -2.8145e+05
converged:                      False   LL-Null:                   -2.8192e+05
                                        LLR p-value:                8.758e-193
==============================================================================
                 coef    std err          z      P>|z|      [0.025      0.975]
------------------------------------------------------------------------------
x1            -0.0037      0.003     -1.078      0.281      -0.010       0.003

我同意,StatsModels是由统计学家开发的,你会得到更多信息。Sklearn是由开发人员开发的,使用和集成到管道中会更容易。根据你的目标仔细选择你的工具。 - el Josso
简单多了!谢谢!我之前一直在用sklearn走了很长的路。 - Alain
1
这是一个很好的答案,但值得注意的是 sm.Logit 不会自动添加截距项,而 sklearn.LogisticRegression 会。因此,我建议将代码更改为 logit_model=sm.Logit(y_train,sm.add_constant(X_train)) 来手动添加截距项。 - Steve Walsh

11

直接在X,y上运行显著性检验。以20news和chi2为例:

>>> from sklearn.datasets import fetch_20newsgroups_vectorized
>>> from sklearn.feature_selection import chi2
>>> data = fetch_20newsgroups_vectorized()
>>> X, y = data.data, data.target
>>> scores, pvalues = chi2(X, y)
>>> pvalues
array([  4.10171798e-17,   4.34003018e-01,   9.99999996e-01, ...,
         9.99999995e-01,   9.99999869e-01,   9.99981414e-01])

1
看起来不错。那么我怎样才能将所有这些数字转换为0.0000格式呢?(非常菜鸟,抱歉) - user1096808
我使用了以下代码: scores, pvalues = chi2(traindata, targetdata) pvalues=["{0:.7f}".format(x)for x in pvalues] print pvalues这样做正确吗?谢谢。 - user1096808
@user1096808 Python教程中已经涵盖了数字格式化的内容,请阅读该部分。 - Fred Foo
4
我会尽力进行翻译。针对卡方检验,我遇到了“输入X必须为非负数”的提示。这是不是只适用于没有负值的变量?如果某些特征并不总是为正,该如何获得p值? - Alexis Eggermont
35
OP似乎想要回归中每个特征的p值,这是由statsmodels返回的。但是这个答案中的p值不是那些p值。这些是单变量卡方检验,意味着每个特征都是独立测试的,而不是在一个共同模型中测试的。 - Adam
显示剩余2条评论

1
您的问题是如何使用“sklearn”计算p值,而不需要额外安装statsmodel的pip安装包。
from sklearn.feature_selection import f_regression

freg=f_regression(x,y)

p=freg[1]

print(p.round(3))

这似乎也是一个不错的答案,但请解释一下这里发生了什么,并提供一些文档说明,这样任何人都可以更容易地理解。 - Javier Huerta
这似乎也是一个不错的答案,但请解释一下这里发生了什么,并提供一些文档说明,这样任何人都可以更容易地理解。 - Javier Huerta

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接