【问题标题】:Scikit learn - fit_transform on the test setScikit learn - 测试集上的 fit_transform
【发布时间】:2014-03-26 17:17:29
【问题描述】:

我正在努力在 Python 中使用 Scikit learn 中的随机森林。我的问题是我将它用于文本分类(在 3 个类中 - 正/负/中性),我提取的特征主要是单词/unigrams,所以我需要将它们转换为数字特征。我找到了使用DictVectorizer's fit_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() 调用。
  • scikit-learn 的 RandomForestClassifier 不将稀疏矩阵作为输入。一种解决方案是将您的测试集分成一定大小的批次,然后在每个较小的批次上运行预测。
  • @Matt 确实,这就是我使用 sparse=False 的原因。
  • 另一种解决方案是使用TfIdfVectorizer后跟TruncatedSVD来降低特征空间的维数。
  • 您不需要LabelEncodery 可能包含字符串。

标签: machine-learning classification scikit-learn random-forest text-classification


【解决方案1】:

你不应该对你的测试数据做fit_transform,而只能transform。否则,您将获得与训练期间使用的不同的矢量化。

对于内存问题,我推荐TfIdfVectorizer,它有很多降低维度的选项(通过删除稀有的一元组等)。

更新

如果唯一的问题是拟合 test 数据,只需将其拆分为小块即可。而不是像

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 )

【讨论】:

    猜你喜欢
    • 2016-01-16
    • 2013-12-19
    • 1970-01-01
    • 2017-11-29
    • 1970-01-01
    • 2020-01-21
    • 2018-03-12
    • 2015-09-24
    • 2014-05-01
    相关资源
    最近更新 更多