Внедрив дерево решений в sklearn, мы можем увидеть, как работают деревья решений.

Для начала мы можем загрузить набор данных и отобразить некоторые его строки.

# 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 = Саутгемптон).

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

# 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())

Функция Survived была удалена из DataFrame в той же выборке данных RMS Titanic. Стоит отметить, что данные (данные о пассажирах) и результаты (результаты выживания) теперь объединены в пары. Это включает в себя любые данные о пассажирах. Они имеют исходы исходов выживания [i] в ​​loc[i].

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

Теперь займемся предварительной обработкой данных. Сначала мы удалим имена пассажиров, а затем сразу закодируем функции.

Горячее кодирование полезно для преобразования категориальных данных в числовые данные, при этом каждый отдельный параметр в категории изменяется на 0 или 1 в отдельной новой категории в зависимости от того, выбран ли этот параметр или нет (например, порт Квинстауна или не порт Квинстауна) .

Вопрос. Почему было бы ужасной идеей сразу закодировать данные без удаления имен?

Ответ. Было бы абсурдно ожидать, что модель будет делать прогнозы на основе имен пассажиров. (Модель, которая учится на именах, может вызвать переоснащение.) Итак, сначала нам нужно удалить столбец имени из данных, а затем выполнить однократное кодирование следующим образом:

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

А теперь мы будем использовать нули для заполнения любых пробелов.

features = features.fillna(0.0)
display(features.head())

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

Теперь мы готовы использовать sklearn для обучения модели. Для начала разделите данные на наборы для обучения и тестирования. Затем модель будет обучена на обучающих данных.

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)
# 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

Итак, есть высокая точность обучения (1,0) и более низкая точность тестирования (0,815..). Возможно, мы немного переоснащаемся.

Улучшение модели

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

  • max_depth
  • min_samples_leaf
  • min_samples_split
# Train the model
model = DecisionTreeClassifier(max_depth= 10,min_samples_leaf =5, min_samples_split=6)
model.fit(X_train,y_train)
# TODO: Make predictions
y_train_pred = model.predict(X_train)
y_test_pred = model.predict(X_test)
# Calculate the accuracy
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.890449438202
>The test accuracy is 0.854748603352

Теперь, играя с гиперпараметрами, мы увеличиваем наши результаты и улучшаем модель, повышая точность теста.

Вот мой код и данные:



Этот контент был получен в рамках программы Udacity Technology Scholarship.