Случайный лес с большим количеством функций, чем точек данных

Я пытаюсь предсказать, нужно ли конкретному сервисному билету, поднятому клиентом, изменить код.

У меня есть данные тренировок.

У меня есть около 17 тысяч точек данных с описанием проблемы и тегом (Y для изменения кода и N для изменения кода)

Я сделал TF-IDF, и он дал мне 27k функций. Поэтому я попытался приспособить RandomForestClassifier (sklearn python) к этой матрице 17k x 27k.

Я получаю очень низкие оценки на тестовом наборе, в то время как точность обучения очень высока.

Точность в наборе поездов: 89% Точность в наборе испытаний: 21%

Может кто-нибудь предложить какие-либо обходные пути?

Я использую эту модель сейчас:

sklearn.RandomForestClassifier(n_jobs=3,n_estimators=100,class_weight='balanced',max_features=None,oob_score=True)

Пожалуйста помоги!

РЕДАКТИРОВАТЬ: у меня есть 11k данных тренировок с 900 положительными (перекос). Я пробовал LinearSVC sparsify, но не работал так же хорошо, как усеченный SVD (скрытое семантическое индексирование). maxFeatures= Ни один не работает лучше на тестовом наборе, чем без него.

Я также попробовал SVM, логистику (l2 и l1), ExtraTrees. RandonForest по-прежнему работает лучше всего. Прямо сейчас, с точностью 92% на позитивах, но отзыв только 3%

Любые другие предложения будут оценены!

Обновление: проектирование функций очень помогло. Я вытащил функции из воздуха (длина символов, длина слов, их, разница, соотношение, день недели, о котором сообщалось о проблеме, день месяца и т. Д.), И теперь я нахожусь на 19-20%, а>95% точности

Пища для ваших мыслей об использовании усредненных векторов word2vec в качестве глубоких возможностей для свободного текста вместо tf-idf или пакета слов???

2 ответа

[редактировать]

Случайный лес обрабатывает больше функций, чем точек данных. RF, например, используется для исследований микроматрицы с, например, отношением точка / характеристика данных 100:5000 или в исследованиях с одним нуклеотидом / полиморфизмом (SNP), например, с отношением 5000:500000.

Я не согласен с диагнозом, предоставленным @ncfirth, но предложенное лечение выбора переменных может в любом случае помочь.

Ваш случайный лес по умолчанию не сильно перегружен. Просто не имеет смысла обращать какое-либо внимание на эффективность прогнозирования обучающего набора без перекрестной проверки для RF-модели, потому что любая выборка заканчивается в конечных узлах / листьях, которые она сама определила. Но общая модель ансамбля все еще устойчива.[править] Если бы вы изменили max_depth или же min_samples_splitточность обучения, вероятно, упадет, но это не главное. Неподтвержденная ошибка обучения / точность модели случайного леса или многих других ансамблевых моделей просто не дает ничего полезного.

[Перед редактированием я перепутал max_features с n_estimators, но в основном я использую R]

Установка max_features="none" - это не случайный лес, а скорее "деревья в мешках". Вы можете извлечь выгоду из несколько меньших значений max_features, которые улучшают регуляризацию и скорость, а может и нет. Я бы попытался снизить max_features где-то между 27000/3 и sqrt(27000), типичный оптимальный диапазон.

Вы можете добиться лучшей производительности прогнозирования набора тестов, выбрав функцию. Вы можете запустить одну модель RF, оставить самые важные функции на ~5-50%, а затем повторно запустить модель с меньшим количеством функций. Выбор переменной "L1 lasso", как предполагает ncfirth, также может быть жизнеспособным решением.

Ваш показатель эффективности и точности прогнозирования может быть неоптимальным в случае несбалансированных данных или в случае, если стоимость ложноотрицательных и ложноположительных результатов совершенно различна.

Если ваш тестовый набор по-прежнему прогнозируется намного хуже, чем обучающий набор с перекрестной проверкой из пакета, у вас могут возникнуть проблемы с предположениями IID, на которые опирается любая контролируемая модель ML, или вам может потребоваться обернуть всю обработку данных во внешнюю среду. цикл перекрестной проверки, чтобы избежать чрезмерно оптимистичной оценки эффективности прогнозирования, например, из-за шага выбора переменной.

Похоже, ты оделся на тренировочном наборе. В основном модель узнала шум по данным, а не по сигналу. Есть несколько способов борьбы с этим, но кажется вполне очевидным, что ваша модель имеет наряд из-за невероятно большого количества функций, которыми вы ее снабжаете.

РЕДАКТИРОВАТЬ: Кажется, я был, возможно, слишком быстро, чтобы прийти к выводу о переоснащении, однако это все еще может иметь место (оставлено в качестве упражнения для читателя!). Тем не менее, выбор функций может улучшить универсальность и надежность вашей модели.

Хорошее место для начала удаления функций в scikit-learn был бы здесь. Использование разреженности является довольно распространенным способом выбора функций:

from sklearn.svm import LinearSVC
from sklearn.feature_selection import SelectFromModel
import numpy as np

# Create some data
X = np.random.random((1800, 2700))
# Boolean labels as the y vector
y = np.random.random(1800)
y = y > 0.5
y = y.astype(bool)

lsvc = LinearSVC(C=0.05, penalty="l1", dual=False).fit(X, y)
model = SelectFromModel(lsvc, prefit=True)
X_new = model.transform(X)

print X_new.shape

Который возвращает новую матрицу формы (1800, 640), Вы можете настроить количество выбранных функций, изменив C параметр (называется параметром штраф в scikit-learn но иногда называют параметром разреженности).

Другие вопросы по тегам