Этот вопрос связан с сопоставлением скорости между моделью случайного лесного классификатора по полному набору функций по сравнению с моделью случайного леса с уменьшенным числом компонентов после выполнения 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, помимо прочего, настраивал гиперпараметры, но это довольно противоречивое противоречивое различие во времени выполнения, и я считаю, что я просто не понимаю концептуально.
Вы сказали, что изначально у вас есть 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.
Таким образом, при установке алгоритм выполняет итерацию по возможным расщеплениям, которые оптимизируют критерий. Тем не менее, уменьшив количество функций, которые могут возникнуть, проблема в том, что поиск этих разделов будет более сложным (если у вас будет меньше хороших расщеплений), что заставляет алгоритм искать больше итераций, чтобы найти хороший раскол.
max_leaf_nodes
или увеличитьmin_samples_leaf
. Однако это повлияет на вашу производительность. Чтобы уменьшить время и сохранить производительность, вы можете найти интересное увеличениеn_jobs
с1
до-1
(да,-1
в этом контексте больше1
).