В этой статье я расскажу о модулях 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 Новости 📰 | Еще .

Если этот пост был полезен, нажмите несколько раз кнопку хлопка 👏 ниже, чтобы выразить поддержку автору 👇