Підручник з довільного лісового класифікатора: Як використовувати алгоритми на основі дерев для машинного навчання

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

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

Приклади деревних алгоритмів

Існують різні алгоритми на основі дерев, якими ви можете скористатися, наприклад

  • Дерева рішень
  • Випадковий ліс
  • Посилення градієнта
  • Сумка (агрегація Bootstrap)

Отже, кожен дослідник даних повинен вивчити ці алгоритми та використовувати їх у своїх проектах машинного навчання.

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

Що таке випадковий ліс?

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

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

Остаточні прогнози випадкового лісу робляться шляхом усереднення прогнозів кожного окремого дерева.

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

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

Випадковий ліс використовувався в різних додатках, наприклад, для надання рекомендацій щодо різних продуктів клієнтам в електронній комерції.

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

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

Як працює алгоритм Random Forest?

Алгоритм випадкового лісу працює, виконавши наступні кроки:

Крок 1 : Алгоритм вибирає випадкові вибірки із наданого набору даних.

Крок 2: Алгоритм створить дерево рішень для кожної обраної вибірки. Тоді він отримає результат прогнозування з кожного створеного дерева рішень.

Крок 3: Потім буде проведено оцінку кожного прогнозованого результату. Для класифікаційної задачі він використовуватиме режим , а для проблеми регресії - середнє .

Крок 4 : І нарешті, алгоритм вибере результат голосування з найбільшою кількістю голосів як остаточне передбачення.

Випадковий ліс на практиці

Тепер, коли ви знаєте тонкощі алгоритму випадкового лісу, давайте створимо класифікатор випадкових лісів.

Ми побудуємо класифікатор випадкових лісів, використовуючи набір даних Pima Indians Diabetes. Набір даних про діабет Pima Indians передбачає прогнозування настання діабету протягом 5 років на основі наданих медичних даних. Це проблема двійкової класифікації.

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

Ми почнемо з імпорту важливих пакетів, які будемо використовувати для завантаження набору даних та створення випадкового класифікатора лісу. Ми будемо використовувати бібліотеку scikit-learn для завантаження та використання алгоритму випадкових лісів.

# import important packages import numpy as np import pandas as pd import matplotlib.pyplot as plt import seaborn as sns %matplotlib inline from sklearn.model_selection import train_test_split from sklearn.ensemble import RandomForestClassifier from sklearn.metrics import accuracy_score from sklearn.preprocessing import StandardScaler, MinMaxScaler import pandas_profiling from matplotlib import rcParams import warnings warnings.filterwarnings("ignore") # figure size in inches rcParams["figure.figsize"] = 10, 6 np.random.seed(42)

Набір даних

Потім завантажте набір даних з каталогу даних:

# Load dataset data = pd.read_csv("../data/pima_indians_diabetes.csv")

Тепер ми можемо спостерігати за зразком набору даних.

 # show sample of the dataset data.sample(5)

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

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

# show columns data.columns

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

  • Кількість випадків вагітності.
  • Концентрація глюкози в плазмі крові 2 години при пероральному тесті на толерантність до глюкози.
  • Діастолічний артеріальний тиск (мм рт. Ст.).
  • Товщина шкірної складки трицепса (мм).
  • 2-годинний сироватковий інсулін (м.е. / мл).
  • Індекс маси тіла (вага в кг / (зріст у м) ^ 2).
  • Функція родоводу діабету.
  • Вік (роки).
  • Змінна класу (0 або 1).

Потім ми розділяємо набір даних на незалежні та цільові об’єкти. Наша цільова функція для цього набору даних називається class.

# split data into input and taget variable(s) X = data.drop("class", axis=1) y = data["class"]

Попередня обробка набору даних

Before we create a model we need to standardize our independent features by using the standardScaler method from scikit-learn.

# standardize the dataset scaler = StandardScaler() X_scaled = scaler.fit_transform(X)

You can learn more on how and why to standardize your data from this article by clicking here.

Splitting the dataset into Training and Test data

We now split our processed dataset into training and test data. The test data will be 10% of the entire processed dataset.

# split into train and test set X_train, X_test, y_train, y_test = train_test_split( X_scaled, y, stratify=y, test_size=0.10, random_state=42 )

Building the Random Forest Classifier

Now is time to create our random forest classifier and then train it on the train set. We will also pass the number of trees (100) in the forest we want to use through theparameter called n_estimators.

# create the classifier classifier = RandomForestClassifier(n_estimators=100) # Train the model using the training sets classifier.fit(X_train, y_train)

The above output shows different parameter values of the random forest classifier used during the training process on the train data.

After training we can perform prediction on the test data.

# predictin on the test set y_pred = classifier.predict(X_test)

Then we check the accuracy using actual and predicted values from the test data.

# Calculate Model Accuracy print("Accuracy:", accuracy_score(y_test, y_pred))

Accuracy: 0.8051948051948052

Our accuracy is around 80.5% which is good. But we can always make it better.

Identify Important Features

As I said before, we can also check the important features by using the feature_importances_ variable from the random forest algorithm in scikit-learn.

# check Important features feature_importances_df = pd.DataFrame( {"feature": list(X.columns), "importance": classifier.feature_importances_} ).sort_values("importance", ascending=False) # Display feature_importances_df

The figure above shows the relative importance of features and their contribution to the model. We can also visualize these features and their  scores using the seaborn and matplotlib libraries.

# visualize important featuers # Creating a bar plot sns.barplot(x=feature_importances_df.feature, y=feature_importances_df.importance) # Add labels to your plt.xlabel("Feature Importance Score") plt.ylabel("Features") plt.title("Visualizing Important Features") plt.xticks( rotation=45, horizontalalignment="right", fontweight="light", fontsize="x-large" ) plt.show()

From the figure above, you can see the triceps_skinfold_thickness feature has low importance and does not contribute much to the prediction.

This means that we can remove this feature and train our random forest classifier again and then see if it can improve its performance on the test data.

# load data with selected features X = data.drop(["class", "triceps_skinfold_thickness"], axis=1) y = data["class"] # standardize the dataset scaler = StandardScaler() X_scaled = scaler.fit_transform(X) # split into train and test set X_train, X_test, y_train, y_test = train_test_split( X_scaled, y, stratify=y, test_size=0.10, random_state=42 )

We will train the random forest algorithm with the selected processed features from our dataset, perform predictions, and then find the accuracy of the model.

# Create a Random Classifier clf = RandomForestClassifier(n_estimators=100) # Train the model using the training sets clf.fit(X_train, y_train) # prediction on test set y_pred = clf.predict(X_test) # Calculate Model Accuracy, print("Accuracy:", accuracy_score(y_test, y_pred))

Accuracy: 0.8181818181818182

Now the model accuracy has increased from 80.5% to 81.8% after we removed the least important feature called triceps_skinfold_thickness.

This suggests that it is very important to check important features and see if you can remove the least important features to increase your model's performance.

Wrapping up

Tree-based algorithms are really important for every data scientist to learn. In this article, you've learned the basics of tree-based algorithms and how to create a classification model by using the random forest algorithm.

I also recommend you try other types of tree-based algorithms such as the Extra-trees algorithm.

You can download the dataset and notebook used in this article here: //github.com/Davisy/Random-Forest-classification-Tutorial

Congratulations, you have made it to the end of this article!

If you learned something new or enjoyed reading this article, please share it so that others can see it. Until then, see you in the next post! I can also be reached on Twitter @Davis_McDavid