Деревья решений в машинном обучении
- Предыдущая страница Тренировка/тестирование
- Следующая страница Введение в MySQL

Дерево решений (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% 的确信答案。它基于结果的可能性,答案会有所不同。
- Предыдущая страница Тренировка/тестирование
- Следующая страница Введение в MySQL