Scikit learn - 对测试集进行fit_transform

14

我在使用Python和Scikit learn中的随机森林时遇到了困难。我的问题是,我将其用于文本分类(分为3类-积极/消极/中性),而我提取的特征主要是单词/单元组,因此我需要将这些转换为数值特征。我找到了一种使用DictVectorizerfit_transform来实现的方法:

from sklearn.preprocessing import LabelEncoder
from sklearn.metrics import classification_report
from sklearn.feature_extraction import DictVectorizer

vec = DictVectorizer(sparse=False)
rf = RandomForestClassifier(n_estimators = 100)
trainFeatures1 = vec.fit_transform(trainFeatures)

# Fit the training data to the training output and create the decision trees
rf = rf.fit(trainFeatures1.toarray(), LabelEncoder().fit_transform(trainLabels))

testFeatures1 = vec.fit_transform(testFeatures)
# Take the same decision trees and run on the test data
Output = rf.score(testFeatures1.toarray(), LabelEncoder().fit_transform(testLabels))

print "accuracy: " + str(Output)

我的问题是fit_transform方法正在处理训练数据集,该数据集包含大约8000个实例,但是当我尝试将测试集也转换为数值特征时,该测试集包含大约80000个实例,我会收到一个内存错误,提示:

testFeatures1 = vec.fit_transform(testFeatures)
File "C:\Python27\lib\site-packages\sklearn\feature_extraction\dict_vectorizer.py", line 143, in fit_transform
return self.transform(X)
File "C:\Python27\lib\site-packages\sklearn\feature_extraction\dict_vectorizer.py", line 251, in transform
Xa = np.zeros((len(X), len(vocab)), dtype=dtype)
MemoryError

有什么可能会导致这种情况,是否有任何解决方法?非常感谢!


你可以尝试使用稀疏特征吗?我认为不需要调用toarray()函数。 - Rob Neuhaus
2
scikit-learn的RandomForestClassifier不接受稀疏矩阵作为输入。一个解决方案是将测试集分成一定大小的批次,然后在每个较小的批次上运行预测。 - Matt
@rrenaud 我也尝试过创建 vec 对象并使用 DicVectorizer(),但仍然没有帮助。 - Crista23
1
@Matt 确实,这就是我使用 sparse=False 的原因。 - Crista23
2
еҸҰдёҖз§Қи§ЈеҶіж–№жЎҲжҳҜдҪҝз”ЁTfIdfVectorizerпјҢ然еҗҺдҪҝз”ЁTruncatedSVDжқҘеҮҸе°‘зү№еҫҒз©әй—ҙзҡ„з»ҙеәҰгҖӮ - Matt
1
你不需要使用 LabelEncodery 可能包含字符串。 - Fred Foo
1个回答

16

在测试数据中,您不应该执行fit_transform,只需要执行transform。否则,您将得到与训练期间使用的矢量化不同的结果。

对于内存问题,我推荐使用TfIdfVectorizer,它有很多选项可以减少维度(例如删除罕见的单词等)。

更新

如果唯一的问题是拟合测试数据,则只需将其分成小块。而不是像这样:

x=vect.transform(test)
eval(x)

你可以做

K=10
for i in range(K):
    size=len(test)/K
    x=vect.transform(test[ i*size : (i+1)*size ])
    eval(x)

并记录结果/统计数据,并在之后进行分析。

特别是

predictions = []

K=10
for i in range(K):
    size=len(test)/K
    x=vect.transform(test[ i*size : (i+1)*size ])
    predictions += rf.predict(x) # assuming it retuns a list of labels, otherwise - convert it to list

print accuracy_score( predictions, true_labels )

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接