- Введение в алгоритм случайного леса на Python
- Что такое деревья решений?
- Что такое случайный лес?
- Преимущества случайных лесов
- Недостатки случайных лесов
- Важная терминология, относящаяся к деревьям решений [1]
- Импортируйте необходимые зависимости:
- Загрузите предварительно обработанный набор данных:
- Задайте параметры для модели случайного леса:
- Гиперпараметры классификатора случайного леса Sklearn [2]:
- Определите модель:
- Обучите модель:
- Протестируйте обученную модель на тестовых данных:
- Использование нейронных сетей:
- Определите модель:
- Обучите модель:
- Протестируйте обученную модель на тестовых данных:
- Использованная литература :
- Вам также может понравиться:
Введение в алгоритм случайного леса на Python
Алгоритм случайного леса стал наиболее распространенным алгоритмом, который используется в соревнованиях ML, таких как соревнования Kaggle. Если вы когда-нибудь будете искать простой в использовании и точный алгоритм ML, вы получите абсолютно случайный лес в верхних результатах. Чтобы понять алгоритм случайного леса, вы должны сначала познакомиться с деревьями решений.
Что такое деревья решений?
- Деревья решений — это модели прогнозирования, которые используют набор двоичных правил для вычисления целевого значения.
- Существует два типа деревьев решений: деревья классификации и деревья регрессии.
- Деревья классификации используются для создания наборов категориальных данных, таких как классификация земного покрова.
- Деревья регрессии используются для создания непрерывных наборов данных, таких как биомасса и процент покрытия деревьев.
- Каждое отдельное дерево представляет собой довольно простую модель с ветвями, узлами и листьями.
- Узлы содержат атрибуты, от которых зависит целевая функция.
Теперь, когда вы познакомились с деревьями решений, вы готовы понять случайный лес.
Что такое случайный лес?
Как определил Лео Брейман в своей исследовательской статье: «Случайные леса — это комбинация предикторов деревьев, такая, что каждое дерево зависит от значений случайного вектора, отбираемого независимо и с одинаковым распределением для всех деревьев. В лесу «
Другое определение: «Случайный лес — это классификатор, состоящий из набора классификаторов с древовидной структурой , где — независимые одинаково распределенные случайные векторы, и каждое дерево дает единичный голос за самый популярный класс на входе x ». Вкратце, случайный лес строит несколько деревьев решений и объединяет их вместе для получения более точного и стабильного прогноза.
Преимущества случайных лесов
- Его можно использовать как для задач классификации, так и для задач регрессии.
- Уменьшение переобучения: усреднение нескольких деревьев значительно снижает риск переобучения.
- Случайные леса делают неверный прогноз только тогда, когда более половины базовых классификаторов неверны.
- Очень легко измерить относительную важность каждой функции для прогноза. В Sklearn в качестве примера есть мощная библиотека для этого.
Из-за этого он более точен, чем большинство других алгоритмов.
Недостатки случайных лесов
- Было замечено, что случайные леса чрезмерно подходят для некоторых наборов данных с зашумленными задачами классификации / регрессии.
- Это более сложный и затратный с точки зрения вычислений алгоритм, чем алгоритм дерева решений.
Важная терминология, относящаяся к деревьям решений [1]
Давайте посмотрим на основную терминологию, используемую с деревьями решений и случайными лесами:
- Корневой узел: он представляет всю генеральную совокупность или выборку, которая далее делится на два или более однородных набора.
- Разделение: это процесс разделения узла на два или более подузлов.
- Узел принятия решения: когда подузел разделяется на дополнительные подузлы, он называется узлом принятия решения.
- Конечный / конечный узел: узлы не разделяются, это называется конечным или конечным узлом.
- Удаление: когда мы удаляем подузлы узла принятия решения, этот процесс называется сокращением. Можно сказать обратный процесс расщепления.
- Ветвь / поддерево. Подраздел всего дерева называется ветвью или поддеревом.
- Родительский и дочерний узлы: узел, который разделен на подузлы, называется родительским узлом подузлов, а подузлы являются дочерними по отношению к родительскому узлу.
После того, как мы познакомимся с некоторыми основами о случайных лесах, давайте использовать этот алгоритм в некотором наборе данных. В нашем случае мы будем использовать набор данных Kaggle’s titanic Survivors, который я предварительно обработал ранее.
А затем мы будем использовать нейронную сеть для сравнения результатов.
Я рекомендую вам попробовать запустить код самостоятельно в этом [Блокноте Colab]
Импортируйте необходимые зависимости:
from sklearn.model_selection import train_test_split import pandas as pd import numpy as np from keras.models import Sequential from keras.layers import Dense, Activation, Flatten from sklearn.ensemble import RandomForestClassifier from sklearn.metrics import f1_score from sklearn.metrics import accuracy_score from keras.callbacks import ModelCheckpoint from sklearn.metrics import accuracy_score
Загрузите предварительно обработанный набор данных:
Загрузите предварительно обработанный набор данных [Здесь]
dataset =pd.read_csv('TitanicPreprocessed.csv') dataset.head()
y = dataset['Survived'] X = dataset.drop(['Survived'], axis = 1) # Split the dataset to trainand test data train_X, test_X, train_y, test_y = train_test_split(X, y, test_size=0.25, random_state=0)
Задайте параметры для модели случайного леса:
Гиперпараметры классификатора случайного леса Sklearn [2]:
bootstrap: логический, необязательный (по умолчанию = True)
min_samples_leaf: int, float, необязательно (по умолчанию = 1)
Минимальное количество выборок, которое требуется для конечного узла:
- Если int, то считайте min_samples_leaf минимальным числом.
- Если float, то min_samples_leaf — это процент, а ceil (min_samples_leaf * n_samples) — минимальное количество выборок для каждого узла.
n_estimators: целое число, необязательно (по умолчанию = 10)
min_samples_split: int, float, необязательно (по умолчанию = 2)
Минимальное количество выборок, необходимое для разделения внутреннего узла:
- Если int, то считайте min_samples_split минимальным числом.
- Если float, то min_samples_split — это процент, а ceil (min_samples_split * n_samples) — минимальное количество выборок для каждого разделения.
max_features: int, float, string или None, необязательно (по умолчанию = «auto»)
Количество функций, которые следует учитывать при поиске лучшего сплита:
- Если int, то учитывайте особенности max_features при каждом разбиении. -Если число с плавающей точкой, max_features — это процентное значение, а функции int (max_features * n_features) учитываются при каждом разбиении.
- Если «авто», то max_features = sqrt (n_features).
- Если «sqrt», то max_features = sqrt (n_features) (то же, что «auto»).
- Если «log2», то max_features = log2 (n_features).
- Если нет, то max_features = n_features.
max_depth: целое число или None, необязательно (по умолчанию = None)
- Максимальная глубина дерева. Если None, то узлы расширяются до тех пор, пока все листья не станут чистыми или пока все листья не будут содержать менее min_samples_split выборок.
max_leaf_nodes: int или None, необязательно (по умолчанию = None)
- Выращивайте деревья с max_leaf_nodes способом «лучший первый». Лучшие узлы определяются как относительное уменьшение примесей. Если None, то неограниченное количество конечных узлов.
Если вы хотите узнать больше об остальных гиперпараметрах, посетите sklearn.ensemble.RandomForestClassifier
Определите модель:
RF_model = RandomForestClassifier(**parameters)
Обучите модель:
RF_model.fit(train_X, train_y)
Протестируйте обученную модель на тестовых данных:
RF_predictions = RF_model.predict(test_X) score = accuracy_score(test_y ,RF_predictions) print(score)
Мы видим, что точность модели 82%, совсем неплохо.
Использование нейронных сетей:
Определите модель:
# Build a neural network : NN_model = Sequential() NN_model.add(Dense(128, input_dim = 68, activation='relu')) NN_model.add(Dense(256, activation='relu')) NN_model.add(Dense(256, activation='relu')) NN_model.add(Dense(256, activation='relu')) NN_model.add(Dense(1, activation='sigmoid')) NN_model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy'])
Определите обратный вызов контрольной точки:
checkpoint_name = 'Weights--.hdf5' checkpoint = ModelCheckpoint(checkpoint_name, monitor='val_acc', verbose = 1, save_best_only = True, mode ='max') callbacks_list = [checkpoint]
Обучите модель:
NN_model.fit(train_X, train_y, epochs=150, batch_size=64, validation_split = 0.2, callbacks=callbacks_list)
Epoch 00044: val_acc did not improve from 0.88060 Epoch 45/150 534/534 [==============================] — 0s 149us/step — loss: 0.3196 — acc: 0.8652 — val_loss: 0.4231 — val_acc: 0.8433 Epoch 00045: val_acc did not improve from 0.88060 Epoch 46/150 534/534 [==============================] — 0s 134us/step — loss: 0.3156 — acc: 0.8670 — val_loss: 0.4175 — val_acc: 0.8358 Epoch 00046: val_acc did not improve from 0.88060 Epoch 47/150 534/534 [==============================] — 0s 144us/step — loss: 0.3031 — acc: 0.8689 — val_loss: 0.4214 — val_acc: 0.8433 Epoch 00047: val_acc did not improve from 0.88060 Epoch 48/150 534/534 [==============================] — 0s 131us/step — loss: 0.3117 — acc: 0.8689 — val_loss: 0.4095 — val_acc: 0.8582 . . . Epoch 00148: val_acc did not improve from 0.88060 Epoch 149/150 534/534 [==============================] — 0s 146us/step — loss: 0.1599 — acc: 0.9382 — val_loss: 1.0482 — val_acc: 0.7761 Epoch 00149: val_acc did not improve from 0.88060 Epoch 150/150 534/534 [==============================] — 0s 133us/step — loss: 0.1612 — acc: 0.9307 — val_loss: 1.1589 — val_acc: 0.7836 Epoch 00150: val_acc did not improve from 0.88060
Загрузите файл wights лучшей модели:
wights_file = './Weights-016-0.88060.hdf5' # choose the best checkpoint NN_model.load_weights(wights_file) # load it NN_model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy'])
Протестируйте обученную модель на тестовых данных:
predictions = NN_model.predict(test_X) # round predictions rounded = [round(x[0]) for x in predictions] predictions = rounded score = accuracy_score(test_y ,predictions) print(score)
Точность этой модели нейронной сети составляет 81%, мы замечаем, что использование случайного леса дает нам более высокую точность.
- Мы узнали некоторые основы о деревьях решений и случайных лесах.
- Мы обсудили преимущества и недостатки использования случайных лесов.
- Мы говорили о некоторых важных терминологиях, связанных с деревьями решений и случайными лесами.
- Мы применили как алгоритм случайного леса, так и нейронные сети к набору данных, и мы сравнили точность двух моделей.
- Случайные леса обогнали нейронные сети в задаче прогнозирования титанических выживших.
Использованная литература :
Вы можете подписаться на меня в Twitter @ModMaamari
Вам также может понравиться:
Источник