Некоторые разработчики используют пошаговую регрессию, чтобы сократить список правдоподобных объясняющих переменных до небольшого набора «наиболее полезных» переменных. Другие мало или совсем не обращают внимания на правдоподобие. Они позволяют пошаговой процедуре выбирать за них переменные.
=========================================
Пошаговая логистическая регрессия состоит из автоматического выбора уменьшенного числа переменных-предикторов для построения наиболее эффективной модели логистической регрессии.
Когда дело доходит до дисциплинированных подходов к выбору функций, методы-оболочки — это те, которые объединяют процесс выбора функций с типом создаваемой модели, оценивая подмножества функций, чтобы определить производительность модели между функциями, а затем выбирают наиболее эффективное подмножество. Другими словами, вместо того, чтобы существовать как независимый процесс, происходящий до построения модели, методы-оболочки пытаются оптимизировать процесс выбора признаков для данного алгоритма машинного обучения в тандеме с этим алгоритмом. Два известных метода обертки для выбора функций — это выбор функций с шагом вперед и выбор функций с шагом назад.
Выбор функции шага вперед начинается с оценки каждой отдельной функции и выбирает ту, которая приводит к наилучшей эффективности выбранной модели алгоритма. Что такое «лучшее»? Это полностью зависит от определенных критериев оценки (AUC, точность прогнозирования, RMSE и т. д.). Затем оцениваются все возможные комбинации этой выбранной функции и последующей функции, выбирается вторая функция и так далее, пока не будет выбрано требуемое предопределенное количество функций.
Выбор признаков с шагом назад тесно связан, и, как вы могли догадаться, начинается со всего набора признаков и работает в обратном направлении, удаляя признаки, чтобы найти оптимальное подмножество предопределенного размера.
Оба они потенциально очень затратны в вычислительном отношении. У вас есть большой многомерный набор данных? Эти методы могут занять слишком много времени, чтобы быть вообще полезными, или могут быть полностью неосуществимы. Тем не менее, с набором данных подходящего размера и размерности такой подход вполне может быть вашим лучшим подходом.
Чтобы увидеть, как они работают, давайте посмотрим, в частности, на выбор функции шаг вперед. Обратите внимание, что, как уже говорилось, алгоритм машинного обучения должен быть определен до начала нашего процесса выбора симбиотических функций.
Имейте в виду, что оптимизированный набор выбранных функций с использованием заданного алгоритма может или не может одинаково хорошо работать с другим алгоритмом. Например, если мы выбираем функции с помощью логистической регрессии, нет гарантии, что эти же функции будут работать оптимально, если мы затем опробуем их с помощью K-ближайших соседей или SVM.
Реализация выбора признаков и построение модели
Итак, как мы выполняем шаг вперед в выборе функций в Python? разумеется, что вы должны установить mlxtend, прежде чем двигаться дальше.
Мы будем использовать классификатор случайного леса для выбора признаков и построения модели (которые, опять же, тесно связаны в случае пошагового выбора признаков). Нам нужны данные для демонстрации, поэтому давайте воспользуемся набором данных о качестве вина. В частности, я использовал нетронутый файл winequality-white.csv в качестве входных данных в приведенном ниже коде.
Произвольно мы установим желаемое количество признаков равным 5 (в наборе данных их 12). Что мы можем сделать, так это сравнить баллы оценки для каждой итерации процесса выбора функций, и поэтому имейте в виду, что если мы обнаружим, что меньшее количество функций имеет лучший балл, мы можем альтернативно выбрать это подмножество с наилучшей производительностью для запуска. с нашей «живой» моделью продвижения вперед. Также имейте в виду, что установка слишком малого желаемого количества функций может привести к неоптимальному количеству и комбинации функций (скажем, если какая-то комбинация из 11 функций в нашем случае лучше, чем наилучшая комбинация <= 10 особенности, которые мы обнаруживаем в процессе отбора).
Поскольку нас больше интересует демонстрация того, как реализовать выбор признаков с шагом вперед, чем фактические результаты для этого конкретного набора данных, мы не будем слишком беспокоиться о фактической производительности наших моделей, но мы все равно сравним производительность. чтобы показать, как это будет сделано в реальном проекте.
Далее мы определим классификатор, а также селектор функций шага вперед, а затем выполним выбор функций. Селектор функций в mlxtend имеет некоторые параметры, которые мы можем определить, поэтому вот как мы будем действовать:
Во-первых, мы передаем наш классификатор, классификатор Random Forest, определенный над селектором функций.
Затем мы определяем подмножество функций, которые мы хотим выбрать (k_features=5).
Затем мы устанавливаем float в False; см. документацию для получения дополнительной информации о плавании:
Плавающие алгоритмы имеют дополнительный шаг исключения или включения для удаления признаков после того, как они были включены (или исключены), чтобы можно было выбрать большее количество комбинаций поднаборов признаков.
Мы устанавливаем желаемый уровень детализации для отчета mlxtend.
Важно отметить, что мы устанавливаем нашу оценку на точность; это всего лишь одна метрика, которую можно использовать для оценки наших результирующих моделей, построенных на выбранных функциях.
Селектор функций mlxtend использует внутреннюю перекрестную проверку, и мы установили желаемые складки на 5 для нашей демонстрации.
Выбранный нами набор данных не очень велик, поэтому выполнение следующего кода не займет много времени.
Теперь мы можем использовать эти функции для построения полной модели, используя наши обучающие и тестовые наборы. Если бы у нас был гораздо больший набор (т. е. гораздо больше экземпляров, а не гораздо больше функций), это было бы особенно полезно, поскольку мы могли бы использовать селектор функций выше на меньшем подмножестве экземпляров, определить наше наиболее эффективное подмножество функций и затем применить их к полному набору данных для классификации.
Если бы нас беспокоил конечный результат, и мы хотели бы знать, стоили ли наши проблемы с выбором функций?
Тогда мы могли бы сравнить результирующую точность полной модели, построенной с использованием выбранных признаков
(.env) boris@boris-All-Series:~/StepForward$ cat StepForward1.py
import numpy as np
import pandas as pd
from sklearn.ensemble import RandomForestClassifier
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score as acc
from mlxtend.feature_selection import SequentialFeatureSelector as sfs
# Read data
df = pd.read_csv('winequality-white.csv', sep=';')
# Train/test split
X_train, X_test, y_train, y_test = train_test_split(
df.values[:,:-1],
df.values[:,-1:],
test_size=0.25,
random_state=42)
y_train = y_train.ravel()
y_test = y_test.ravel()
print('Training dataset shape:', X_train.shape, y_train.shape)
print('Testing dataset shape:', X_test.shape, y_test.shape)
# Build RF classifier to use in feature selection
clf = RandomForestClassifier(n_estimators=100, n_jobs=-1)
# Build step forward feature selection
sfs1 = sfs(clf,
k_features=5,
forward=True,
floating=False,
verbose=2,
scoring='accuracy',
cv=5)
# Perform SFFS
sfs1 = sfs1.fit(X_train, y_train)
# Which features?
feat_cols = list(sfs1.k_feature_idx_)
print(feat_cols)
# Build full model with selected features
clf = RandomForestClassifier(n_estimators=1000, random_state=42, max_depth=4)
clf.fit(X_train[:, feat_cols], y_train)
y_train_pred = clf.predict(X_train[:, feat_cols])
print('Training accuracy on selected features: %.3f' % acc(y_train, y_train_pred))
y_test_pred = clf.predict(X_test[:, feat_cols])
print('Testing accuracy on selected features: %.3f' % acc(y_test, y_test_pred))
# Build full model on ALL features, for comparison
clf = RandomForestClassifier(n_estimators=1000, random_state=42, max_depth=4)
clf.fit(X_train, y_train)
y_train_pred = clf.predict(X_train)
print('Training accuracy on all features: %.3f' % acc(y_train, y_train_pred))
y_test_pred = clf.predict(X_test)
print('Testing accuracy on all features: %.3f' % acc(y_test, y_test_pred))
(.env) boris@boris-All-Series:~/StepForward$ python3 StepForward1.py
Training dataset shape: (3673, 11) (3673,)
Testing dataset shape: (1225, 11) (1225,)
[Parallel(n_jobs=1)]: Using backend SequentialBackend with 1 concurrent workers.
[Parallel(n_jobs=1)]: Done 1 out of 1 | elapsed: 1.2s remaining: 0.0s
[Parallel(n_jobs=1)]: Done 11 out of 11 | elapsed: 7.0s finished
[2022-08-08 19:38:34] Features: 1/5 -- score: 0.4922341470648205[Parallel(n_jobs=1)]: Using backend SequentialBackend with 1 concurrent workers.
[Parallel(n_jobs=1)]: Done 1 out of 1 | elapsed: 0.7s remaining: 0.0s
[Parallel(n_jobs=1)]: Done 10 out of 10 | elapsed: 7.1s finished
[2022-08-08 19:38:41] Features: 2/5 -- score: 0.5396185286103542[Parallel(n_jobs=1)]: Using backend SequentialBackend with 1 concurrent workers.
[Parallel(n_jobs=1)]: Done 1 out of 1 | elapsed: 0.7s remaining: 0.0s
[Parallel(n_jobs=1)]: Done 9 out of 9 | elapsed: 6.9s finished
[2022-08-08 19:38:48] Features: 3/5 -- score: 0.6016867782535358[Parallel(n_jobs=1)]: Using backend SequentialBackend with 1 concurrent workers.
[Parallel(n_jobs=1)]: Done 1 out of 1 | elapsed: 0.8s remaining: 0.0s
[Parallel(n_jobs=1)]: Done 8 out of 8 | elapsed: 6.5s finished
[2022-08-08 19:38:54] Features: 4/5 -- score: 0.625091475282211[Parallel(n_jobs=1)]: Using backend SequentialBackend with 1 concurrent workers.
[Parallel(n_jobs=1)]: Done 1 out of 1 | elapsed: 0.8s remaining: 0.0s
[Parallel(n_jobs=1)]: Done 7 out of 7 | elapsed: 5.7s finished
[2022-08-08 19:39:00] Features: 5/5 -- score: 0.6373467534152626
Which features : [1, 4, 5, 7, 10]
Training accuracy on selected features: 0.560
Testing accuracy on selected features: 0.525
Training accuracy on all features: 0.566
Testing accuracy on all features: 0.509
No comments:
Post a Comment