文本分类性能
Text classification performance
所以我正在使用 textblob python 库,但性能不足。
我已经序列化它并在循环之前加载它(使用 pickle)。
目前需要 ~ 0.1(对于小训练数据)和 ~ 0.3 33'000 测试数据。我需要让它更快,有可能吗?
一些代码:
# Pass trainings before loop, so we can make performance a lot better
trained_text_classifiers = load_serialized_classifier_trainings(config["ALL_CLASSIFICATORS"])
# Specify witch classifiers are used by witch classes
filter_classifiers = get_classifiers_by_resource_names(trained_text_classifiers, config["FILTER_CLASSIFICATORS"])
signal_classifiers = get_classifiers_by_resource_names(trained_text_classifiers, config["SIGNAL_CLASSIFICATORS"])
for (url, headers, body) in iter_warc_records(warc_file, **warc_filters):
start_time = time.time()
body_text = strip_html(body);
# Check if url body passess filters, if yes, index, if no, ignore
if Filter.is_valid(body_text, filter_classifiers):
print "Indexing", url.url
resp = indexer.index_document(body, body_text, signal_classifiers, url=url, headers=headers, links=bool(args.save_linkgraph_domains))
else:
print "\n"
print "Filtered out", url.url
print "\n"
resp = 0
这是循环 对每个 warc 文件的主体和元数据执行检查。
此处有 2 个文本分类检查。
1) 在过滤器中(非常小的训练数据):
if trained_text_classifiers.classify(body_text) == "True":
return True
else:
return False
2) 在 index_document(33'000 个训练数据)中:
prob_dist = trained_text_classifier.prob_classify(body)
prob_dist.max()
# Return the propability of spam
return round(prob_dist.prob("spam"), 2)
分类和 prob_classify 是使用该工具提高性能的方法。
您可以为您的数据使用特征 selection。一些好的特征 selection 可以减少高达 90% 的特征并保持分类性能。
在特征 selection 你 select top feature(在 Bag Of Word 模型中,你 select top influence words),并基于这些训练模型词(特征)。这减少了数据的维度(也防止了维度诅咒)
这是一个很好的调查:
Survey on feature selection
简述:
两种功能 selection 方法可用:过滤和包装
过滤方法几乎是基于信息论。搜索 "Mutual Information"、"chi2" 和...此类功能 selection
包装方法使用分类算法来估计库中最重要的特征。例如,您 select 一些词并评估分类性能(召回率、精度)。
其他一些方法也很有用。 LSA 和 LSI 可以胜过分类性能和时间:
https://en.wikipedia.org/wiki/Latent_semantic_analysis
您可以将 sickit 用于特征 selection 和 LSA:
http://scikit-learn.org/stable/modules/feature_selection.html
所以我正在使用 textblob python 库,但性能不足。
我已经序列化它并在循环之前加载它(使用 pickle)。
目前需要 ~ 0.1(对于小训练数据)和 ~ 0.3 33'000 测试数据。我需要让它更快,有可能吗?
一些代码:
# Pass trainings before loop, so we can make performance a lot better
trained_text_classifiers = load_serialized_classifier_trainings(config["ALL_CLASSIFICATORS"])
# Specify witch classifiers are used by witch classes
filter_classifiers = get_classifiers_by_resource_names(trained_text_classifiers, config["FILTER_CLASSIFICATORS"])
signal_classifiers = get_classifiers_by_resource_names(trained_text_classifiers, config["SIGNAL_CLASSIFICATORS"])
for (url, headers, body) in iter_warc_records(warc_file, **warc_filters):
start_time = time.time()
body_text = strip_html(body);
# Check if url body passess filters, if yes, index, if no, ignore
if Filter.is_valid(body_text, filter_classifiers):
print "Indexing", url.url
resp = indexer.index_document(body, body_text, signal_classifiers, url=url, headers=headers, links=bool(args.save_linkgraph_domains))
else:
print "\n"
print "Filtered out", url.url
print "\n"
resp = 0
这是循环 对每个 warc 文件的主体和元数据执行检查。
此处有 2 个文本分类检查。
1) 在过滤器中(非常小的训练数据):
if trained_text_classifiers.classify(body_text) == "True":
return True
else:
return False
2) 在 index_document(33'000 个训练数据)中:
prob_dist = trained_text_classifier.prob_classify(body)
prob_dist.max()
# Return the propability of spam
return round(prob_dist.prob("spam"), 2)
分类和 prob_classify 是使用该工具提高性能的方法。
您可以为您的数据使用特征 selection。一些好的特征 selection 可以减少高达 90% 的特征并保持分类性能。 在特征 selection 你 select top feature(在 Bag Of Word 模型中,你 select top influence words),并基于这些训练模型词(特征)。这减少了数据的维度(也防止了维度诅咒) 这是一个很好的调查: Survey on feature selection
简述:
两种功能 selection 方法可用:过滤和包装
过滤方法几乎是基于信息论。搜索 "Mutual Information"、"chi2" 和...此类功能 selection
包装方法使用分类算法来估计库中最重要的特征。例如,您 select 一些词并评估分类性能(召回率、精度)。
其他一些方法也很有用。 LSA 和 LSI 可以胜过分类性能和时间: https://en.wikipedia.org/wiki/Latent_semantic_analysis
您可以将 sickit 用于特征 selection 和 LSA:
http://scikit-learn.org/stable/modules/feature_selection.html