Python scikit学习:分类计时正确吗?

Python scikit学习:分类计时正确吗?,python,numpy,scipy,scikit-learn,Python,Numpy,Scipy,Scikit Learn,嗨,我把推特分为7类。我有大约25万条培训推文和另外25万条测试推文。我的代码可以在下面找到。training.pkl是训练推文,testing.pkl是测试推文。我也有相应的标签,你可以看到 当我执行代码时,我发现将测试集(raw)转换为功能空间需要14.9649999142秒。我还测量了分类测试集中所有tweet所需的时间,即0.131999969482秒 虽然在我看来,这个框架不太可能在0.131999969482秒内对大约250000条tweet进行分类。我现在的问题是,这是正确的吗 f

嗨,我把推特分为7类。我有大约25万条培训推文和另外25万条测试推文。我的代码可以在下面找到。training.pkl是训练推文,testing.pkl是测试推文。我也有相应的标签,你可以看到

当我执行代码时,我发现将测试集(raw)转换为功能空间需要14.9649999142秒。我还测量了分类测试集中所有tweet所需的时间,即0.131999969482秒

虽然在我看来,这个框架不太可能在0.131999969482秒内对大约250000条tweet进行分类。我现在的问题是,这是正确的吗

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_列车打印

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

火车印刷机

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

提取的
X_序列
X_测试
稀疏矩阵中非零特征的形状和数量是什么?它们是否与语料库中的单词数量近似相关

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

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

>>> 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])
>>从sklearn.dataset导入fetch\u 20新闻组
>>>从sklearn.feature\u extraction.text导入TfidfVectorizer
>>>二十个=获取新闻组()
>>>%time X=TfidfVectorizer().fit\u变换(二十个.data)
CPU时间:用户10.74秒,系统0.32秒,总计11.06秒
壁时间:11.04秒
>>>X
>>>从sklearn.linear_模型导入SGDClassizer
>>>%time clf=sgdclassizer().fit(X,20.target)
CPU时间:用户0.50秒,系统0.01秒,总计0.51秒
壁时间:0.51秒
>>>百分比时间clf.predict(X)
CPU时间:用户0.10秒,系统0.00秒,总计0.11秒
壁时间:0.11秒
数组([7,4,4,…,3,1,8])

它们都是稀疏矩阵。我已将print X_train的输出添加到问题中。所以你认为这是正常的和可能的?事实上我犯了一个错误,打印你需要的
repr
内置数据。我再次编辑我的答案。根据您上次的输入再次更新我的答案。在现代硬件上,用大约100万个非零数字特征对文本片段进行分类确实需要大约0.10秒。但是你必须把特征提取(向量器.transform调用)作为你推特分类的时间考虑在内。我做了。你似乎在几个网站上给出了很好的答案!