【发布时间】:2015-04-21 22:10:33
【问题描述】:
我必须训练一个分类器来检测垃圾邮件。
我拥有的数据集。
我手头有一个标记为[text, class] 的电子邮件数据集。
而且我还有很多没有类别标签的电子邮件。
我想做什么。
我想使用gridsearchcv() 函数为我的模型估计最佳超参数。其中一个参数与字典创建有关(如 1-gram 或 2-gram、最小频率等)。我想要gridsearchcv() 函数做的是在我的管道中为CountVectorizer 使用整个电子邮件数据集(带标签的电子邮件+ 不带标签的电子邮件)来创建字典。但我希望它只在标记的电子邮件上测试结果。因此,基本上我想使用整个数据集来创建字典,并且我想仅在标记数据集上使用交叉验证来估计参数。
任何帮助将不胜感激:)
更新:
重要: 解决@AndreasMueller 的答案:结果会有所不同,因为我还调整了 CountVectorizer 的参数并且我使用了逆文档频率。所以,我正在寻找一种方法,通过包含未标记的数据来使我的分类器更通用。
这就是我现在所拥有的:
pipeline = Pipeline([
('features', FeatureUnion([
('words', Pipeline([
('vect', CountVectorizer()),
('frequency_transform', TfidfTransformer())
])),
('url_feature', Contains_URL_Transformer()),
('html_feature', Contains_HTML_Transformer()),
('length_feature', Text_Length_Transformer()),
('response_feature', Contains_Re_Transformer())
])),
('clf', SVC())
])
parameters = {
'features__words__vect__min_df': (1, 3, 5),
'features__words__vect__token_pattern': (r"\b[^\W\d_]+\b",),
'features__words__vect__binary': (False,),
'features__words__frequency_transform__use_idf' : (True,),
#'vect__max_features': (None, 5000, 10000, 50000),
'features__words__vect__ngram_range': ((1, 1), (1, 2)), # unigrams or bigrams
'clf__C': (1, 5, 10),
'clf__kernel': ('linear', 'rbf')
#'tfidf__use_idf': (True, False)
#'tfidf__norm': ('l1', 'l2'),
#'clf__alpha': (0.00001, 0.000001),
#'clf__penalty': ('l2', 'elasticnet'),
#'clf__n_iter': (10, 50, 80),
}
grid_search = GridSearchCV(pipeline, parameters, n_jobs=-1, verbose=1)
data_column = numpy.asarray(data['text'])
data_column = numpy.append(data_column, ['test'])
grid_search.fit(data_column, numpy.asarray(data['class']))
best_parameters = grid_search.best_estimator_.get_params()
for param_name in sorted(parameters.keys()):
print("\t%s: %r" % (param_name, best_parameters[param_name]))
但我也有unlabled_data['text']。如何将data['text'] 和unlabled_data['text'] 的混合添加到管道中,以便从该混合中创建字典(并估计参数),但要在标记数据上对其进行测试。问题是当我做grid_search.fit() 时,它使用提供的数据集来创建字典,我看不出有办法把所有的电子邮件都放在那里。
【问题讨论】:
-
你坚持哪一部分?试过什么?在线文档很清楚
-
@EdChum,我被困在管道部分。我更新了我的问题。如果您指出我可以找到答案的文档,我将非常高兴。
-
我认为这是一个非常合理的问题,我能想出的最佳解决方案有点令人失望。在 scikit-learn-general 邮件列表中提出这个问题可能是值得的。
-
@joeln,不过,谢谢。
-
为了更清楚地说明这一点,您应该编辑问题以突出显示您的参数搜索包含 CountVectorizer 参数这一事实。
标签: python email pandas scikit-learn text-classification