这可能是一个简单的问题,但我正在尝试使用分类器进行分类问题或回归器进行回归来计算我的特征的p值。请问针对每种情况最好的方法是什么,并提供示例代码?我只想看到每个特征的p值,而不像文档中解释的那样保留k个最佳/百分位的特征等。
谢谢
这可能是一个简单的问题,但我正在尝试使用分类器进行分类问题或回归器进行回归来计算我的特征的p值。请问针对每种情况最好的方法是什么,并提供示例代码?我只想看到每个特征的p值,而不像文档中解释的那样保留k个最佳/百分位的特征等。
谢谢
您可以使用 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
sklearn
走了很长的路。 - Alainsm.Logit
不会自动添加截距项,而 sklearn.LogisticRegression
会。因此,我建议将代码更改为 logit_model=sm.Logit(y_train,sm.add_constant(X_train))
来手动添加截距项。 - Steve Walsh直接在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])
statsmodels
返回的。但是这个答案中的p值不是那些p值。这些是单变量卡方检验,意味着每个特征都是独立测试的,而不是在一个共同模型中测试的。 - Adamfrom sklearn.feature_selection import f_regression
freg=f_regression(x,y)
p=freg[1]
print(p.round(3))