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 12

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 )