В этой статье я расскажу о модулях RFE, Sampling и ATOM для обработки нескольких конвейеров.
Что такое RFE и как им пользоваться!
Рекурсивное исключение признаков, сокращенно RFE, - это популярный алгоритм выбора признаков.
RFE популярен, потому что его легко настроить и использовать, а также потому, что он эффективен при выборе тех функций (столбцов) в наборе обучающих данных, которые более или наиболее важны для прогнозирования целевой переменной.
При использовании RFE есть два важных параметра конфигурации: выбор количества функций для выбора и выбор алгоритма, используемого для выбора функций. Оба этих гиперпараметра можно изучить, хотя производительность метода не сильно зависит от правильной настройки этих гиперпараметров (Источник: machinelearningmaster).
from sklearn.feature_selection import RFE from sklearn.svm import SVC
Мы можем импортировать RFE из модуля sklearn.feature_selection, и здесь мы используем алгоритм классификатора опорных векторов в качестве оценщика.
В наборе данных есть 5 функций, исключая целевую функцию, из которой мы собираемся выбрать еще 3 релевантных.
estimator = SVC(kernel = "linear") selector = RFE(estimator, n_features_to_select = 3, step = 1) selector = selector.fit(X, y)
Здесь n_features_to_select - это параметр, используемый для выбора количества функций.
print(selector.support_) print(selector.ranking_)
Эти операторы вернут выбранные функции. И на выходе получается,
array([ True, False, True, False, True]) array([1, 2, 1, 3, 1])
Мы можем получить результат как в логическом формате, так и на основе ранжирования.
Отбор проб и его виды
Мы не получаем идеально сбалансированные данные каждый раз, иногда мы можем столкнуться с несбалансированными данными, и вот методы обработки несбалансированных данных.
Передискретизация - дублирование образцов из класса меньшинства.
Недостаточная выборка - удаление образцов из класса большинства.
Другими словами, как передискретизация, так и недостаточная выборка включают введение систематической ошибки для выбора большего количества выборок из одного класса, чем из другого, для компенсации дисбаланса, который либо уже присутствует в данных, либо может развиться, если была взята чисто случайная выборка (Источник : Википедия).
Перейдем к коду
from collections import Counter from imblearn.over_sampling import RandomOverSampler from imblearn.under_sampling import RandomUnderSampler
Imbalance-learn (imblearn) - это легко доступный пакет Python, с помощью которого мы собираемся сбалансировать набор данных.
print(Counter(y)) Counter({1:1000 , 0: 100})
Изначально соотношение данных 1:10, мы собираемся попробовать передискретизировать данные.
# define oversampling strategy oversample = RandomOverSampler(sampling_strategy = 'minority') # fit and apply the transform X_over, y_over = oversample.fit_resample(X, y) # summarize class distribution print(Counter(y_over))
После передискретизации класса меньшинства результат будет следующим:
Counter({0: 1000, 1: 1000})
А теперь давайте попробуем недостаточную дискретизацию
# define oversampling strategy undersample = RandomUnderSampler(sampling_strategy = 'majority') # fit and apply the transform X_under, y_under = undersample.fit_resample(X, y) # summarize class distribution print(Counter(y_under))
Результат недостаточной выборки класса большинства:
Counter({0: 100, 1: 100})
Следует также отметить, что мы можем выбирать часть данных вместо целого. Это можно сделать, передав значение с плавающей запятой в параметр sampling_strategy.
# define oversampling strategy undersample = RandomUnderSampler(sampling_strategy = 0.7) #A floating point value can be specified to indicate the ratio of majority class to be under sampled. # fit and apply the transform X_size, y_size = undersample.fit_resample(X, y) # summarize class distribution print(Counter(y_size))
Здесь только 70% данных большинства классов будут подвергнуты недостаточной выборке, и результат будет примерно таким:
Counter({1: 300, 0: 100})
Начнем с ATOM
pip install -U atom-ml
Вызовите функцию ATOMClassifier из класса atom, чтобы начать работу.
from atom import ATOMClassifier atom = ATOMClassifier(X, y, test_size = 0.2, verbose = 2)
Выход:
<< ================== ATOM ================== >> Algorithm task: binary classification. Dataset stats ====================== >> Shape: (569, 6) Scaled: False Outlier values: 27 (1.0%) --------------------------------------- Train set size: 456 Test set size: 113 --------------------------------------- | | dataset | train | test | |---:|:----------|:----------|:---------| | 0 | 212 (1.0) | 166 (1.0) | 46 (1.0) | | 1 | 357 (1.7) | 290 (1.7) | 67 (1.5) |
Следующим шагом является выбор функции и обучение модели. Мы собираемся выбрать 4 объекта из набора данных и обучить модель с помощью Random Forest.
atom.feature_selection("RFE", solver = "RF", n_features = 4) atom.run(models ="RF", metric = "balanced_accuracy")
Выход для этого:
Fitting FeatureSelector... Performing feature selection ... --> The RFE selected 4 features from the dataset. >>> Dropping feature mean_smoothness (rank 2). Training ===================================== >> Models: RF Metric: balanced_accuracy Results for Random Forest: Fit --------------------------------------------- Train evaluation --> balanced_accuracy: 1.0 Test evaluation --> balanced_accuracy: 0.8981 Time elapsed: 0.251s ------------------------------------------------- Total time: 0.251s Final results ========================= >> Duration: 0.252s ------------------------------------------ Random Forest --> balanced_accuracy: 0.8981
atom.branch покажет используемую текущую ветку, в которой мы находимся, и ее конвейеры.
Branch: master --> Pipeline: >>> FeatureSelector --> strategy: RFE --> solver: RandomForestClassifier(n_jobs=1) --> n_features: 4 --> max_frac_repeated: 1.0 --> max_correlation: 1.0 --> kwargs: {} --> Models: RF
Теперь давайте создадим новую ветвь, которая называется передискретизацией, передискретизируем набор данных и обучим модель.
# Creating a new branch atom.branch = "oversample" # Balancing the dataset by over sampling atom.balance(strategy = "randomoversampler") # Training the model atom.run(models = "RF_os", metric = "balanced_accuracy")
_os - это тег, добавляемый к алгоритму, чтобы отличать его от других . В результате
New branch oversample successfully created! Oversampling with RandomOverSampler... --> Adding 124 samples to class: 0. Training ===================================== >> Models: RF_os Metric: balanced_accuracy Results for Random Forest: Fit --------------------------------------------- Train evaluation --> balanced_accuracy: 1.0 Test evaluation --> balanced_accuracy: 0.8832 Time elapsed: 0.269s ------------------------------------------------- Total time: 0.269s Final results ========================= >> Duration: 0.270s ------------------------------------------ Random Forest --> balanced_accuracy: 0.8832
Теперь давайте проверим детали этой ветки с помощью atom.branch,
Branch: oversample --> Pipeline: >>> FeatureSelector --> strategy: RFE --> solver: RandomForestClassifier(n_jobs=1) --> n_features: 4 --> max_frac_repeated: 1.0 --> max_correlation: 1.0 --> kwargs: {} >>> Balancer --> strategy: randomoversampler --> kwargs: {} --> Models: RF_os
Точно так же мы можем создать другую ветку под названием undersample, уменьшить выборку набора данных и обучить модель. Детали ветки будут такими,
Branch: undersample --> Pipeline: >>> FeatureSelector --> strategy: RFE --> solver: RandomForestClassifier(n_jobs=1) --> n_features: 4 --> max_frac_repeated: 1.0 --> max_correlation: 1.0 --> kwargs: {} >>> Balancer --> strategy: randomundersampler --> kwargs: {} --> Models: RF_us
Функция скоринга генерирует оценки всех конвейеров, с помощью которых мы можем определить тот, который соответствует нашим потребностям.
atom.scoring()
И мы также можем получить график PRC,
atom.plot_prc()
Вы можете посмотреть полный код здесь.
Спасибо за прочтение!
Присоединяйтесь к FAUN: Веб-сайт 💻 | Подкаст 🎙️ | Twitter 🐦 | Facebook 👥 | Instagram 📷 | Группа Facebook 🗣️ | Группа Linkedin 💬 | Slack 📱 | Cloud Native Новости 📰 | Еще .
Если этот пост был полезен, нажмите несколько раз кнопку хлопка 👏 ниже, чтобы выразить поддержку автору 👇