2014-02-10 3 views
5

У меня есть набор текстовых документов 4k. Они относятся к 10 различным классам. Я пытаюсь увидеть, как случайный метод леса выполняет классификацию. Проблема заключается в том, что мои функции извлечения экстрактов извлекают 200 тыс. Функций (комбинация слов, биграмм, коллокаций и т. Д.) Это очень редкие данные, а случайная реализация леса в sklearn не работает с разреженными входами данных.Классификация текстовых документов со случайными лесами

В. Какие у меня варианты? Уменьшить количество функций? Как ? В. Есть ли какая-либо реализация случайного леса, работающего с разреженным массивом.

Мой соответствующий код выглядит следующим образом:

import logging 
import numpy as np 
from optparse import OptionParser 
import sys 
from time import time 
#import pylab as pl 

from sklearn.datasets import load_files 
from sklearn.feature_extraction.text import CountVectorizer 
from sklearn.ensemble import RandomForestClassifier 
from special_analyzer import * 


data_train = load_files(RAW_DATA_SRC_TR) 
data_test = load_files(RAW_DATA_SRC_TS) 
# split a training set and a test set 
y_train, y_test = data_train.target, data_test.target 

vectorizer = CountVectorizer(analyzer=SpecialAnalyzer()) # SpecialAnalyzer is my class extracting features from text 
X_train = vectorizer.fit_transform(data_train.data) 



rf = RandomForestClassifier(max_depth=10,max_features=10) 
rf.fit(X_train,y_train) 
+0

Я использовал RF только на Java, но, похоже, вам нужно сделать «нормированное» векторное представление каждого документа. В Java это может быть представлено сначала как SortedMap , где строковый ключ является признаком, а double val - это частота слова в этом документе. если вы вектурируете все, как это, тогда представляете каждый документ как стандартный двойной массив [], алгоритм должен это делать. Другими словами, DOC1 выглядит как a, b, а DOC2 выглядит как a, c, после нормального/vectoization doc 1 должен стать a = 1, b = 1, c = 0 и DOC2 будет a = 1, b = 0, с = 1. – markg

+1

Из [doc версии 0.16.1] (http://scikit-learn.org/stable/modules/generated/sklearn.ensemble.RandomForestClassifier.html#sklearn.ensemble.RandomForestClassifier.fit) кажется, что 'sklearn. ensemble.RandomForestClassifier.fit' теперь принимают разреженную матрицу в качестве входных данных: 'Параметры: \t X: массивная или разреженная матрица формы = [n_samples, n_features]' – jul

ответ

2

Вариант 1: «Если число переменных очень велико, леса можно запустить один раз со всеми переменными, а затем запустить снова, используя только самые важные переменные с первого запуска ».

от: http://www.stat.berkeley.edu/~breiman/RandomForests/cc_home.htm#giniimp

Я не уверен, что случайный лес sklearn имеет опцию особенность значение. Случайный лес в R реализует среднее уменьшение примеси Джини, а также среднее снижение точности.

Вариант 2: Уменьшение размеров. Используйте PCA или другую методику уменьшения размеров, чтобы изменить плотную матрицу размеров N на меньшую матрицу, а затем использовать эту меньшую менее разреженную матрицу для задачи классификации.

Вариант 3: Опорные коррелированные функции. Я считаю, что случайный лес должен быть более устойчивым к коррелированным функциям по сравнению с многонациональной логистической регрессией. Это, как говорится, может быть так, что у вас есть ряд взаимосвязанных функций. Если у вас много парных коррелированных переменных, вы можете отбросить одну из двух переменных, и теоретически вы не потеряете «прогностическую силу». В дополнение к парной корреляции есть также множественные корреляции. Проверьте: http://en.wikipedia.org/wiki/Variance_inflation_factor

+0

Спасибо за быстрый ответ Andrew, у вас есть пример кода R, который может помочь. . Я в основном знаком с python. – Yantra

+0

Я добавил немного больше о коррелированных переменных ... Это может значительно уменьшить количество переменных, а также дать вам много информации о ваших входах. Дайте мне знать, если это работает/помогает –

+0

. Я попробую ваши предложения и опубликую результаты здесь. Благодарю. – Yantra

6

Несколько вариантов: взять только самые 10000 наиболее популярные функции, передавая max_features=10000 к CountVectorizer и преобразовывать результаты в плотном Numpy массив с в массиве методом:

X_train_array = X_train.toarray() 

В противном случае уменьшить размерность 100 или 300 с размерами:

pca = TruncatedSVD(n_components=300) 
X_reduced_train = pca.fit_transform(X_train) 

Однако в моем опыте я никогда не мог сделать РФ работать лучше, чем хорошо отлаженная линейная модель (например, логистическая регрессия с гр id, поиск по параметру регуляризации) на исходные разреженные данные (возможно, с нормализацией TF-IDF).

+1

s/RandomizedPCA/TruncatedSVD –

+0

с помощью max_features Я могу получить его. Но я думаю, что я нахожу то же поведение, что RF не превосходит линейную модель. – Yantra

+0

Какие параметры вы нашли, которые являются оптимальными для хорошо настроенной логистической регрессии @ogrisel? – tumbleweed

Смежные вопросы