Почему производительность снижается при подборе модели Random Forest после снижения с помощью PCA?

1

Этот вопрос связан с сопоставлением скорости между моделью случайного лесного классификатора по полному набору функций по сравнению с моделью случайного леса с уменьшенным числом компонентов после выполнения PCA. Я использую набор данных MNIST, который имеет 60 000 строк для моего обучения (X_train) и 10 000 для моего теста (X_test) и 784 функций, которые представляют собой пиксели, представляющие изображение 28x28.

Для полного набора функций я измеряю время, необходимое для использования с помощью clock():

clf = RandomForestClassifier()
t0 = time.clock()
clf.fit(X_train, y_train)
runtime = time.clock() - t0

Для выполнения PCA и Random Forest я делаю что-то подобное:

pca = PCA(n_components = 0.95)
t0 = time.clock()
components = pca.fit_transform(X_train)
clf.fit(components, y_train)
runtime = time.clock() - t0

Для полного набора я получаю время работы ~ 6 секунд, а для второго набора - время работы ~ 27 секунд. Даже если я разойдусь, чтобы посмотреть только время выполнения (удаление времени, необходимого для выполнения pca), я все равно получаю приблизительно 6 секунд по сравнению с 14 секундами. Количество функций для полного набора составляет 784, а PCA - до 154 компонентов. Мое ограниченное понимание заключается в том, что, по крайней мере, установка модели должна быть более быстрой с PCA из-за ограниченного числа функций - почему это не так?

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

Теги:
random-forest
scikit-learn
pca
mnist

1 ответ

5
Лучший ответ

Разница в возможностях

Вы сказали, что изначально у вас есть 784 функции, но вы уменьшаете их до 154. Это может показаться много. Однако, если вы посмотрите на документацию:

max_features: int, float, string или None, optional (default = "auto")

Количество функций, которые нужно учитывать при поиске лучшего раскола:

  • Если "auto", то max_features = sqrt (n_features).

Это означает, что ваша первоначальная проблема была sqrt(784) = 28 и вы уменьшили ее до sqrt(154) = 12.

Да, теперь он меньше, но не так мал, как вы изначально думали.

оптимизация

То, как строится ваш случайный лес, - это поиск возможных расколов и выбор лучших по определенным критериям. Обратите внимание на документацию:

criterion: string, optional (default = "gini")

Функция для измерения качества раскола. Поддерживаемые критерии - "gini" для примеси Gini и "энтропии" для получения информации. Примечание: этот параметр имеет значение, специфичное для дерева.

[...]

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

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

  • 0
    Отличный и четкий ответ - спасибо !! Всегда ли это часто случается при сокращении возможностей с помощью PCA и Random Forest? Существуют ли параметры, которые мы можем настроить или изменить, чтобы они не оказывали негативного влияния на скорость?
  • 0
    Это может не всегда иметь место, это действительно будет зависеть от пространства поиска, которое создаст PCA. Это действительно вопрос испытания. Я предполагаю, что это красота науки о данных;) Чтобы уменьшить скорость, вы, конечно, можете уменьшить max_leaf_nodes или увеличить min_samples_leaf . Однако это повлияет на вашу производительность. Чтобы уменьшить время и сохранить производительность, вы можете найти интересное увеличение n_jobs с 1 до -1 (да, -1 в этом контексте больше 1 ).

Ещё вопросы

Сообщество Overcoder
Наверх
Меню