将 sklearn LogisticRegression 系数链接到稀疏矩阵中的项,并获得统计显着性 / C.I

Posted

技术标签:

【中文标题】将 sklearn LogisticRegression 系数链接到稀疏矩阵中的项,并获得统计显着性 / C.I【英文标题】:Linking sklearn LogisticRegression coefficients to terms in a sparse matrix, and getting statistical significance / C.I 【发布时间】:2015-04-24 09:52:17 【问题描述】:

这是从another thread 开始的问题的延续。

我使用 sklearn 使用类似于以下代码的代码运行了逻辑回归:

from pandas import *
from sklearn.feature_extraction.text import CountVectorizer
from sklearn import linear_model

vect= CountVectorizer(binary =True)

a = read_table('text.tsv', sep='\t', index_col=False)

X = vect.fit_transform(c['text'].values)

logreg = linear_model.LogisticRegression(C=1)

d = logreg.fit(X, c['label'])
d.coef_

现在我想将 d.coef_ 中的值链接到构成我的稀疏矩阵 X 中的行的唯一项。这样做的正确方法是什么?似乎无法让它工作,即使看起来 X 应该有一个 words_ 属性。我明白了:

In [48]: X.vocabulary_
---------------------------------------------------------------------------
AttributeError                            Traceback (most recent call last)
<ipython-input-48-138ab7dd95ed> in <module>()
----> 1 X.vocabulary_

/usr/local/Cellar/python/2.7.6/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/scipy/sparse/base.pyc in __getattr__(self, attr)
    497             return self.getnnz()
    498         else:
--> 499             raise AttributeError(attr + " not found")
    500 
    501     def transpose(self):

AttributeError: vocabulary_ not found

更进一步,如果我想获得这些系数的统计显着性和置信区间(沿着您从 R 的 glm 获得的内容),这可能吗?例如,

## 
## Call:
## glm(formula = admit ~ gre + gpa + rank, family = "binomial", 
##     data = mydata)
## 
## Deviance Residuals: 
##    Min      1Q  Median      3Q     Max  
## -1.627  -0.866  -0.639   1.149   2.079  
## 
## Coefficients:
##             Estimate Std. Error z value Pr(>|z|)    
## (Intercept) -3.98998    1.13995   -3.50  0.00047 ***
## gre          0.00226    0.00109    2.07  0.03847 *  
## gpa          0.80404    0.33182    2.42  0.01539 *  
## rank2       -0.67544    0.31649   -2.13  0.03283 *  
## rank3       -1.34020    0.34531   -3.88  0.00010 ***
## rank4       -1.55146    0.41783   -3.71  0.00020 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## (Dispersion parameter for binomial family taken to be 1)
## 
##     Null deviance: 499.98  on 399  degrees of freedom
## Residual deviance: 458.52  on 394  degrees of freedom
## AIC: 470.5
## 
## Number of Fisher Scoring iterations: 4

【问题讨论】:

顺便说一句,矩阵中的列代表术语,行是文档。 在 scikit-learn 中无法获取置信区间。 【参考方案1】:

可以使用get_feature_names 方法从vect 访问功能名称。

您可以将它们压缩成这样的系数,例如:

zip(vect.get_feature_names(),d.coef_[0]) 

这会返回一个带有(token, coefficient)的元组

【讨论】:

感谢您的回复 - 非常有帮助。我稍微扩展了我的问题,因为我意识到它不符合我好奇的范围。如果你有更多的见解,那就太棒了!

以上是关于将 sklearn LogisticRegression 系数链接到稀疏矩阵中的项,并获得统计显着性 / C.I的主要内容,如果未能解决你的问题,请参考以下文章

如何将 KerasClassifier、Hyperopt 和 Sklearn 交叉验证放在一起

如何将 sklearn 管道转换为普通代码?

SKLEARN // 将 GridsearchCV 与列变换和管道相结合

如何将 sklearn 管道转换为 pyspark 管道?

将 Keras 集成到 SKLearn 管道?

将 scikit-learn (sklearn) 预测添加到 pandas 数据帧