Вилучення предикторів із майже нульовою дисперсією
Як ви бачили у відео, в наступному наборі вправ ви працюватимете з набором даних blood-brain. Це біохімічний набір даних, у якому завдання — передбачити таке значення для набору біохімічних сполук:
log((concentration of compound in brain) /
(concentration of compound in blood))
Це дає кількісну метрику здатності сполуки проходити через гематоенцефалічний бар'єр і корисно для розуміння біологічних властивостей цього бар'єра.
Цікавим аспектом цього набору даних є те, що він містить багато змінних, і в багатьох із них дисперсія надзвичайно мала. Це означає, що в таких змінних дуже мало інформації, адже вони здебільшого складаються з одного значення (наприклад, нуля).
На щастя, у caret є допоміжна функція nearZeroVar() для вилучення таких змінних, щоб заощадити час під час моделювання.
nearZeroVar() приймає дані x, а далі аналізує відношення найчастішого значення до другого за частотою, freqCut, і відсоток різних значень відносно кількості всіх вибірок, uniqueCut. Типово caret використовує freqCut = 19 і uniqueCut = 10, що є доволі консервативним підходом. Я надаю перевагу трохи агресивнішим налаштуванням і використовую freqCut = 2 та uniqueCut = 20 при виклику nearZeroVar().
Ця вправа є частиною курсу
Machine Learning з пакетом caret в R
Інструкції до вправи
bloodbrain_x і bloodbrain_y уже завантажені у ваш простір роботи.
- Визначте предиктори з майже нульовою дисперсією, виконавши
nearZeroVar()для набору даних blood-brain. Збережіть результат в об'єктіremove_cols. ВикористайтеfreqCut = 2таuniqueCut = 20у викликуnearZeroVar(). - Скористайтеся
names(), щоб створити вектор із усіма назвами стовпцівbloodbrain_x. Назвіть йогоall_cols. - Створіть новий датафрейм
bloodbrain_x_small, у якому вилучено змінні з майже нульовою дисперсією. Використайтеsetdiff(), щоб виокремити назви стовпців, які слід залишити (тобто які не потрібно вилучати).
Інтерактивна практична вправа
Спробуйте виконати цю вправу, доповнивши цей зразок коду.
# Identify near zero variance predictors: remove_cols
remove_cols <- nearZeroVar(___, names = TRUE,
freqCut = ___, uniqueCut = ___)
# Get all column names from bloodbrain_x: all_cols
# Remove from data: bloodbrain_x_small
bloodbrain_x_small <- bloodbrain_x[ , setdiff(___, ___)]