Деревья решений в машинном обучении


Дерево решений (Decision Tree)

В этой главе мы покажем вам, как сделать «дерево решений». Дерево решений — это процессная карта, которая помогает вам принимать решения на основе своего опыта.

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

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

Возраст Опыт Rank Nationality Go
36 10 9 UK NO
42 12 4 USA NO
23 4 6 N NO
52 4 4 USA NO
43 21 8 USA YES
44 14 5 UK NO
66 3 7 N YES
35 14 9 UK YES
52 13 7 N YES
35 5 9 N YES
24 3 5 USA NO
18 3 7 UK YES
45 9 9 UK YES

Теперь, основываясь на этом наборе данных, Python может создать decisión arbre, который можно использовать для решения, стоит ли участвовать в любом новом спектакле.

Как это работает

Сначала импортируйте необходимые модули и используйте 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)

Запуск примера

Чтобы создать decisión arbre, все данные должны быть числовыми.

Мы должны преобразовать нечисловые колонки 'Nationality' и 'Go' в числовые.

Pandas имеет map() Метод, который принимает словарь с информацией о том, как преобразовать значения.

{'UK': 0, 'USA': 1, 'N': 2}

Это означает, что значение 'UK' преобразуется в 0, 'USA' - в 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)

Запуск примера

Теперь мы можем создать实际的 décision arbre, чтобы он подходил нашим деталям, и затем сохранить его в файле .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()

Запуск примера

Интерпретация результатов

Decision Tree использует ваши предыдущие решения для расчета вероятности того, что вы хотите去看 комедийных актеров.

Давайте рассмотрим различные аспекты决策-дерева:


Rank

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 получат "NO", а 7 - "GO".

Gini

Существует множество методов разделения образцов, и в этом руководстве мы используем метод GINI.

Метод Гини использует следующую формулу:

Gini = 1 - (x/n)2 - (y/n)2

Где x - количество положительных ответов ("GO"), n - количество образцов, y - количество отрицательных ответов ("NO"), и вычисляется по следующей формуле:

1 - (7 / 13)2 - (6 / 13)2 = 0.497


Следующий шаг включает два окна, одно из которых предназначено для комедийных актеров с рейтингом 6.5 или更低, а второе для остальных.

True - 5 комедийных актеров заканчиваются здесь:

gini = 0.0 Это означает, что все образцы дали одинаковый результат.

samples = 5 Это означает, что в этой ветке еще осталось 5 комедийных актеров (у 5 актеров рейтинг 6.5 или更低).

value = [5, 0] It means that 5 get "NO" and 0 get "GO".

False - 8 actors of drama continue:

Nationality (nationality)

Nationality <= 0.5 It indicates that actors of comedy with a nationality value less than 0.5 will follow the left arrow (this means everyone from the UK), and the rest will follow the right arrow.

gini = 0.219 It means that about 22% of the samples will move in one direction.

samples = 8 It indicates that there are still 8 actors of comedy in this branch (8 actors of comedy with a rating higher than 6.5).

value = [1, 7] It means that in these 8 actors of comedy, 1 will get "NO", and 7 will get "GO".


True - 4 actors of drama continue:

Age (age)

Age <= 35.5 It indicates that actors of comedy under 35.5 years old will follow the left arrow, and the rest will follow the right arrow.

gini = 0.375 It means that about 37.5% of the samples will move in one direction.

samples = 4 It indicates that there are still 4 actors of comedy in this branch (4 actors of comedy from the UK).

value = [1, 3] It means that in these 4 actors of comedy, 1 will get "NO", and 3 will get "GO".

False - 4 actors of comedy end here:

gini = 0.0 Это означает, что все образцы дали одинаковый результат.

samples = 4 It indicates that there are still 4 actors of comedy in this branch (4 actors of comedy from the UK).

value = [0, 4] It means that in these 4 actors of comedy, 0 will get "NO", and 4 will get "GO".


True - 2 actors of comedy here end:

gini = 0.0 Это означает, что все образцы дали одинаковый результат.

samples = 2 It indicates that there are still 2 actors of comedy in this branch (2 actors of comedy 35.5 years old or younger).

value = [0, 2] It means that in these 2 actors of comedy, 0 will get "NO", and 2 will get "GO".

False - 2 actors of drama continue:

Experience (experience)

Experience <= 9.5 It indicates that actors of comedy with 9.5 years of experience or more will follow the arrow on the left, and the rest will follow the arrow on the right.

gini = 0.5 It means that 50% of the samples will move in one direction.

samples = 2 It indicates that there are still 2 actors of comedy in this branch (2 actors of comedy over 35.5 years old).

value = [1, 1] It means that one of these two actors of comedy will get "NO", and the other will get "GO".


True - 1 actors of comedy here end:

gini = 0.0 Это означает, что все образцы дали одинаковый результат.

samples = 1 Это означает, что в этой ветви осталось 1 комик (1 - комик с опытом 9,5 лет или меньше).

value = [0, 1] Это означает, что 0 означает "NO", 1 означает "GO".

False - 1 комик до сих пор:

gini = 0.0 Это означает, что все образцы дали одинаковый результат.

samples = 1 Это означает, что в этой ветви осталось 1 комик (из которых 1 - комик с опытом более 9,5 лет).

value = [1, 0] 1 означает "NO", 0 означает "GO".

Прогнозируемые значения

Мы можем использовать決策树来预测新的值。

Например: должен ли я去看 программу,主演 которой - 40-летний американский комик с 10-летним опытом, и рейтинг которой 7?

Пример

Использование predict() Методы прогнозирования новых значений:

print(dtree.predict([[40, 10, 7, 1]]))

Запуск примера

Пример

Если рейтинг комедии составляет 6, что это за ответ?

print(dtree.predict([[40, 10, 6, 1]]))

Запуск примера

Разные результаты

Если запускать достаточно раз, даже если вы вводите одинаковые данные,決策树也会为您提供不同的结果。

Это потому, что決策树不能给我们 100% 的确信答案。它基于结果的可能性,答案会有所不同。