我在python中使用sklearn进行文本分类的PipeLine配置

时间:2016-02-13 16:58:38

标签: python machine-learning scikit-learn text-classification

我做了以下管道:

max_features =无,min_df = 2,ngram_range =(1,3)

1 - 如何打印此管道的输出?我的意思是(1-3克) 如果我想通过自己生成我的二元组什么是最好的解决方案?

2 - 如果我想添加像min-TF> 1这样的约束?

这是我的配置:

from sklearn.naive_bayes import MultinomialNB,BernoulliNB,GaussianNB
from sklearn.tree import DecisionTreeClassifier
from sklearn.neighbors import KNeighborsClassifier
from sklearn.svm import SVC
from sklearn.feature_extraction.text import TfidfTransformer
from sklearn.pipeline import Pipeline

pipeline = Pipeline([   
    ('count_vectorizer',   TfidfVectorizer(max_features=None, min_df=2,ngram_range=(1, 3),token_pattern=r'\s',analyzer = 'word' ,lowercase=False, stop_words=StopWordsList)),
    ('tfidf_transformer',  TfidfTransformer(norm='l2', smooth_idf=False, sublinear_tf=False, use_idf=True)),    ('classifier', MultinomialNB()  )# SVC(kernel='rbf', probability=True) )
])

1 个答案:

答案 0 :(得分:2)

您可以通过named_steps从管道中获取特定元素。

1。您可以访问“count_vectorizer”并打印idf_属性,该属性代表“学习的idf向量(全局术语权重)”

pipeline.named_steps['count_vectorizer'].idf_

1.1 当然,您可以打印词汇表,它会为您提供一个包含ngrams的字典,并且它们的列与学习的idf矢量相对应

pipeline.named_steps['count_vectorizer'].vocabulary_

1.2 我不会自己生成一个二元组。您可以使用管道set_params函数随时更改管道参数。在你的情况下:

pipeline.set_params(count_vectorizer__ngram_range=(1,2))

请注意params是如何构建的。因此,您的count_vectorizer__ngram_range前缀为count_vectorizer,这是您在管道中用于确切元素的名称。接下来是__标记,表示接下来是该元素的参数名称,在这种情况下,您选择的是ngram_range

但是,如果您想明确选择要计算哪些字词,可以通过vocabulary参数完成。从文档“词汇表:映射或可迭代,可选 其中键是术语和值的映射(例如,字典)是特征矩阵中的索引,或者是可迭代的术语。如果没有给出,则从输入文档中确定一个词汇表。“。所以你可以创建类似{'awesome unicorns':0, 'batman forever':1}的东西,它只会在你的双胞胎'真棒独角兽'和'蝙蝠侠'上执行tf-idf ';)

2。您也可以像在1.2中那样“动态”添加约束 pipeline.set_params(count_vectorizer__min_df=2)。虽然我看到你已经在TfidfVectorizer初始参数中设置了这个变量。所以我不确定我在这里理解你的问题。

不要忘记使用某些数据运行管道,否则将无法打印任何词汇表。例如,我加载了一些20newsgroups数据来执行我的测试然后安装你的管道。以防它对你有用:

from sklearn.datasets import fetch_20newsgroups
data = fetch_20newsgroups(subset='train', categories=['alt.atheism'])
pipeline.fit(data.data,data.target)
pipeline.named_steps['count_vectorizer'].idf_
pipeline.named_steps['count_vectorizer'].vocabulary_
pipeline.set_params(count_vectorizer__ngram_range=(1, 2)).fit(data.data,data.target)
  

推荐:如果您想在管道中尝试多种可能的配置,您可以随时设置一系列参数值并通过GridSearch获得最佳分数,这是一个很好的例子{ {3}}