Легко усваиваемая теория + пример Kaggle = стать Kaggler

Давайте начнем веселое обучение с забавного примера, доступного в Интернете, под названием Акинатор (я очень рекомендую поиграть с ним).

Теперь давайте сначала изучим ключевую концепцию алгоритма деревьев решений, такую ​​как энтропия.

Энтропия пришла из физики, и для объяснения этого мы будем использовать пример трех состояний воды.

Энтропия - это то, насколько свободна частица, чтобы двигаться, поэтому мы прокомментируем значение энтропии для различных состояний воды: низкого, среднего и высокого.

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

Энтропию также можно изучить с помощью концепции под названием «Приобретение знаний». Возьмем этот пример с шарами, если нам нужно выбрать случайный шар, сколько мы знаем о цвете шара. В первом противостоянии мы точно знаем, что мяч красный, так что мы хорошо разбираемся в этом. Во втором ведре он, скорее всего, будет красным, а не синим, поэтому, если мы сделаем ставку на красный цвет случайно выбранного шара, то большую часть времени мы будем правы. Итак, мы можем сказать, что у нас среднее знание цвета мяча. У третьего оленя он с одинаковой вероятностью будет синим или красным, поэтому мы меньше знаем о цвете. И оказывается, что знание и энтропия противоположны.

Итак, чтобы составить формулу для энтропии, мы рассмотрим следующую игру. Мы рассмотрим конфигурацию красный, красный, красный и синий и поместим их в ведро. Теперь, что мы делаем, мы вытаскиваем четыре шара из ведра с повторением, и мы пытаемся получить начальную конфигурацию (это красный, красный, красный и синий этого порядка), и если мы получим эту конфигурацию, мы выиграем, иначе мы потерпим неудачу.

Теперь вопрос

Итак, давайте выясним вероятность одного за другим.

Теперь продукты вероятностей сбивают с толку в основном по двум причинам:

  1. Допустим, у нас есть тысяча шаров, и если мы возьмем умножение вероятностей (которые всегда находятся между 0 и 1), то число будет очень-очень маленьким.
  2. Другая причина - небольшое изменение одного из факторов может кардинально изменить результат.

Итак, нам нужно что-то лучше, чем продукты, а это сумма, и как этого можно достичь, взяв журнал, потому что, как мы знаем -

Мы получаем значение энтропии по определению как среднее из отрицательных значений логарифмов вероятностей выбора мяча таким образом, чтобы мы выиграли игру.

Итак, в случае несколько общего случая, мы получаем

Другой ключевой концепцией является получение информации, которая может быть получена из энтропии как -

Теперь давайте построим дерево решений -

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

Опять же - мы выбираем дерево, которое дает наибольший объем информации.

Предположим, у нас возникла проблема с рекомендацией приложений на основе данных игрового магазина.

Энтропия будет такой, как указано выше, если мы сначала разделим их на основе пола.

И когда мы разделимся по роду занятий

Поскольку получение информации для профессии больше, мы выберем ее в первую очередь, и наше дерево будет выглядеть так:

Гиперпараметры деревьев решений

Чтобы создать деревья решений, которые хорошо обобщаются на новые проблемы, мы можем настроить несколько различных аспектов деревьев. Мы называем различные аспекты дерева решений «гиперпараметрами». Вот некоторые из наиболее важных гиперпараметров, используемых в деревьях решений:

Максимальная глубина

Максимальная глубина дерева решений - это просто максимально возможная длина от корня до листа. Дерево максимальной длины k k может иметь не более 2 ^ k2 k листьев.

Максимальная глубина дерева решений

Минимальное количество образцов для разделения

Узел должен иметь не менее min_samples_split выборок, чтобы быть достаточно большим для разделения. Если на узле меньше выборок, чем min_samples_split выборок, он не будет разделен, и процесс разделения остановится.

Минимальное количество образцов для разделения

Однако min_samples_split не контролирует минимальный размер листьев. Как вы можете видеть в примере справа выше, у родительского узла было 20 выборок, больше чем min_samples_split = 11, поэтому узел был разделен. Но когда узел был разделен, был создан дочерний узел с 5 образцами, меньше чем min_samples_split = 11.

Минимальное количество образцов на лист

При разделении узла можно столкнуться с проблемой наличия 99 выборок в одном из них и 1 - в другом. Это не приведет нас слишком далеко в нашем процессе и будет пустой тратой ресурсов и времени. Если мы хотим избежать этого, мы можем установить минимальное количество выборок, которое мы разрешаем для каждого листа.

Минимальное количество образцов на лист

Это число можно указать как целое число или как число с плавающей запятой. Если это целое число, это минимальное количество выборок, разрешенных в листе. Если это число с плавающей запятой, это минимальный процент образцов, разрешенный в листе. Например, 0,1 или 10% означает, что конкретное разделение не будет разрешено, если один из результатов содержит менее 10% выборок в наборе данных.

Деревья решений в sklearn

В этом разделе вы будете использовать деревья решений, чтобы соответствовать заданному образцу набора данных.

Прежде чем вы это сделаете, давайте рассмотрим инструменты, необходимые для построения этой модели.

Для модели дерева решений вы будете использовать класс Decision Tree Classifier scikit-learn. Этот класс предоставляет функции для определения и адаптации модели к вашим данным.

>>> from sklearn.tree import DecisionTreeClassifier
>>> model = DecisionTreeClassifier()
>>> model.fit(x_values, y_values)

В приведенном выше примере переменная model - это модель дерева решений, которая была адаптирована к данным x_values и y_values. Подбор модели означает поиск наилучшего дерева, которое соответствует обучающим данным. Сделаем два прогноза, используя функцию модели predict().

>>> print(model.predict([ [0.2, 0.8], [0.5, 0.4] ]))
[[ 0., 1.]]

Модель вернула массив прогнозов, по одному прогнозу для каждого входного массива. Первый ввод, [0.2, 0.8], получил прогноз 0.. Второй ввод, [0.5, 0.4], получил прогноз 1..

Гиперпараметры

Когда мы определяем модель, мы можем указать гиперпараметры. На практике самые распространенные из них:

  • max_depth: максимальное количество уровней в дереве.
  • min_samples_leaf: минимальное количество образцов, разрешенное в листе.
  • min_samples_split: минимальное количество выборок, необходимое для разделения внутреннего узла.

Например, здесь мы определяем модель, в которой максимальная глубина деревьев max_depth равна 7, а минимальное количество элементов в каждом листе min_samples_leaf равно 10.

>>> model = DecisionTreeClassifier(max_depth = 7, min_samples_leaf = 10)

Теперь давайте возьмем задачу Kaggle (модель выживания в Титанике с деревьями решений).

# Import libraries necessary for this project
import numpy as np
import pandas as pd
from IPython.display import display # Allows the use of display() for DataFrames
# Pretty display for notebooks
%matplotlib inline
# Set a random seed
import random
random.seed(42)
# Load the dataset
in_file = 'titanic_data.csv'
full_data = pd.read_csv(in_file)
# Print the first few entries of the RMS Titanic data
display(full_data.head())

  • Выжил: результат выживания (0 = нет; 1 = да).
  • Pclass: социально-экономический класс (1 = высший класс; 2 = средний класс; 3 = низший класс).
  • Имя: имя пассажира.
  • Пол: пол пассажира.
  • Возраст: возраст пассажира (некоторые записи содержат NaN).
  • SibSp: количество братьев, сестер и супругов пассажира на борту.
  • Parch: количество родителей и детей пассажира на борту.
  • Билет: номер билета пассажира.
  • Тариф: тариф, оплачиваемый пассажиром.
  • Кабина Номер кабины пассажира (некоторые записи содержат NaN)
  • Посадка: порт посадки пассажира (C = Шербур; Q = Квинстаун; S = Саутгемптон).

Поскольку нас интересует результат выживания каждого пассажира или члена экипажа, мы можем удалить функцию Выжившие из этого набора данных и сохранить ее как отдельную переменную outcomes. Мы будем использовать эти результаты в качестве целей прогнозирования.
Запустите приведенную ниже ячейку кода, чтобы удалить Выжившие как функцию набора данных и сохранить ее в outcomes.

# Store the 'Survived' feature in a new variable and remove it from the dataset
outcomes = full_data['Survived']
features_raw = full_data.drop('Survived', axis = 1)
# Show the new dataset with 'Survived' removed
display(features_raw.head())

Предварительная обработка данных

# Removing the names
features_no_name = features_raw.drop(['Name'], axis=1)
# One-hot encoding
features = pd.get_dummies(features_no_name)
features = features.fillna(0.0)
display(features.head())

Обучение модели

from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(features, outcomes, test_size=0.2, random_state=42)
# Import the classifier from sklearn
from sklearn.tree import DecisionTreeClassifier
# Define the classifier, and fit it to the data
model = DecisionTreeClassifier()
model.fit(X_train, y_train)

Тестирование модели

# Making predictions
y_train_pred = model.predict(X_train)
y_test_pred = model.predict(X_test)
# Calculate the accuracy
from sklearn.metrics import accuracy_score
train_accuracy = accuracy_score(y_train, y_train_pred)
test_accuracy = accuracy_score(y_test, y_test_pred)
print('The training accuracy is', train_accuracy)
print('The test accuracy is', test_accuracy)
The training accuracy is 1.0
The test accuracy is 0.815642458101

Улучшение модели - экспериментируя с гиперпараметрами

Попытка указать некоторые параметры для повышения точности тестирования, такие как:

  • max_depth
  • min_samples_leaf
  • min_samples_split

Мы можем использовать вашу интуицию, метод проб и ошибок или, что еще лучше, воспользуйтесь поиском по сетке!

# Training the model
model = DecisionTreeClassifier(max_depth=6, min_samples_leaf=6, min_samples_split=10)
model.fit(X_train, y_train)
# Making predictions
y_train_pred = model.predict(X_train)
y_test_pred = model.predict(X_test)
# Calculating accuracies
train_accuracy = accuracy_score(y_train, y_train_pred)
test_accuracy = accuracy_score(y_test, y_test_pred)
print('The training accuracy is', train_accuracy)
print('The test accuracy is', test_accuracy)
The training accuracy is 0.870786516854
The test accuracy is 0.854748603352

Поздравляю !! Теперь ты тоже можешь стать Кагглером

Нажмите кнопку Clap, если вам нравится работа !!

Удачного обучения !! вернусь с более интересными уроками :)