sklearn 特征联合

Posted

技术标签:

【中文标题】sklearn 特征联合【英文标题】:sklearn feature union 【发布时间】:2018-12-25 15:43:07 【问题描述】:

目标是使用三个输入运行多标签分类器。每个输入都是较大文档的摘录。管道有一个初步步骤,使用 tfidf 对每个摘录进行矢量化

x 是一个字符串列表,每个字符串都是摘录。

下面的代码有效,但似乎忽略了列表的第二个和第三个元素..

def grid_search(train_x, train_y):

    from sklearn.model_selection import GridSearchCV
    from sklearn.pipeline import Pipeline
    from sklearn.feature_extraction.text import TfidfVectorizer
    from sklearn.multiclass import OneVsRestClassifier
    from sklearn.naive_bayes import MultinomialNB


    parms= 'tfidf__max_df': (0.25, 0.5, 0.75),
            'tfidf__ngram_range': [(1, 1), (1, 2), (1, 3)],
            'clf__estimator__alpha': (1e-2, 1e-3)
             
    tfidf1 = ('tfidf', TfidfVectorizer(stop_words=stop_words))
    vctrz= tfidf1 
    clsfy = ('clf', OneVsRestClassifier(MultinomialNB( fit_prior=True, class_prior=None)))
    pipeline = Pipeline([ vctrz, clsfy ])


    gs1 = GridSearchCV(pipeline, parms, cv=2, n_jobs=1, verbose=0)
    gs1.fit(train_x, train_y)
    return gs1.best_estimator_


classifier = grid_search(train_x, y_train)

我试过没有成功

    vctrz = [tfidf1,tfidf1,tfidf1]

我也试过 FeatureUnion

TFALL =  [('tf1', TFIDFX1()) , ('tf2', TFIDFX2()) , ('tf3', TFIDFX3()) ]
#maybe the () are extraneous but without them I get a self less error

clsfy = ('clf', OneVsRestClassifier(MultinomialNB( fit_prior=True, class_prior=None)))

ppl = Pipeline([     ('feats', FeatureUnion(TFALL) ),   clsfy    ])


gs1 = GridSearchCV(ppl, parms, cv=2, n_jobs=1, verbose=5)

其中TFIDFX1的构造如下

class TFIDFX1(BaseEstimator, TransformerMixin):


    def __init__(self):
        pass

    def vectorize(self, doc):
        return vect.fit(doc)

    def transform(self, mylist, y=None):
        return self.vectorize(mylist[0]) #would 

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

为了简洁起见,我省略了类 TFIDFX2 和 TFIDFX3,它们分别看起来像 mylist[1] 和 mylist[2],但在其他方面是相同的

这会失败并出现以下回溯:

TypeError: float() argument must be a string or a number, not 'TfidfVectorizer'

感谢 SO 社区的任何帮助

【问题讨论】:

所以您希望将 TfidfVectorizer 单独应用于每一列,然后组合得到的向量?如果是这样,如果两列都包含相同的单词,结果中将有两列(每个输入列中的一个)? 我试图澄清这个问题。 X 是三个文档摘录的列表,我希望 SKLEARN 将其视为 3 个自变量。这些摘录可能重叠,也可能不重叠。 这种情况下看这个例子:scikit-learn.org/stable/auto_examples/hetero_feature_union.html 【参考方案1】:

即使三个输入是齐次的,tfidf 步骤也不会自动跨越数组

相反,您必须使用特征联合步骤并将三个输入组合为三个单独的 tfidf 子步骤,如 this example

感谢@Vivek Kumar

【讨论】:

以上是关于sklearn 特征联合的主要内容,如果未能解决你的问题,请参考以下文章

如何保存 sklearn 管道/特征转换器

sklearn 转换管道和功能联合

sklearn-特征工程之特征选择

sklearn 是不是支持动态数据的特征选择?

sklearn 特征选择

sklearn的PCA