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