Scikit learn-fit transform на тестовом наборе
Я изо всех сил пытаюсь использовать случайный лес в Python с помощью Scikit learn. Моя проблема заключается в том, что я использую его для классификации текста (в 3 - х классах-положительный/отрицательный/нейтральный), и функции, которые я извлекаю, в основном слова/униграммы, поэтому мне нужно преобразовать их в числовые функции. Я нашел способ сделать это с помощью 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
работает с набором данных train, который содержит около 8000 экземпляров, но когда я пытаюсь преобразовать мой тестовый набор в числовой особенности тоже, что составляет около 80000 экземпляров, я получаю ошибку памяти, говоря, что:
testFeatures1 = vec.fit_transform(testFeatures)
File "C:Python27libsite-packagessklearnfeature_extractiondict_vectorizer.py", line 143, in fit_transform
return self.transform(X)
File "C:Python27libsite-packagessklearnfeature_extractiondict_vectorizer.py", line 251, in transform
Xa = np.zeros((len(X), len(vocab)), dtype=dtype)
MemoryError
Что может быть причиной этого и есть ли какой-либо обходной путь? Большое спасибо!
1 ответ:
Вы не должны делать
fit_transform
на ваших тестовых данных, а толькоtransform
. В противном случае вы получите другую векторизацию, чем та, которая использовалась во время обучения.Для Проблемы памяти я рекомендую
TfIdfVectorizer
, который имеет множество вариантов уменьшения размерности (путем удаления редких униграмм и т. д.).Обновить
Если единственная проблема заключается в подгонке тестовых данных, просто разбейте их на небольшие куски. Вместо чего-то вроде
x=vect.transform(test) eval(x)
Вы можете do
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 )