【问题标题】:scikit-learn: Classification timing correct?scikit-learn:分类时间正确吗?
【发布时间】:2012-12-23 10:02:51
【问题描述】:

您好,我将推文分为 7 类。我有大约 250.000 条训练推文和另外 250.000 条不同的测试推文。我的代码可以在下面找到。 training.pkl 是训练推文, testing.pkl 是测试推文。如你所见,我也有相应的标签。

当我执行我的代码时,我发现将测试集(原始)转换为特征空间需要 14.9649999142 秒。我还测量了对测试集中的所有推文进行分类所需的时间,即 0.131999969482 秒。

尽管在我看来,这个框架不太可能在 0.131999969482 秒内对大约 250.000 条推文进行分类。我现在的问题是,这对吗?

file = open("training.pkl", 'rb')
training = cPickle.load(file)
file.close()


file = open("testing.pkl", 'rb')
testing = cPickle.load(file)
file.close()

file = open("ground_truth_testing.pkl", 'rb')
ground_truth_testing = cPickle.load(file)
file.close()

file = open("ground_truth_training.pkl", 'rb')
ground_truth_training = cPickle.load(file)
file.close()


print 'data loaded'
tweetsTestArray = np.array(testing)
tweetsTrainingArray = np.array(training)
y_train = np.array(ground_truth_training)


# Transform dataset to a design matrix with TFIDF and 1,2 gram
vectorizer = TfidfVectorizer(sublinear_tf=True, max_df=0.5,  ngram_range=(1, 2))

X_train = vectorizer.fit_transform(tweetsTrainingArray)
print "n_samples: %d, n_features: %d" % X_train.shape


print 'COUNT'
_t0 = time.time()
X_test = vectorizer.transform(tweetsTestArray)
print "n_samples: %d, n_features: %d" % X_test.shape
_t1 =  time.time()

print  _t1 - _t0
print 'STOP'

# TRAINING & TESTING

print 'SUPERVISED'
print '----------------------------------------------------------'
print 

print 'SGD'

#Initialize Stochastic Gradient Decent
sgd = linear_model.SGDClassifier(loss='modified_huber',alpha = 0.00003, n_iter = 25)

#Train
sgd.fit(X_train, ground_truth_training)

#Predict

print "START COUNT"
_t2 = time.time()
target_sgd = sgd.predict(X_test)
_t3 = time.time()

print _t3 -_t2
print "END COUNT"

# Print report
report_sgd = classification_report(ground_truth_testing, target_sgd)
print report_sgd
print

X_train 打印

 <248892x213162 sparse matrix of type '<type 'numpy.float64'>'
    with 4346880 stored elements in Compressed Sparse Row format>

X_train 打印

 <249993x213162 sparse matrix of type '<type 'numpy.float64'>'
    with 4205309 stored elements in Compressed Sparse Row format>

【问题讨论】:

    标签: python numpy scipy scikit-learn


    【解决方案1】:

    提取的X_trainX_test 稀疏矩阵中非零特征的形状和数量是多少?它们是否与您的语料库中的单词数量大致相关?

    分类预计比线性模型的特征提取快得多。它只是计算一个点积,因此与非零的数量(即近似于您的测试集中的单词数量)成线性关系。

    编辑:要获取稀疏矩阵 X_trainX_test 内容的统计信息,只需执行以下操作:

    >>> print repr(X_train)
    >>> print repr(X_test)
    

    编辑 2:您的数字看起来不错。对数值特征的线性模型预测确实比特征提取快得多:

    >>> from sklearn.datasets import fetch_20newsgroups
    >>> from sklearn.feature_extraction.text import TfidfVectorizer
    >>> twenty = fetch_20newsgroups()
    >>> %time X = TfidfVectorizer().fit_transform(twenty.data)
    CPU times: user 10.74 s, sys: 0.32 s, total: 11.06 s
    Wall time: 11.04 s
    
    >>> X
    <11314x56436 sparse matrix of type '<type 'numpy.float64'>'
        with 1713894 stored elements in Compressed Sparse Row format>
    >>> from sklearn.linear_model import SGDClassifier
    
    >>> %time clf = SGDClassifier().fit(X, twenty.target)
    CPU times: user 0.50 s, sys: 0.01 s, total: 0.51 s
    Wall time: 0.51 s
    
    >>> %time clf.predict(X)
    CPU times: user 0.10 s, sys: 0.00 s, total: 0.11 s
    Wall time: 0.11 s
    array([7, 4, 4, ..., 3, 1, 8])
    

    【讨论】:

    • 它们都是稀疏矩阵。我已将 print X_train 的输出添加到问题中。所以你认为这是正常的和可能的?
    • 确实我犯了一个错误,打印你需要repr内置的统计数据。我再次编辑我的答案。
    • 根据您最后的输入再次更新了我的答案。在现代硬件上,对具有约 100 万个非零数字特征的文本 sn-ps 进行分类确实需要大约 0.10 秒。但是您必须将特征提取(vectorizer.transform 调用)考虑到您的推文分类时间。
    • 我做到了。您似乎在几个网站上给出了很好的答案!
    猜你喜欢
    • 2014-11-24
    • 2021-09-14
    • 2016-05-22
    • 2017-06-08
    • 2014-04-21
    • 2016-10-17
    • 2018-07-03
    • 2015-05-09
    • 2014-04-05
    相关资源
    最近更新 更多