如何为多个数据框列创建管道?

发布于 2021-01-29 15:05:31

我有可以简化为此的数据框:

import pandas as pd

df = pd.DataFrame([{
'title': 'batman',
'text': 'man bat man bat', 
'url': 'batman.com', 
'label':1}, 
{'title': 'spiderman',
'text': 'spiderman man spider', 
'url': 'spiderman.com', 
'label':1},
{'title': 'doctor evil',
 'text': 'a super evil doctor', 
'url': 'evilempyre.com', 
'label':0},])

我想尝试不同的特征提取方法:TFIDF,word2vec,具有不同ngram设置的Coutvectorizer等。但是我想以不同的组合尝试:一个特征集将包含使用TFIDF转换的“文本”数据和使用Countvectoriser和second将具有通过w2v转换的文本数据,以及通过TFIDF等转换的“
url”。最后,当然,我想比较不同的预处理策略并选择最佳的。

这里是问题:

  1. 有没有办法使用标准sklearn工具(例如管道)来做这些事情?

  2. 我的想法有常识吗?也许有个好主意,如何处理我缺少的数据框中有很多列的文本数据?

非常感谢!

关注者
0
被浏览
92
1 个回答
  • 面试哥
    面试哥 2021-01-29
    为面试而生,有面试问题,就找面试哥。

    @elphz答案很好地介绍了如何使用FeatureUnionFunctionTransformer完成此操作,但是我认为它可以使用更多细节。

    首先,我要说的是,您需要定义FunctionTransformer函数,以便它们可以正确处理和返回输入数据。在这种情况下,我假设您只想传递DataFrame,但要确保您获得正确形状的数组以供下游使用。因此,我建议仅传递DataFrame并按列名进行访问。像这样:

    def text(X):
        return X.text.values
    
    def title(X):
        return X.title.values
    
    pipe_text = Pipeline([('col_text', FunctionTransformer(text, validate=False))])
    
    pipe_title = Pipeline([('col_title', FunctionTransformer(title, validate=False))])
    

    现在,测试变压器和分类器的变体。我会建议使用一个转换器列表和一个分类器列表,并简单地对其进行迭代,就像进行网格搜索一样。

    tfidf = TfidfVectorizer()
    cv = CountVectorizer()
    lr = LogisticRegression()
    rc = RidgeClassifier()
    
    transformers = [('tfidf', tfidf), ('cv', cv)]
    clfs = [lr, rc]
    
    best_clf = None
    best_score = 0
    for tran1 in transformers:
        for tran2 in transformers:
            pipe1 = Pipeline(pipe_text.steps + [tran1])
            pipe2 = Pipeline(pipe_title.steps + [tran2])
            union = FeatureUnion([('text', pipe1), ('title', pipe2)])
            X = union.fit_transform(df)
            X_train, X_test, y_train, y_test = train_test_split(X, df.label)
            for clf in clfs:
                clf.fit(X_train, y_train)
                score = clf.score(X_test, y_test)
                if score > best_score:
                    best_score = score
                    best_est = clf
    

    这是一个简单的示例,但是您可以看到如何以这种方式插入各种转换和分类器。



知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看