WedX - журнал о программировании и компьютерных науках

Scikit Learn — fit_transform на тестовом наборе

Я изо всех сил пытаюсь использовать Random Forest в Python с обучением Scikit. Моя проблема в том, что я использую его для классификации текста (в 3 классах - положительный/отрицательный/нейтральный), а функции, которые я извлекаю, - это в основном слова/униграммы, поэтому мне нужно преобразовать их в числовые функции. Я нашел способ сделать это с помощью fit_transform DictVectorizer:

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() нужны. 25.02.2014
  • RandomForestClassifier scikit-learn не принимает разреженные матрицы в качестве входных данных. Одно из решений состоит в том, чтобы разделить набор тестов на пакеты определенного размера, а затем выполнить прогнозирование для каждого из меньших пакетов. 25.02.2014
  • @rrenaud Я также попробовал это, создав объект vec как vec = DicVectorizer(). все равно не помогло.. 25.02.2014
  • @Matt Действительно, именно поэтому я использовал sparse=False. 25.02.2014
  • Другое решение — использовать TfIdfVectorizer, за которым следует TruncatedSVD, чтобы уменьшить размерность пространства признаков. 25.02.2014
  • Вам не нужен LabelEncoder. y может содержать строки. 25.02.2014

Ответы:


1

Вы не должны делать 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 )
25.02.2014
Новые материалы

Объяснение документов 02: BERT
BERT представил двухступенчатую структуру обучения: предварительное обучение и тонкая настройка. Во время предварительного обучения модель обучается на неразмеченных данных с помощью..

Как проанализировать работу вашего классификатора?
Не всегда просто знать, какие показатели использовать С развитием глубокого обучения все больше и больше людей учатся обучать свой первый классификатор. Но как только вы закончите..

Работа с цепями Маркова, часть 4 (Машинное обучение)
Нелинейные цепи Маркова с агрегатором и их приложения (arXiv) Автор : Бар Лайт Аннотация: Изучаются свойства подкласса случайных процессов, называемых дискретными нелинейными цепями Маркова..

Crazy Laravel Livewire упростил мне создание электронной коммерции (панель администратора и API) [Часть 3]
Как вы сегодня, ребята? В этой части мы создадим CRUD для данных о продукте. Думаю, в этой части я не буду слишком много делиться теорией, но чаще буду делиться своим кодом. Потому что..

Использование машинного обучения и Python для классификации 1000 сезонов новичков MLB Hitter
Чему может научиться машина, глядя на сезоны новичков 1000 игроков MLB? Это то, что исследует это приложение. В этом процессе мы будем использовать неконтролируемое обучение, чтобы..

Учебные заметки: создание моего первого пакета Node.js
Это мои обучающие заметки, когда я научился создавать свой самый первый пакет Node.js, распространяемый через npm. Оглавление Глоссарий I. Новый пакет 1.1 советы по инициализации..

Забудьте о Matplotlib: улучшите визуализацию данных с помощью умопомрачительных функций Seaborn!
Примечание. Эта запись в блоге предполагает базовое знакомство с Python и концепциями анализа данных. Привет, энтузиасты данных! Добро пожаловать в мой блог, где я расскажу о невероятных..


Для любых предложений по сайту: [email protected]