用pickle加速sklearn/机器学习的分类任务?

Posted

技术标签:

【中文标题】用pickle加速sklearn/机器学习的分类任务?【英文标题】:Speed up classification task on sklearn/Machine Learning with pickle? 【发布时间】:2016-01-03 11:58:32 【问题描述】:

我已经训练了一个分类器,可以通过 pickle 加载。 我的主要疑问是是否有任何东西可以加快分类任务。每个文本(特征提取和分类)大约需要 1 分钟,这正常吗?我应该继续多线程吗?

这里有一些代码片段来看看整体流程:

for item in items:
    review = ''.join(item['review_body'])
    review_features = getReviewFeatures(review)
    normalized_predicted_rating = getPredictedRating(review_features)
    item_processed['rating'] = str(round(float(normalized_predicted_rating),1))

def getReviewFeatures(review, verbose=True):

    text_tokens = tokenize(review)

    polarity = getTextPolarity(review)

    subjectivity = getTextSubjectivity(review)

    taggs = getTaggs(text_tokens)

    bigrams = processBigram(taggs)
    freqBigram = countBigramFreq(bigrams)
    sort_bi = sortMostCommun(freqBigram)

    adjectives = getAdjectives(taggs)
    freqAdjectives = countFreqAdjectives(adjectives)
    sort_adjectives = sortMostCommun(freqAdjectives)

    word_features_adj = list(sort_adjectives)
    word_features = list(sort_bi)

    features=
    for bigram,freq in word_features:
        features['contains(%s)' % unicode(bigram).encode('utf-8')] = True
        features["count()".format(unicode(bigram).encode('utf-8'))] = freq

    for word,freq in word_features_adj:
        features['contains(%s)' % unicode(word).encode('utf-8')] = True
        features["count()".format(unicode(word).encode('utf-8'))] = freq

    features["polarity"] = polarity
    features["subjectivity"] = subjectivity

    if verbose:
        print "Get review features..."    

    return features


def getPredictedRating(review_features, verbose=True):
    start_time = time.time()
    classifier = pickle.load(open("LinearSVC5.pickle", "rb" ))

    p_rating = classifier.classify(review_features) # in the form of "# star"
    predicted_rating = re.findall(r'\d+', p_rating)[0]
    predicted_rating = int(predicted_rating)

    best_rating = 5
    worst_rating = 1
    normalized_predicted_rating = 0
    normalized_predicted_rating = round(float(predicted_rating)*float(10.0)/((float(best_rating)-float(worst_rating))+float(worst_rating)))

    if verbose:
        print "Get predicted rating..."
        print "ML_RATING: ", normalized_predicted_rating
        print("---Took %s seconds to predict rating for the review---" % (time.time() - start_time)) 

    return normalized_predicted_rating

【问题讨论】:

您是否曾经分析过您的代码以检查需要很长时间处理的确切位置?根据给定的信息,很难说时间是否正常。 我认为问题中提到的pickle 与您的问题无关,如果 [原文如此!] 分类器是缓慢的主要原因。如果腌制经过训练的模型是个好主意,那是另一个问题,imo。 review_features的维度是多少? 它与主题有关,但与您的具体问题无关。因此,请参阅 this question 作为附带信息。 8-30 是数组的长度(示例数)还是维度(特征数)?无论如何,它似乎确实很慢。那里有一些问题。 【参考方案1】:

NLTK 是一个很棒的工具,也是自然语言处理的一个很好的起点,但如果速度很重要,正如作者暗示的那样,它有时并不是很有用:

NLTK 被称为“使用 Python 进行计算语言学教学和工作的绝佳工具”和“使用自然语言的绝佳库”。

所以如果你的问题只在于工具包分类器的速度,你必须使用其他资源或者你必须自己编写分类器。

如果您想使用可能更快的分类器,Scikit 可能对您有所帮助。

【讨论】:

我的分类器是来自 sklearn.svm 的 LinearSVC。训练分类器花了 16 小时,我把它保存到了 Pickle 中。现在我只需要它来分类器分类()任务。我是 ML 新手,我只是想知道 1 秒来预测文本类别是否正常,或者是否可以减少 如果您对更快的分类方式感兴趣,我强烈建议您使用 Scikit(现已在答案中链接)。它也被一些大公司使用,你可以看到here【参考方案2】:

您似乎使用dictionary 来构建特征向量。我强烈怀疑问题就在那里。

正确的方法是使用numpy ndarray,在行上提供示例,在列上提供特征。所以,像

import numpy as np
# let's suppose 6 different features = 6-dimensional vector
feats = np.array((1, 6))
# column 0 contains polarity, column 1 subjectivity, and so on..
feats[:, 0] = polarity
feats[:, 1] = subjectivity
# ....
classifier.classify(feats)

当然,在训练过程中必须使用相同的数据结构并遵守相同的约定。

【讨论】:

如果您使用np.arraydictionary 进行比较,如果您可以同时测量两次并在此处显示测量值,那就太好了。 我无法重现 OP 的确切问题配置。然而,我使用 LinearSVC 的经验告诉我,它可以在几秒钟内对数百个具有数千个特征的示例进行分类。 对不起。这更多是针对 OP 的,她可以测量两次并在此处显示。

以上是关于用pickle加速sklearn/机器学习的分类任务?的主要内容,如果未能解决你的问题,请参考以下文章

机器学习-------sklearn决策树分析

sklearn中SVM一对一多分类参数的研究

机器学习SVM多分类问题及基于sklearn的Python代码实现

[机器学习python实践]Sklearn实现集成

机器学习贝叶斯分类器代码实现(python+sklearn)

机器学习 sklearn 监督学习 分类算法 决策树 DecisionTree