Python 从scikit learn中的管道获取测试集特征向量

Python 从scikit learn中的管道获取测试集特征向量,python,scikit-learn,Python,Scikit Learn,我想调试我的ML模型,我想看看在测试集中的每个观察中使用/激活了哪些特性。因此,我需要在管道中的矢量化、特征选择步骤之后,获得具有特征的变换矩阵。 首先是管道: pipeline = Pipeline([ ('fu', FeatureUnion( transformer_list=[ ('val', Pipeline([ ('ext', FeatureExtractor(feat_type="valence")),

我想调试我的ML模型,我想看看在测试集中的每个观察中使用/激活了哪些特性。因此,我需要在管道中的矢量化、特征选择步骤之后,获得具有特征的变换矩阵。 首先是管道:

pipeline = Pipeline([
    ('fu', FeatureUnion(
        transformer_list=[
            ('val', Pipeline([
                ('ext', FeatureExtractor(feat_type="valence")),
                ('vect', DictVectorizer()),
            ])),
            ('bot', Pipeline([
                ('ext', FeatureExtractor(feat_type="bot", term="word", pos=False, negation=True)),
                ('vec', CountVectorizer(min_df=3, max_df=0.9, lowercase=False)),
                ("fs", SelectKBest(chi2, k=8000)),
                ('bin', Binarizer()),
                ('trans', TfidfTransformer(sublinear_tf=True, smooth_idf=True, use_idf=True)),
            ]))
        ],
    )),
    ('stats', FeatureStats()),
    ("fs", MaxAbsScaler()),
    ('classifier', svm.LinearSVC(C=.5)),
])
所以我读了这篇文章,似乎我可以使用
transform
来获得转换后的矩阵(现在不推荐使用,但无论如何…)。我试着这样做:

pipeline.fit(X_train, y_train)
transformed = pipeline.transform(X_test)
y_predicted = pipeline.predict(X_test)
但我有个问题

如您所见,我选择了8000个最具辨别力的特征,因此进出分类器的矩阵必须是
nx8000
。但问题是
转换后的
mx3012
(N=训练示例,M=测试示例)

为了验证管道是否正常工作,我将
FeatureStats
,一个简单打印特征向量长度的转换器,放在分类器前面,然后打印8000

class FeatureStats(BaseEstimator, TransformerMixin):
    def __init__(self):
        pass

    def transform(self, X, y=None):
        print("size = ", X.shape[1])
        return X

    def fit(self, X, y=None):
        return self

为什么
pipeline.transform(X_测试)
返回一个较小的矩阵?我遗漏了什么吗?

LinearSVC的“transform()”方法说“将X减少到其最重要的特性”。可能3012是选择SVM计算的最重要特征后保留的特征数。如果您知道,请告诉我如何获得特征名称。我正在寻找功能名称和0或1的Dict。如果你愿意,我可以发布一个问题。