Повний посібник із алгоритму випадкового лісу з Python і Scikit-Learn PlatoBlockchain Data Intelligence. Вертикальний пошук. Ai.

Повний посібник з алгоритму випадкового лісу з Python і Scikit-Learn

Вступ

Алгоритм випадкового лісу є одним із найбільш гнучких, потужних і широко використовуваних алгоритмів для класифікація та регресія, побудований як ан ансамбль дерев рішень.

Якщо ви не знайомі з ними – не хвилюйтеся, ми розглянемо всі ці концепції.

У цьому поглибленому практичному посібнику ми створимо інтуїція про те, як працюють дерева рішень, як ансамблювання посилює окремі класифікатори та регресори, що таке випадкові ліси та створюють класифікатор випадкових лісів і регресор за допомогою Python і Scikit-Learn, через наскрізний міні-проект, і відповідають на запитання дослідження.

Вважайте, що зараз ви входите до дослідницької групи, яка аналізує дані про жінок. Група зібрала 100 записів даних і хоче мати можливість упорядкувати ці початкові записи, розділивши жінок на категорії: вагітні або невагітні, проживають у сільській чи міській місцевості. Дослідники хочуть зрозуміти, скільки жінок буде в кожній категорії.

Існує обчислювальна структура, яка робить саме це дерево структура. Використовуючи структуру дерева, ви зможете представити різні підрозділи для кожної категорії.

Дерева рішень

Як заповнити вузли дерева? Ось де дерева рішень прийти в центр уваги.

Спочатку ми можемо розділити записи за вагітністю, потім ми можемо розділити їх за проживанням у місті чи селі. Зауважте, що ми могли б зробити це в іншому порядку, спочатку розділивши за регіоном проживання жінок, а потім за станом їхньої вагітності. З цього ми бачимо, що дерево має властиву ієрархію. Окрім упорядкування інформації, дерево організовує інформацію в ієрархічний спосіб – порядок, у якому з’являється інформація, має значення та в результаті призводить до різних дерев.

Нижче наведено приклад описаного дерева:

На зображенні дерева є 7 квадратів, один угорі містить 100 жінок, цей верхній квадрат з’єднаний із двома квадратами внизу, які поділяють жінок на 78 невагітних і 22 вагітних, і з обох попередніх квадратів чотири квадрати; два з’єднані з кожним квадратом угорі, які поділяють жінок залежно від їхнього району: для невагітних 45 живуть у міській місцевості, 33 у сільській місцевості, а для вагітних 14 живуть у сільській місцевості та 8 у міській місцевості. Просто подивившись на дерево, легко зрозуміти ці поділки та побачити, як кожен «шар» є похідним від попередніх, ці шари є деревом рівні, рівні описують глибина дерева:

Повний посібник із алгоритму випадкового лісу з Python і Scikit-Learn PlatoBlockchain Data Intelligence. Вертикальний пошук. Ai.

Зверніть увагу на зображення вище, що це перший рівень дерева Рівень 0 де є лише один квадрат, за яким слідує Рівень 1 де є два квадрати, і Рівень 2 де є чотири квадрати. Це глибина 2 дерево.

На рівні 0 знаходиться квадрат, який бере початок першого викликаного дерева кореневий вузол, цей корінь має два дочірні вузли на рівні 1, тобто батьківські вузли до чотирьох вузлів рівня 2. Бачите, що «квадрати», про які ми згадували досі, насправді називаються вузли; і що кожен попередній вузол є батьківським для наступних вузлів, які є його нащадками. Викликаються дочірні вузли кожного рівня, які мають того самого батька братів і сестер, як видно на наступному зображенні:

Повний посібник із алгоритму випадкового лісу з Python і Scikit-Learn PlatoBlockchain Data Intelligence. Вертикальний пошук. Ai.

На попередньому зображенні ми також показуємо рівень 1 як внутрішні вузли, коли вони знаходяться між коренем і останніми вузлами, які є листкові вузли. Вузли листя є останньою частиною дерева. Якби ми сказали зі 100 початкових жінок, скільки вагітних і живуть у сільській місцевості, ми могли б зробити це, подивившись на листя. Таким чином, число на листочках відповідає на перше запитання дослідження.

Якби були нові записи про жінок і дерево, яке раніше використовувалося для їх класифікації, тепер використовувалося для визначення того, чи може жінка брати участь у дослідженні чи ні, чи воно все ще функціонуватиме? Дерево використовуватиме ті самі критерії, і жінка не матиме права брати участь, якщо вона вагітна та живе в сільській місцевості.

Повний посібник із алгоритму випадкового лісу з Python і Scikit-Learn PlatoBlockchain Data Intelligence. Вертикальний пошук. Ai.

Подивившись на зображення вище, ми можемо побачити, що відповіді на запитання кожного вузла дерева – «вона учасник?», «вона вагітна?», «вона живе в сільській місцевості?» – так, так, і так, тому здається, що дерево може призвести до рішення, у цьому випадку, що жінка може взяти участь у дослідженні.

Це суть дерев рішень у ручному режимі. Використовуючи машинне навчання, ми можемо побудувати модель, яка автоматично будує це дерево для нас таким чином, щоб максимально підвищити точність остаточних рішень.

Примітка: в інформатиці існує кілька типів дерев, таких як бінарні дерева, загальні дерева, дерева AVL, розкинуті дерева, червоно-чорні дерева, b-дерева тощо. Тут ми зосереджуємось на тому, щоб дати загальне уявлення про те, що таке дерево рішень . Якщо це залежить від відповіді a так or немає питання для кожного вузла і, таким чином, кожен вузол має не більше двох дітей, якщо сортувати так, щоб «менші» вузли були ліворуч, це класифікувало дерева рішень як бінарні дерева.

У попередніх прикладах подивіться, як дерево могло це зробити класифікувати нові дані як учасника чи неучасника, або запитання також можна змінити на – «скільки учасників?», «скільки вагітних?», «скільки з них живуть у сільській місцевості?» – це веде до пошуку кількість вагітних учасниць, які проживають у сільській місцевості.

Коли дані класифіковані, це означає, що дерево виконує a класифікація завдання, і коли кількість даних знайдено, дерево виконує a регресія завдання. Це означає, що дерево рішень можна використовувати для обох завдань – класифікації та регресії.

Тепер, коли ми розуміємо, що таке дерево рішень, як його можна використовувати та яка номенклатура використовується для його опису, ми можемо задуматися про його обмеження.

Розуміння випадкових лісів

Що станеться з рішенням, якщо якийсь учасник живе на межі міста та села? Дерево додало б цей запис до сільської чи міської? Здається, важко вписати ці дані в нинішню структуру, оскільки вони досить чіткі.

Крім того, що, якщо жінка, яка живе на човні, бере участь у дослідженні, це вважатиметься сільською чи міською? Так само, як і в попередньому випадку, складно класифікувати дані з урахуванням доступних опцій у дереві.

Поміркувавши трохи більше про приклад дерева рішень, ми можемо побачити, що воно може правильно класифікувати нові дані, враховуючи, що вони вже слідують шаблону, який уже є в дереві, але коли є записи, які відрізняються від початкових даних, які визначили дерево, структура дерева є занадто жорсткою, що робить записи некласифікованими.

Це означає, що дерево рішень може бути суворим і обмеженим у своїх можливостях. Ідеальне дерево рішень було б більш гнучким і здатним вміщувати більше нюансів невидимих ​​даних.

Рішення: Подібно до того, як «дві пари очей бачать краще, ніж одне», дві моделі зазвичай дають точнішу відповідь, ніж одна. Враховуючи різноманіття представлень знань (закодованих у структурі дерева), жорсткість дещо відмінних структур між кількома подібними деревами більше не є настільки обмежувальною, оскільки недоліки одного дерева можуть бути «компенсовані» іншим. Поєднуючи багато дерева разом ми отримуємо a ліс.

Що стосується відповіді на початкове запитання, то ми вже знаємо, що вона буде закодована в листі дерева – але що зміниться, коли у нас буде багато дерев замість одного?

Якщо дерева об’єднати для класифікації, результат буде визначено більшістю відповідей, це називається голосування більшістю; а у випадку регресії число, задане кожним деревом у лісі, буде усереднено.

Ансамблеве навчання та зразкові ансамблі

Цей метод відомий як ансамблеве навчання. Застосовуючи ансамблеве навчання, ви можете змішувати будь-які алгоритми разом, за умови, що ви можете гарантувати, що вихідні дані можна проаналізувати та поєднати з іншими виходами (вручну або за допомогою існуючих бібліотек). Зазвичай ви об’єднуєте кілька моделей одного типу разом, наприклад кілька дерев рішень, але ви не обмежуєтеся лише об’єднанням ансамблів типу однієї моделі.

Групування — це практично гарантований спосіб краще узагальнити проблему та вичавити невелике підвищення продуктивності. У деяких випадках моделі ансамблю дають a значний збільшення передбачуваної сили, а іноді й незначне. Це залежить від набору даних, на якому ви навчаєтеся й оцінюєте, а також від самих моделей.

Об’єднання дерев рішень разом дає результат значний підвищення продуктивності в порівнянні з окремими деревами. Цей підхід був популяризований у дослідницьких та прикладних спільнотах машинного навчання, і був настільки поширеним, що ансамбль дерев рішень отримав назву ліс, і загальний тип лісу, який створювався (ліс дерев рішень на випадковій підмножині ознак), популяризував назву випадкові ліси.

Враховуючи широке використання, такі бібліотеки, як Scikit-Learn, реалізували оболонки для RandomForestRegressorс і RandomForestClassifiers, побудовані на основі власних реалізацій дерева рішень, щоб дозволити дослідникам уникнути створення власних ансамблів.

Давайте зануримося у випадкові ліси!

Як працює алгоритм випадкового лісу?

Нижче наведено основні кроки, які необхідно виконати під час виконання алгоритму випадкового лісу:

  1. Виберіть кількість випадкових записів, це може бути будь-яке число, наприклад 4, 20, 76, 150 або навіть 2.000 із набору даних (так званого N записи). Кількість залежатиме від ширини набору даних, чим ширше, тим більше N може бути. Ось де випадковий частина в назві алгоритму походить від!
  2. На їх основі побудуйте дерево рішень N випадкові записи;
  3. Відповідно до кількості дерев, визначених для алгоритму, або кількості дерев у лісі повторіть кроки 1 і 2. Це генерує більше дерев із наборів випадкових записів даних;
  4. Після кроку 3 настає останній крок, який передбачає прогнозування результатів:
    • У разі класифікації: кожне дерево в лісі передбачатиме категорію, до якої належить новий рекорд. Після цього новий рекорд призначається категорії, яка виграє більшість голосів.
    • У разі регресії: кожне дерево в лісі прогнозує значення для нового запису, а остаточне прогнозоване значення буде розраховано шляхом усереднення всіх значень, передбачених усіма деревами в лісі.

Кожне дерево, яке відповідає випадковій підмножині ознак, обов’язково не матиме інформації про деякі інші функції, що виправляється шляхом об’єднання, зберігаючи нижчу обчислювальну вартість.

Поради: Оскільки Random Forest використовує дерева рішень як основу, дуже корисно зрозуміти, як працюють дерева рішень, і трохи потренуватися з ними окремо, щоб створити інтуїцію щодо їх структури. Під час створення випадкових лісів ви встановлюєте такі значення, як максимальна глибина дерева, мінімальна кількість зразків, необхідних для знаходження у листовому вузлі, критерії для визначення внутрішніх поділів тощо, щоб допомогти ансамблю краще відповідати набір даних і узагальнити на нові точки. На практиці ви зазвичай використовуєте випадкові ліси, підсилення градієнта або екстремальне підсилення градієнта або інші методології на основі дерева, тому гарне розуміння гіперпараметрів одного дерева рішень допоможе розвинути сильну інтуїцію для налаштування ансамблів.

З інтуїцією про те, як працюють дерева, і розумінням випадкових лісів – єдине, що залишилося, це попрактикуватися в створенні, навчанні та налаштуванні їх на даних!

Створення та навчання моделей випадкового лісу за допомогою Scikit-Learn

Існувала причина, чому приклади, які використовувалися досі, стосувалися вагітності, житлової площі та жінок.

У 2020 році дослідники з Бангладеш помітили, що смертність серед вагітних жінок все ще дуже висока, особливо враховуючи тих, які проживають у сільській місцевості. Через це вони використовували систему моніторингу IOT проаналізувати ризик для здоров'я матері. Система IOT збирала дані з різних лікарень, громадських клінік і закладів охорони здоров’я матерів із сільських районів Бангладеш.

Потім зібрані дані були організовані у файлі зі значеннями, розділеними комами (csv) і завантажені в Репозиторій машинного навчання UCI.

Це дані, які ми будемо використовувати для практики і спробувати зрозуміти, чи є у вагітної жінки низький, середа or висока ризик смертності.

примітки: ви можете завантажити набір даних тут.

Використання випадкового лісу для класифікації

Оскільки ми хочемо знати, чи є у жінки низький, середа or висока ризик смертності, це означає, що ми проведемо класифікацію за трьома класами. Якщо проблема має більше двох класів, вона називається a багатокласовий проблема, на відміну від a двійковий проблема (де ви вибираєте між двома класами, як правило 0 та 1).

У цьому першому прикладі ми реалізуємо багатокласову модель класифікації з класифікатором Random Forest і Scikit-Learn Python.

Щоб вирішити цю проблему, ми будемо виконувати звичайні кроки машинного навчання, які включають завантаження бібліотек, читання даних, перегляд підсумкової статистики та створення візуалізацій даних, щоб краще їх зрозуміти. Потім попередня обробка та розділення даних з подальшим створенням, навчанням та оцінкою моделі.

Імпорт бібліотек

Ми будемо використовувати Pandas для читання даних, Seaborn і Matplotlib для їх візуалізації та NumPy для чудових корисних методів:

import pandas as pd
import numpy as np
import seaborn as sns
import matplotlib.pyplot as plt
Імпорт набору даних

Наступний код імпортує набір даних і завантажує його в Python DataFrame:

dataset = pd.read_csv("../../datasets/random-forest/maternal_health_risk.csv")

Щоб переглянути перші п’ять рядків даних, ми виконуємо head() команда:

dataset.head()

Це виводить:

    Age SystolicBP  DiastolicBP BS      BodyTemp    HeartRate   RiskLevel
0   25  130         80          15.0    98.0        86          high risk
1   35  140         90          13.0    98.0        70          high risk
2   29  90          70          8.0     100.0       80          high risk
3   30  140         85          7.0     98.0        70          high risk
4   35  120         60          6.1     98.0        76          low risk

Тут ми можемо побачити всі атрибути, зібрані під час дослідження.

  • Вік: вік у роках.
  • Систолічний АТ: верхнє значення артеріального тиску в мм рт.ст., важливий атрибут під час вагітності.
  • Діастолічний АТ: нижче значення артеріального тиску в мм рт.ст., ще один важливий атрибут під час вагітності.
  • BS: рівень глюкози в крові в молярній концентрації, ммоль/л.
  • HeartRate: частота серцевих скорочень у стані спокою в ударах за хвилину.
  • RiskLevel: рівень ризику під час вагітності.
  • BodyTemp: температура тіла.

Тепер, коли ми більше розуміємо, що вимірюється, ми можемо розглянути типи даних info():

dataset.info()

Це призводить до:


RangeIndex: 1014 entries, 0 to 1013
Data columns (total 7 columns):
 #   Column       Non-Null Count  Dtype  
---  ------       --------------  -----  
 0   Age          1014 non-null   int64  
 1   SystolicBP   1014 non-null   int64  
 2   DiastolicBP  1014 non-null   int64  
 3   BS           1014 non-null   float64
 4   BodyTemp     1014 non-null   float64
 5   HeartRate    1014 non-null   int64  
 6   RiskLevel    1014 non-null   object 
dtypes: float64(2), int64(4), object(1)
memory usage: 55.6+ KB

Від погляду на RangeIndex ми бачимо, що є 1014 записів, і стовпець Non-Null Count повідомляє, що дані не мають пропущених значень. Це означає, що нам не потрібно буде жодних заходів для обробки відсутніх даних!

У Dtype ми можемо побачити тип кожної змінної. в даний час float64 колонки такі BS та BodyTemp мають числові значення, які можуть змінюватися в будь-якому діапазоні, наприклад 15.0, 15.51, 15.76, 17.28, що робить їх чисельно неперервні (ви завжди можете додати 0 до числа з плаваючою комою, до нескінченності). З іншого боку, такі змінні, як Age, SystolicBP, DiastolicBP та HeartRate є такого типу int64, це означає, що числа змінюються лише на одиниці, наприклад 11, 12, 13, 14 – у нас не буде ЧСС 77.78, це або 77, або 78 – це чисельно дискретний значення. І у нас теж є RiskLevel з object тип, це зазвичай вказує на те, що змінна є текстом, і нам, ймовірно, потрібно буде перетворити її на число. Оскільки рівень ризику зростає від низького до високого, існує певний порядок у категоріях, це означає, що це категорично порядковий змінна.

примітки: важливо дивитися на тип кожного даного та перевіряти, чи має він сенс відповідно до його контексту. Наприклад, немає сенсу мати половину одиниці частоти серцевих скорочень, тому це означає, що тип інтергера є достатнім для дискретного значення. Якщо цього не станеться, ви можете змінити тип даних за допомогою Pandas astype() власність – df['column_name'].astype('type').

Переглянувши типи даних, ми можемо використовувати describe() щоб взяти пік за деякою описовою статистикою, такою як середні значення кожного стовпця, стандартне відхилення, квантилі, мінімальні та максимальні значення даних:

dataset.describe().T 

Наведений вище код відображає:

            count   mean        std         min     25%     50%     75%     max
Age         1014.0  29.871795   13.474386   10.0    19.0    26.0    39.0    70.0
SystolicBP  1014.0  113.198225  18.403913   70.0    100.0   120.0   120.0   160.0
DiastolicBP 1014.0  76.460552   13.885796   49.0    65.0    80.0    90.0    100.0
BS          1014.0  8.725986    3.293532    6.0     6.9     7.5     8.0     19.0
BodyTemp    1014.0  98.665089   1.371384    98.0    98.0    98.0    98.0    103.0
HeartRate   1014.0  74.301775   8.088702    7.0     70.0    76.0    80.0    90.0
RiskLevel   1014.0  0.867850    0.807353    0.0     0.0     1.0     2.0     2.0

Зверніть увагу, що для більшості стовпців, значити цінності далекі від стандартне відхилення (станд.) – це вказує на те, що дані не обов’язково відповідають правильному статистичному розподілу. Якби це було так, це допомогло б моделі при прогнозуванні ризику. Що тут можна зробити, так це попередньо обробити дані, щоб зробити їх більш репрезентативними, як якщо б це були дані всього населення світу або більше нормалізується. Але перевага при використанні моделей випадкового лісу для класифікація, полягає в тому, що властива деревовидна структура може добре працювати з даними, які не були нормалізовані, коли вона ділить їх на значення на кожному рівні дерева для кожної змінної.

Крім того, оскільки ми використовуємо дерева, а результуючий клас буде отримано шляхом голосування, ми за своєю суттю порівнюємо не різні значення, а лише ті самі типи значень, тому в цьому випадку немає необхідності налаштовувати функції до одного масштабу . Це означає, що класифікаційна модель випадкового лісу є інваріант масштабу, і вам не потрібно виконувати масштабування функції.

У цьому випадку етап попередньої обробки даних, який ми можемо зробити, полягає в перетворенні категоріального RiskLevel стовпець у числовий.

Візуалізація даних

Перед трансформацією RiskLevel, давайте також швидко візуалізуємо дані, подивившись на комбінації точок для кожної пари об’єктів за допомогою діаграми розсіювання та те, як точки розподілені, візуалізувавши криву гістограми. Для цього ми скористаємося Сіборном pairplot() який поєднує обидва сюжети. Він генерує обидва графіки для кожної комбінації ознак і відображає точки, позначені кольором відповідно до рівня ризику hue майно:

g = sns.pairplot(dataset, hue='RiskLevel')
g.fig.suptitle("Scatterplot and histogram of pairs of variables color coded by risk level", 
               fontsize = 14, 
               y=1.05); 

Наведений вище код генерує:

Повний посібник із алгоритму випадкового лісу з Python і Scikit-Learn PlatoBlockchain Data Intelligence. Вертикальний пошук. Ai.

Дивлячись на графік, ідеальною ситуацією було б чітке розділення кривих і крапок. Як ми бачимо, три типи класів ризику здебільшого змішані, оскільки дерева внутрішньо малюють лінії під час розмежування проміжків між точками, ми можемо припустити, що більше дерев у лісі можуть обмежити більше проміжків і краще класифікувати точки.

Провівши базовий пошуковий аналіз даних, ми можемо попередньо обробити RiskLevel колонка.

Попередня обробка даних для класифікації

Правда, є лише три класи RiskLevel у наших даних і що жодних інших значень не було додано помилково, ми можемо використовувати unique() щоб відобразити унікальні значення стовпця:

dataset['RiskLevel'].unique()

Це виводить:

array(['high risk', 'low risk', 'mid risk'], dtype=object)

Класи перевірені, тепер наступним кроком є ​​перетворення кожного значення в число. Оскільки існує порядок між класифікаціями, ми можемо використовувати значення 0, 1 і 2 для позначення низький, середа та висока ризики. Існує багато способів змінити значення стовпців, як у Python просте краще складного девіз, ми будемо використовувати .replace() і просто замініть їх цілими представленнями:

dataset['RiskLevel'] = dataset['RiskLevel'].replace('low risk', 0).replace('mid risk', 1).replace('high risk', 2)

Після заміни значень ми можемо розділити дані на те, що буде використовуватися для навчання моделі риси or X, і те, що ми хочемо передбачити, етикетки or y:

y = dataset['RiskLevel']
X = dataset.drop(['RiskLevel'], axis=1)

Після X та y набори готові, ми можемо використовувати Scikit-Learn train_test_split() метод подальшого розділення їх на тренувальний і тестовий набори:

from sklearn.model_selection import train_test_split

SEED = 42
X_train, X_test, y_train, y_test = train_test_split(X, y, 
                                                    test_size=0.2, 
                                                    random_state=SEED)

Поради: пам’ятайте про використання початкового числа випадкового стану, якщо ви хочете зробити результат відтворюваним. Ми використали випадкове початкове значення стану, щоб ви могли відтворити ті самі результати, що й у посібнику.

Тут ми використовуємо 20% даних для тестування та 80% для навчання.

Навчання RandomForestClassifier

Ознайомтеся з нашим практичним практичним посібником із вивчення Git з передовими методами, прийнятими в галузі стандартами та включеною шпаргалкою. Припиніть гуглити команди Git і фактично вчитися це!

Scikit-Learn реалізував ансамблі під sklearn.ensemble модуль. Ансамбль дерев рішень, які використовуються для класифікації, в яких приймається більшість голосів, реалізується як RandomForestClassifier.

Маючи поїзд і тестові набори, ми можемо імпортувати RandomForestClassifier клас і створіть модель. Для початку давайте створимо ліс із трьома деревами за допомогою налаштування n_estimators параметр як 3, і кожне дерево має три рівні, установивши max_depthдо 2:

from sklearn.ensemble import RandomForestClassifier

rfc = RandomForestClassifier(n_estimators=3, 
                             max_depth=2,
                             random_state=SEED)

Примітка: Значення за замовчуванням для n_estimators is 100. Це підвищує силу прогнозування та узагальнення ансамблю, але ми створюємо менший, щоб полегшити його візуалізацію та перевірку. Маючи лише 3 дерева, ми можемо їх візуалізувати та оглянути вручну для подальшого розвитку нашої інтуїції як окремих дерев, так і їх взаємозалежності. Те саме стосується max_depth, Яка є None, тобто дерева можуть ставати все глибше й глибше, щоб відповідати необхідним даним.

Щоб адаптувати модель до даних, ми називаємо fit() метод, вставляючи в навчальні функції та позначки:


rfc.fit(X_train, y_train)

y_pred = rfc.predict(X_test)

Тепер ми можемо порівняти прогнозовані мітки з реальними мітками, щоб оцінити, наскільки добре спрацювала модель! Перш ніж оцінювати модель, давайте поглянемо на ансамбль.

Щоб поглянути глибше на модель, ми можемо візуалізувати кожне з дерев і те, як вони розподіляють дані. Це можна зробити за допомогою tree модуль, вбудований у Scikit-Learn, а потім циклічний перегляд кожного з оцінювачів у ансамблі:


from sklearn import tree

features = X.columns.values 
classes = ['0', '1', '2'] 



for estimator in rfc.estimators_:
    print(estimator)
    plt.figure(figsize=(12,6))
    tree.plot_tree(estimator,
                   feature_names=features,
                   class_names=classes,
                   fontsize=8, 
                   filled=True, 
                   rounded=True)
    plt.show()

Наведений вище код відображає діаграми дерева:

Повний посібник із алгоритму випадкового лісу з Python і Scikit-Learn PlatoBlockchain Data Intelligence. Вертикальний пошук. Ai.
Повний посібник із алгоритму випадкового лісу з Python і Scikit-Learn PlatoBlockchain Data Intelligence. Вертикальний пошук. Ai.
Повний посібник із алгоритму випадкового лісу з Python і Scikit-Learn PlatoBlockchain Data Intelligence. Вертикальний пошук. Ai.

Зверніть увагу, чим відрізняються ці три дерева. Перший починається з BS особливість, другий с DiastolicBP, а третє с BS знову. Хоча третій дивиться на іншу кількість проб. На правій гілці перші два дерева також вирішують використовувати Age на рівні листя, тоді як третє дерево закінчується с BS функція. Завдяки лише трьом оцінювачам стає зрозуміло, як масштабування дає багате, різноманітне представлення знань, які можна успішно об’єднати у високоточну модель.

Чим більше дерев у лісі, тим різноманітнішою може бути модель. Існує точка зменшення віддачі, однак, як і багато дерев, які підходять до випадкової підмножини ознак, буде чимало подібних дерев, які не пропонують великої різноманітності в ансамблі, і які почнуть мати занадто багато голосів і перекошують ансамбль, щоб він був переповнений навчальним набором даних, що шкодить узагальненню набору перевірки.

Раніше була висунута гіпотеза про наявність більшої кількості дерев і про те, як це може покращити результати моделі. Давайте подивимося на результати, згенеруємо нову модель і перевіримо, чи справджується гіпотеза!

Оцінка RandomForestClassifier

Scikit-Learn полегшує створення базових планів, надаючи a DummyClassifier, який виводить прогнози без використання функцій введення (повністю випадкові виходи). Якщо ваша модель краща за DummyClassifier, деякі навчання відбувається! Щоб максимізувати навчання, ви можете автоматично тестувати різні гіперпараметри за допомогою a RandomizedSearchCV or GridSearchCV. Окрім базової лінії, ви можете оцінити продуктивність своєї моделі за допомогою кількох показників.

Деякі традиційні показники класифікації, які можна використовувати для оцінки алгоритму, це точність, запам’ятовування, f1-оцінка, точність і матриця плутанини. Ось коротке пояснення до кожного з них:

  1. Точність: коли наша мета полягає в тому, щоб зрозуміти, які правильні значення прогнозу вважалися правильними нашим класифікатором. Точність ділить справжні позитивні значення на зразки, які були прогнозовані як позитивні;

$$
точність = frac{текст{справжні позитивні}}{текст{справжні позитивні} + текст{хибні позитивні}}
$$

  1. Згадувати: зазвичай розраховується разом із точністю, щоб зрозуміти, скільки справжніх позитивних результатів було визначено нашим класифікатором. Відкликання розраховується шляхом ділення справжніх позитивних результатів на все, що мало бути передбачувано позитивним.

$$
recall = frac{текст{справжні позитивні}}{текст{справжні позитивні} + текст{хибні негативні}}
$$

  1. F1 бал: є збалансованим або гармонійне середнє точності та відкликання. Найменше значення 0, а найвище 1. Коли f1-score дорівнює 1, це означає, що всі класи були правильно передбачені – це дуже важко отримати оцінку з реальними даними (майже завжди існують винятки).

$$
text{f1-score} = 2* frac{text{precision} * text{recall}}{text{precision} + text{recall}}
$$

  1. Матриця плутанини: коли нам потрібно знати, скільки зразків ми взяли правильно чи неправильно кожен клас. Значення, які були правильними і правильно передбачуваними, називаються справжні позитиви, ті, які були передбачені як позитивні, але не були позитивними, називаються помилкові позитиви. Та сама номенклатура справжні негативи та помилкові негативи використовується для від’ємних значень;

  2. Точність: описує, скільки прогнозів наш класифікатор отримав правильно. Найменше значення точності дорівнює 0, а найвище – 1. Зазвичай це значення множиться на 100, щоб отримати відсоток:

$$
точність = frac{текст{кількість правильних прогнозів}}{текст{загальна кількість прогнозів}}
$$

Примітка: Практично неможливо отримати 100% точність будь-яких реальних даних, до яких ви хотіли б застосувати машинне навчання. Якщо ви бачите 100% точність класифікатора або навіть майже 100% результат – будьте скептичними та виконайте оцінку. Поширеною причиною цих проблем є витік даних (прямий або опосередкований витік частини навчального тесту в набір тестів). Не існує консенсусу щодо того, що таке «хороша точність», перш за все тому, що це залежить від ваших даних – іноді точність у 70% буде високою! Іноді це буде дуже низькою точністю. Взагалі кажучи, понад 70% достатньо для багатьох моделей, але це має визначити дослідник домену.

Ви можете виконати наступний сценарій, щоб імпортувати необхідні бібліотеки та переглянути результати:

from sklearn.metrics import classification_report, confusion_matrix

cm = confusion_matrix(y_test, y_pred)
sns.heatmap(cm, annot=True, fmt='d').set_title('Maternal risks confusion matrix (0 = low risk, 1 = medium risk, 2 = high risk)')

print(classification_report(y_test,y_pred))

Вихід буде виглядати приблизно так:

                precision    recall  f1-score   support

           0       0.53      0.89      0.66        80
           1       0.57      0.17      0.26        76
           2       0.74      0.72      0.73        47

    accuracy                           0.58       203
   macro avg       0.61      0.59      0.55       203
weighted avg       0.59      0.58      0.53       203

Повний посібник із алгоритму випадкового лісу з Python і Scikit-Learn PlatoBlockchain Data Intelligence. Вертикальний пошук. Ai.

У класифікаційному звіті зауважте, що запам’ятовування є високим, 0.89 для класу 0, як точність, так і запам’ятовування високі для класу 2, 0.74, 0.72 – і для класу 1 вони низькі, особливо запам’ятовування 0.17 і точність 0.57 . Відношення між запам’ятовуванням і точністю для всіх трьох класів окремо відображено в F1 оцінка, яка є гармонійним середнім між запам’ятовуванням і точністю – це робить модель добре для класу 0, досить погано для класу 1 і пристойно для класу 2.

Модель дуже важко ідентифікувати випадки середнього ризику.

Точність, досягнута нашим випадковим класифікатором лісу лише з 3 деревами, становить 0.58 (58%) – це означає, що він отримує трохи більше половини результатів правильно. Це низька точність, і, можливо, її можна покращити, додавши більше дерев.

Подивившись на матрицю плутанини, ми можемо побачити, що більшість помилок трапляється під час класифікації 52 записів середнього ризику як низького ризику, що дає більше розуміння низького рівня запам’ятовування класу 1. Це упереджено щодо класифікації пацієнтів із середнім ризиком як низький. пацієнтів ризику.

Інша річ, яку можна перевірити, щоб отримати ще більше розуміння, це те, які характеристики найбільше враховуються класифікатором під час прогнозування. Це важливий крок зрозумілі системи машинного навчання, а також допомагає виявити та пом’якшити упередження в моделях.

Щоб побачити це, ми можемо отримати доступ до feature_importances_ властивість класифікатора. Це дасть нам список відсотків, щоб ми також могли отримати доступ до feature_names_in_ властивість, щоб отримати назву кожної функції, організувати їх у кадрі даних, відсортувати їх від найвищого до найнижчого та побудувати результат:


features_df = pd.DataFrame({'features': rfc.feature_names_in_, 'importances': rfc.feature_importances_ })


features_df_sorted = features_df.sort_values(by='importances', ascending=False)


g = sns.barplot(data=features_df_sorted, x='importances', y ='features', palette="rocket")
sns.despine(bottom = True, left = True)
g.set_title('Feature importances')
g.set(xlabel=None)
g.set(ylabel=None)
g.set(xticks=[])
for value in g.containers:
    g.bar_label(value, padding=2)

Повний посібник із алгоритму випадкового лісу з Python і Scikit-Learn PlatoBlockchain Data Intelligence. Вертикальний пошук. Ai.

Зверніть увагу, як класифікатор переважно враховує рівень цукру в крові, потім трохи діастолічного тиску, температури тіла та трохи віку, щоб прийняти рішення, це також може бути пов’язано з низьким запам’ятовуванням у класі 1, можливо, дані середнього ризику пов’язані з особливостями, які не розглядаються враховується моделлю. Ви можете спробувати більше пограти з важливістю функцій, щоб дослідити це, і побачити, чи зміни в моделі впливають на функції, що використовуються, а також чи існує значний зв’язок між деякими функціями та прогнозованими класами.

Нарешті настав час створити нову модель із більшою кількістю дерев, щоб побачити, як це вплине на результати. Давайте створимо rfc_ ліс із 900 деревами, 8 рівнями та таким самим насінням. Чи покращаться результати?

rfc_ = RandomForestClassifier(n_estimators=900, 
                             max_depth=7,
                             random_state=SEED)
rfc_.fit(X_train, y_train)
y_pred = rfc_.predict(X_test)

Розрахунок і відображення показників:

cm_ = confusion_matrix(y_test, y_pred)
sns.heatmap(cm_, annot=True, fmt='d').set_title('Maternal risks confusion matrix (0 = low risk, 1 = medium risk, 2 = high risk) for 900 trees with 8 levels')

print(classification_report(y_test,y_pred))

Це виводить:

                precision    recall  f1-score   support

           0       0.68      0.86      0.76        80
           1       0.75      0.58      0.65        76
           2       0.90      0.81      0.85        47

    accuracy                           0.74       203
   macro avg       0.78      0.75      0.75       203
weighted avg       0.76      0.74      0.74       203

Повний посібник із алгоритму випадкового лісу з Python і Scikit-Learn PlatoBlockchain Data Intelligence. Вертикальний пошук. Ai.

Це показує, як додавання більшої кількості дерев і більше спеціалізованих дерев (вищих рівнів) покращило наші показники. Ми все ще маємо низьку пам’ятність для класу 1, але точність зараз становить 74%. Оцінка F1 під час класифікації випадків високого ризику становить 0.85, що означає, що випадки високого ризику тепер легше ідентифікувати порівняно з 0.73 у попередній моделі!

У повсякденному проекті може бути більш важливим виявити випадки високого ризику, наприклад, за допомогою метрики, подібної до точності, яка також відома як чутливість в статистиці. Спробуйте налаштувати деякі параметри моделі та спостерігайте за результатами.

Наразі ми отримали загальне розуміння того, як випадковий ліс можна використовувати для класифікації даних – у наступному розділі ми можемо використовувати той самий набір даних іншим способом, щоб побачити, як та сама модель прогнозує значення за допомогою регресії.

Використання випадкових лісів для регресії

У цьому розділі ми вивчимо, як алгоритм випадкового лісу можна використовувати для вирішення проблем регресії за допомогою Scikit-Learn. Кроки, які виконуються для реалізації цього алгоритму, майже ідентичні крокам, виконаним для класифікації, окрім типу моделі та типу прогнозованих даних – які тепер будуть безперервними значеннями – є лише одна відмінність у підготовці даних.

Оскільки регресія робиться для числові значення – давайте виберемо числове значення з набору даних. Ми бачили, що рівень цукру в крові був важливим у класифікації, тому його слід передбачити на основі інших ознак (оскільки якщо він корелює з якоюсь ознакою, ця ознака також корелює з нею).

Дотримуючись того, що ми зробили для класифікації, давайте спочатку імпортуємо бібліотеки та той самий набір даних. Якщо ви вже зробили це для моделі класифікації, ви можете пропустити цю частину та перейти безпосередньо до підготовки даних для навчання.

Імпорт бібліотек і даних
import pandas as pd
import numpy as np
import maplotlib.pyplot as plt
import seaborn as sns

dataset = pd.read_csv("../../datasets/random-forest/maternal_health_risk.csv")
Попередня обробка даних для регресії

Це завдання регресії, тому замість прогнозування класів ми можемо передбачити один із числових стовпців набору даних. У цьому прикладі BS стовпець буде передбачено. Це означає y дані будуть містити дані про рівень цукру в крові та X дані міститимуть усі характеристики, окрім рівня цукру в крові. Після відокремлення X та y даних, ми можемо розділити потяг і тестові набори:

from sklearn.model_selection import train_test_split

SEED = 42

y = dataset['BS']
X = dataset.drop(['BS'], axis=1) 

X_train, X_test, y_train, y_test = train_test_split(X, y, 
                                                    test_size=0.2, 
                                                    random_state=SEED)
Навчання RandomForestRegressor

Тепер, коли ми масштабували наш набір даних, настав час навчити наш алгоритм розв’язувати цю проблему регресії, щоб трохи змінити його – ми створимо модель із 20 деревами в лісі, і кожне з них має 4 рівні. Для цього ви можете виконати наступний код:

from sklearn.ensemble import RandomForestRegressor

rfr = RandomForestRegressor(n_estimators=20, 
                            max_depth=3, 
                            random_state=SEED)

rfr.fit(X_train, y_train)
y_pred = rfr.predict(X_test)

Ви можете знайти детальну інформацію про всі параметри RandomForestRegressor в офіційній документації.

Оскільки побудова та перегляд 20 дерев вимагатиме певного часу та відданості, ми можемо побудувати лише перше, щоб побачити, чим воно відрізняється від класифікаційного дерева:

from sklearn import tree

features = X.columns

first_tree = rfr.estimators_[0]

plt.figure(figsize=(15,6))
tree.plot_tree(first_tree,
               feature_names=features,
               fontsize=8, 
               filled=True, 
               rounded=True);

Повний посібник із алгоритму випадкового лісу з Python і Scikit-Learn PlatoBlockchain Data Intelligence. Вертикальний пошук. Ai.

Зверніть увагу, що дерево регресії вже має значення, призначене даним, які потрапляють на кожен вузол. Це значення, які будуть усереднені при об’єднанні 20 дерев. Дотримуючись того, що ми зробили з класифікацією, ви також можете побудувати графіки важливості ознак, щоб побачити, які змінні регресійна модель більше враховує під час обчислення значень.

Настав час перейти до останнього і заключного кроку при розв’язанні задачі машинного навчання та оцінити продуктивність алгоритму!

Оцінка RandomForestRegressor

Для задач регресії метрики, які використовуються для оцінки алгоритму, це середня абсолютна помилка (MAE), середня квадратична помилка (MSE) і середня квадратична помилка (RMSE).

  1. Середня абсолютна помилка (MAE): коли ми віднімаємо прогнозовані значення від фактичних значень, отримуючи похибки, підсумовуємо абсолютні значення цих похибок і отримуємо їх середнє значення. Цей показник дає уявлення про загальну помилку для кожного передбачення моделі, чим менше (ближче до 0), тим краще.

$$
mae = (frac{1}{n})sum_{i=1}^{n}left | Фактичний – прогнозований правильний |
$$

Примітка: Ви також можете зіткнутися з y та ŷ позначення в рівняннях. The y відноситься до фактичних значень і ŷ до прогнозованих значень.

  1. Середня квадратична помилка (MSE): він подібний до метрики MAE, але зводить у квадрат абсолютні значення помилок. Крім того, як і з MAE, чим менше або ближче до 0, тим краще. Значення MSE зведено в квадрат, щоб зробити великі помилки ще більшими. Одна річ, на яку слід звернути пильну увагу, це те, що зазвичай її важко інтерпретувати через розмір її значень і той факт, що вони не в одному масштабі даних.

$$
mse = sum_{i=1}^{D}(Фактичний – Прогнозований)^2
$$

  1. Середньоквадратична помилка (RMSE): намагається вирішити проблему інтерпретації, що виникає з MSE, шляхом отримання квадратного кореня з його кінцевого значення, щоб масштабувати його назад до тих самих одиниць даних. Це легше для інтерпретації та добре, коли нам потрібно відобразити або показати фактичне значення даних з помилкою. Він показує, наскільки дані можуть відрізнятися, тому, якщо ми маємо RMSE 4.35, наша модель може зробити помилку або через те, що вона додала 4.35 до фактичного значення, або тому, що їй потрібно 4.35, щоб отримати фактичне значення. Чим ближче до 0, тим краще.

$$
rmse = sqrt{ sum_{i=1}^{D}(фактичний – прогнозований)^2}
$$

Ми можемо використовувати будь-який з цих трьох показників порівняти моделі (якщо потрібно вибрати одну). Ми також можемо порівняти ту саму модель регресії з різними значеннями аргументів або з різними даними, а потім розглянути показники оцінки. Це відомо як настройка гіперпараметрів – налаштування гіперпараметрів, що впливають на алгоритм навчання, та спостереження за результатами.

Вибираючи між моделями, зазвичай краще працюють ті з найменшими помилками. Якщо під час моніторингу моделей показники погіршувалися, значить, попередня версія моделі була кращою, або були значні зміни в даних, щоб модель працювала гірше, ніж вона.

Щоб знайти ці значення, використовуйте такий код:

from sklearn.metrics import mean_absolute_error, mean_squared_error

print('Mean Absolute Error:', mean_absolute_error(y_test, y_pred))
print('Mean Squared Error:', mean_squared_error(y_test, y_pred))
print('Root Mean Squared Error:', np.sqrt(mean_squared_error(y_test, y_pred)))

Результат повинен бути:

Mean Absolute Error: 1.127893702896059
Mean Squared Error: 3.0802988503933326
Root Mean Squared Error: 1.755078018320933

З 20 деревами середня квадратична помилка становить 1.75, що є низьким показником, але навіть при цьому – якщо збільшити кількість дерев і поекспериментувати з іншими параметрами, ця помилка, ймовірно, може бути ще меншою.

Переваги використання випадкового лісу

Як і в будь-якого іншого алгоритму, його використання має свої переваги та недоліки. У наступних двох розділах ми розглянемо плюси та мінуси використання випадкового лісу для класифікації та регресії.

  1. Алгоритм випадкового лісу не є упередженим, оскільки існує кілька дерев, і кожне дерево навчається на випадковій підмножині даних. По суті, алгоритм випадкового лісу покладається на силу «натовпу»; тому загальний ступінь зміщення алгоритму знижується.
  2. Цей алгоритм дуже стабільний. Навіть якщо в набір даних вводиться нова точка даних, це не сильно впливає на загальний алгоритм, оскільки нові дані можуть вплинути на одне дерево, але їм дуже важко вплинути на всі дерева.
  3. Алгоритм випадкового лісу добре працює, якщо у вас є як категоріальні, так і числові ознаки.
  4. Алгоритм випадкового лісу також добре працює, коли в даних відсутні значення або вони не були масштабовані.

Недоліки використання випадкового лісу

  1. Головний недолік випадкових лісів полягає в їх складності. Вони вимагають набагато більше обчислювальних ресурсів через велику кількість об’єднаних дерев рішень під час навчання великих ансамблів. Хоча – з сучасним обладнанням навчання навіть великого випадкового лісу не займає багато часу.

Йти далі – Ручний наскрізний проект

Ваша допитлива природа змушує вас йти далі? Ми рекомендуємо перевірити наш Керований проект: «Практичний прогноз ціни житла – машинне навчання на Python».

Повний посібник із алгоритму випадкового лісу з Python і Scikit-Learn PlatoBlockchain Data Intelligence. Вертикальний пошук. Ai.

У цьому керованому проекті ви дізнаєтеся, як створювати потужні традиційні моделі машинного навчання, а також моделі глибокого навчання, використовувати Ensemble Learning і навчати мета-навчальників прогнозувати ціни на житло за допомогою моделей Scikit-Learn і Keras.

Використовуючи Keras, API глибокого навчання, створений на основі Tensorflow, ми експериментуватимемо з архітектурами, створюватимемо ансамбль складених моделей і навчатимемо мета-учень нейронна мережа (модель рівня 1), щоб визначити ціну будинку.

Глибоке навчання дивовижне, але перш ніж вдаватися до нього, радимо також спробувати вирішити проблему за допомогою простіших методів, наприклад поверхневе навчання алгоритми. Наша базова продуктивність базуватиметься на a Регресія випадкового лісу алгоритм. Крім того, ми дослідимо створення ансамблів моделей за допомогою Scikit-Learn за допомогою таких методів, як мішок та голосування.

Це наскрізний проект, і, як і всі проекти машинного навчання, ми почнемо з – з Дослідницький аналіз даних, А потім Попередня обробка даних і, нарешті Будівля неглибока та Моделі глибокого навчання щоб відповідати даним, які ми дослідили та очистили раніше.

Часова мітка:

Більше від Stackabuse