Geo*_*nko 5 python pandas scikit-learn
我有 Dataframe 可以简化为:
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},])
Run Code Online (Sandbox Code Playgroud)
我想尝试不同的特征提取方法:TFIDF、word2vec、具有不同 ngram 设置的 Coutvectorizer 等。但我想尝试不同的组合:一个特征集将包含使用 TFIDF 转换的“文本”数据,以及使用Countvectoriser 和第二个将具有由 w2v 转换的文本数据,以及由 TFIDF 转换的“url”等。最后,当然,我想对不同的预处理策略进行比较并选择最好的一种。
以下是问题:
有没有办法使用 Pipeline 这样的标准 sklearn 工具来做这样的事情?
我的想法有常识吗?也许有一些好主意如何处理我所缺少的数据框中包含许多列的文本数据?
非常感谢!
@elphz 答案很好地介绍了如何使用FeatureUnion
和FunctionTransformer
完成此任务,但我认为它可以使用更多细节。
首先,我想说您需要定义您的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))])
Run Code Online (Sandbox Code Playgroud)
现在,测试变压器和分类器的变化。我建议使用变压器列表和分类器列表,并简单地迭代它们,就像网格搜索一样。
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
Run Code Online (Sandbox Code Playgroud)
这是一个简单的示例,但您可以看到如何以这种方式插入任何类型的转换和分类器。
归档时间: |
|
查看次数: |
6078 次 |
最近记录: |