Машинное обучение — дерево решений
Древо решений
В этой главе мы покажем вам, как составить «Дерево решений». Дерево решений — это блок-схема, которая может помочь вам принимать решения на основе предыдущего опыта.
В примере человек попытается решить, стоит ли ему идти на комедийное шоу или нет.
К счастью, человек из нашего примера регистрировался каждый раз, когда в городе проходило комедийное шоу, и регистрировал некоторую информацию о комике, а также регистрировался, пошел он или нет.
Возраст | Опыт | Классифицировать | Национальность | Идти |
36 | 10 | 9 | Соединенное Королевство | НЕТ |
42 | 12 | 4 | США | НЕТ |
23 | 4 | 6 | Н | НЕТ |
52 | 4 | 4 | США | НЕТ |
43 | 21 | 8 | США | ДА |
44 | 14 | 5 | Соединенное Королевство | НЕТ |
66 | 3 | 7 | Н | ДА |
35 | 14 | 9 | Соединенное Королевство | ДА |
52 | 13 | 7 | Н | ДА |
35 | 5 | 9 | Н | ДА |
24 | 3 | 5 | США | НЕТ |
18 | 3 | 7 | Соединенное Королевство | ДА |
45 | 9 | 9 | Соединенное Королевство | ДА |
Теперь, основываясь на этом наборе данных, Python может создать дерево решений, которое можно использовать для принятия решения о том, стоит ли посещать какие-либо новые шоу.
Как это работает?
Сначала импортируйте нужные вам модули и прочитайте набор данных с помощью pandas:
Пример
Прочитайте и распечатайте набор данных:
import pandas
from sklearn import tree
import pydotplus
from
sklearn.tree import DecisionTreeClassifier
import matplotlib.pyplot as plt
import matplotlib.image as pltimg
df = pandas.read_csv("shows.csv")
print(df)
Чтобы составить дерево решений, все данные должны быть числовыми.
Мы должны преобразовать нечисловые столбцы «Национальность» и «Идти» в числовые значения.
У Pandas есть map()
метод, который берет словарь с информацией о том, как преобразовать значения.
{'UK': 0, 'USA': 1, 'N': 2}
Средства преобразуют значения «Великобритания» в 0, «США» в 1 и «N» в 2.
Пример
Измените строковые значения на числовые значения:
d = {'UK': 0,
'USA': 1, 'N': 2}
df['Nationality'] = df['Nationality'].map(d)
d =
{'YES': 1, 'NO': 0}
df['Go'] = df['Go'].map(d)
print(df)
Затем мы должны отделить столбцы функций от целевого столбца.
Столбцы функций — это столбцы, которые мы пытаемся предсказать , а целевой столбец — это столбец со значениями, которые мы пытаемся предсказать.
Пример
X
это столбцы функций,
y
это целевой столбец:
features = ['Age', 'Experience', 'Rank', 'Nationality']
X = df[features]
y = df['Go']
print(X)
print(y)
Теперь мы можем создать фактическое дерево решений, подогнать его под наши детали и сохранить файл .png на компьютере:
Пример
Создайте дерево решений, сохраните его как изображение и покажите изображение:
dtree = DecisionTreeClassifier()
dtree = dtree.fit(X, y)
data =
tree.export_graphviz(dtree, out_file=None, feature_names=features)
graph =
pydotplus.graph_from_dot_data(data)
graph.write_png('mydecisiontree.png')
img=pltimg.imread('mydecisiontree.png')
imgplot = plt.imshow(img)
plt.show()
Объяснение результата
Дерево решений использует ваши более ранние решения, чтобы рассчитать вероятность того, захотите ли вы пойти к комику или нет.
Давайте прочитаем различные аспекты дерева решений:
Классифицировать
Rank <= 6.5
означает, что каждый комик с рангом 6,5 и ниже будет следовать за
True
стрелкой (влево), а остальные — за False
стрелкой (вправо).
gini = 0.497
относится к качеству разделения и всегда представляет собой число от 0,0 до 0,5, где 0,0 означает, что все образцы получили одинаковый результат, а 0,5 означает, что разделение выполняется точно посередине.
samples = 13
означает, что на данный момент в решении осталось 13 комиков, то есть все они, поскольку это первый шаг.
value = [6, 7]
означает, что из этих 13 комиков 6 получат «НЕТ», а 7 получат «ПРОДОЛЖЕНИЕ».
Джини
Есть много способов разделить образцы, в этом уроке мы используем метод GINI.
В методе Джини используется следующая формула:
Gini = 1 - (x/n)2 - (y/n)2
Где x
количество положительных ответов («GO»),
n
количество выборок и
y
количество отрицательных ответов («НЕТ»), что дает нам этот расчет:
1 - (7 / 13)2 - (6 / 13)2 = 0.497
Следующий шаг содержит два ящика: один ящик для комиков с «Рангом» 6,5 или ниже и один ящик с остальными.
Правда - 5 комиков заканчиваются здесь:
gini = 0.0
означает, что все образцы получили одинаковый результат.
samples = 5
означает, что в этой ветке осталось 5 юмористов (5 комиков с рангом 6,5 и ниже).
value = [5, 0]
означает, что 5 получит «НЕТ», а 0 получит «ПРОДОЛЖЕНИЕ».
Ложь - 8 комиков Продолжение:
Национальность
Nationality <= 0.5
означает, что комики со значением национальности менее 0,5 будут следовать за стрелкой влево (это означает, что все из Великобритании), а остальные будут следовать за стрелкой вправо.
gini = 0.219
означает, что около 22% выборок будут идти в одном направлении.
samples = 8
означает, что в этой ветке осталось 8 юмористов (8 комиков с рангом выше 6,5).
value = [1, 7]
означает, что из этих 8 комиков 1 получит «НЕТ», а 7 получат «ПРОДОЛЖЕНИЕ».
Правда - 4 Юмориста Продолжение:
Возраст
Age <= 35.5
означает, что комики в возрасте 35,5 лет и младше будут следовать за стрелкой влево, а остальные - за стрелкой вправо.
gini = 0.375
означает, что около 37,5 % проб пойдет в одном направлении.
samples = 4
означает, что в этой ветке осталось 4 комика (4 комика из Великобритании).
value = [1, 3]
означает, что из этих 4 комиков 1 получит "НЕТ", а 3 - "ДА".
Ложь - 4 комика заканчиваются здесь:
gini = 0.0
означает, что все образцы получили одинаковый результат.
samples = 4
означает, что в этой ветке осталось 4 комика (4 комика не из Великобритании).
value = [0, 4]
означает, что из этих 4 комиков 0 получит «НЕТ», а 4 получат «ПРОДОЛЖЕНИЕ».
Правда - 2 комика заканчиваются здесь:
gini = 0.0
означает, что все образцы получили одинаковый результат.
samples = 2
означает, что в этой ветке осталось 2 комика (2 комика в возрасте 35,5 лет и младше).
value = [0, 2]
означает, что из этих 2 комиков 0 получит «НЕТ», а 2 получат «ПРОДОЛЖЕНИЕ».
Ложь - 2 Юмористы Продолжают:
Опыт
Experience <= 9.5
означает, что юмористы со стажем 9,5 лет и менее будут следовать за стрелкой влево, а остальные - за стрелкой вправо.
gini = 0.5
означает, что 50% выборок будут идти в одном направлении.
samples = 2
означает, что в этой ветке осталось 2 юмориста (2 комика старше 35,5 лет).
value = [1, 1]
означает, что из этих двух комиков 1 получит «НЕТ», а 1 получит «ПРОДОЛЖЕНИЕ».
Правда - 1 комик заканчивается здесь:
gini = 0.0
означает, что все образцы получили одинаковый результат.
samples = 1
означает, что в этой ветке остался 1 юморист (1 юморист со стажем 9,5 лет и менее).
value = [0, 1]
означает, что 0 получит «НЕТ», а 1 получит «ПРОДОЛЖЕНИЕ».
Ложь - 1 комик заканчивается здесь:
gini = 0.0
означает, что все образцы получили одинаковый результат.
samples = 1
означает, что в этой ветке остался 1 юморист (1 юморист со стажем более 9,5 лет).
value = [1, 0]
означает, что 1 получит «НЕТ», а 0 получит «ПРОДОЛЖЕНИЕ».
Предсказать значения
Мы можем использовать дерево решений для прогнозирования новых значений.
Пример: стоит ли мне пойти на шоу с участием 40-летнего американского комика с 10-летним стажем и рейтингом комедий 7?
Пример
Используйте метод predict() для прогнозирования новых значений:
print(dtree.predict([[40, 10, 7, 1]]))
Пример
Каким был бы ответ, если бы ранг комедии был 6?
print(dtree.predict([[40, 10, 6, 1]]))
Разные результаты
Вы увидите, что дерево решений дает разные результаты, если вы запускаете его достаточное количество раз, даже если вы вводите в него одни и те же данные.
Это потому, что дерево решений не дает нам стопроцентно определенного ответа. Он основан на вероятности исхода, и ответ будет разным.