Машинное обучение (5): простые для понимания деревья решений, случайные леса и кодовая практика

машинное обучение

Как и SVM, деревья решений представляют собой алгоритмы машинного обучения общего назначения. Случайные леса, как следует из названия, объединяют классификаторы деревьев решений для формирования более мощных алгоритмов машинного обучения. Все они являются очень простыми, но мощными инструментами машинного обучения.Хотя теперь у нас есть более продвинутые алгоритмические инструменты для обучения моделей, деревья решений и случайные леса по-прежнему широко популярны за их простоту и гибкость, и мы рекомендуем всем изучить их.

1. Дерево решений

1.1 Что такое дерево решений

Мы можем думать о дереве решений как о глубоко вложенной двоичной древовидной структуре дискриминантов IF/ELSE. с нами в«Машинное обучение (3): понимание логистической регрессии и двоичной классификации, практика кодирования с несколькими классификациями»Возьмите набор данных радужной оболочки в качестве примера.

мы использовалиseabornНарисуйте график рассеяния характеристик длины и ширины лепестков, соответствующих видам ириса, следующим образом:

Когда длина лепестка меньше 2,45, это щетинковидная, а по остальным судим, что ширина лепестка меньше 1,75, это лишай, а остальные - виргиника. Затем я использую руководство, чтобы нарисовать древовидную структуру этого дискриминанта следующим образом:

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

Это дерево решений.

1.2 Практика кодирования дерева решений

Мы импортируем набор данных (вам не важно это доменное имя) и обучаем модель:

import numpy as np
import pandas as pd
from sklearn.tree import DecisionTreeClassifier

#引入数据集
df = pd.read_csv('https://blog.caiyongji.com/assets/iris.csv')

#决策树模型
X = df[['petal_length','petal_width']].to_numpy() 
y = df['species']
tree_clf = DecisionTreeClassifier(max_depth=2, random_state=42)
tree_clf.fit(X, y)

Давайте визуализируем дерево решений:

import matplotlib.pyplot as plt
from sklearn.tree import plot_tree
plt.figure(figsize=(12,8))
plot_tree(tree_clf,filled=True);

Как показано на рисунке выше, мы видим, что когда общее количество экземпляров корневого узла равно 150,value = [50, 50, 50]Можно видеть, что фактические образцы подразделяются на 50 экземпляров ириса, 50 экземпляров ириса разноцветного и 50 экземпляров ириса виргинского. Давайте посмотрим на листовой узел (фиолетовый) справа в конце, наvalue = [0, 1, 45]Можно видеть, что фактические образцы классифицируются на 0 экземпляров ириса, 1 экземпляр ириса разноцветного и 45 экземпляров ириса виргинского.

Так что же означает Джини = 0,043?

1.3 Примесь Джини

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

Gi=1k=1npi,k2G_i = 1 - \sum_{k=1}^{n}{p^2_{i,k}}

Рассчитываем коэффициент Джини узла радужной оболочки Вирджинии (фиолетовый)1-((0/46)**2 + (1/46)**2 + (45/46)**2) = 0.04253308128544431 ≈0.043.

Мы используем примесь Джини, чтобы измерить, насколько хорошим является дерево решений. Затем процесс решения границы X[0], X[1] (т. е. характеристики длины и ширины лепестка) путем минимизации примеси Джини min(gini) является процессом обучения модели дерева решений.

2. Случайный лес

2.1 Теорема больших чисел и случайный лес

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

Почему?

Предположим, что у нас есть неравномерная монета, которая имеет 51% шанс выпадения орла и 49% шанса выпадения решки, тогда при подбрасывании 1000 раз вероятность «в основном орла» составляет 75%. При 10 000 бросков вероятность выпадения «в основном орла» составляет 97%. Это теорема больших чисел, воплощающая мудрость толпы.Недостаточное качество, количество для восполнения. Видно, что текущий метод поиска лучшей модели — это не только соревнование навыков, но и соревнование вычислительной мощности.

2.2 Практика случайного леса

2.2.1. Представляем новый набор данных

Добавить цитату:

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns

Импортируйте набор данных (вам не нужно заботиться об этом доменном имени):

df = pd.read_csv("https://blog.caiyongji.com/assets/penguins_size.csv")
df = df.dropna()
df.head()
species island culmen_length_mm culmen_depth_mm flipper_length_mm body_mass_g sex
Adelie Torgersen 39.1 18.7 181 3750 MALE
Adelie Torgersen 39.5 17.4 186 3800 FEMALE
Adelie Torgersen 40.3 18 195 3250 FEMALE
Adelie Torgersen 36.7 19.3 193 3450 FEMALE
Adelie Torgersen 39.3 20.6 190 3650 MALE

Набор данных о пингвинах содержит следующие объекты и метки:

  • особенность: Остров, длина клюва culmen_length_мм, глубина клюва culmen_depth_мм, длина ласта flipper_length_мм, вес (г), пол
  • Этикетка: Виды: Антарктический, Адели или Gentoo

2.2.2 Данные наблюдений


sns.pairplot(df,hue='species')

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

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

X = pd.get_dummies(df.drop('species',axis=1),drop_first=True)
y = df['species']
X.head()

Уведомление,get_dummiesМетод преобразует столбец строковых свойств в несколько столбцов числовых свойств. Например, остров остров и пол пола преобразуются в остров_Dream, остров_Торгерсен и секс_FEMALE, секс_MALE соответственно. Это отношение прямого кодирования.Например, атрибуты sex_FEMALE и sex_MALE независимы, и в пространстве нет отношения векторов.

culmen_length_mm culmen_depth_mm flipper_length_mm body_mass_g island_Dream island_Torgersen sex_FEMALE sex_MALE
39.1 18.7 181 3750 0 1 0 1
39.5 17.4 186 3800 0 1 1 0
40.3 18 195 3250 0 1 1 0
36.7 19.3 193 3450 0 1 1 0
39.3 20.6 190 3650 0 1 0 1

2.2.4 Данные для обучения

#训练
from sklearn.model_selection import train_test_split
from sklearn.ensemble import RandomForestClassifier
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=101)
model = RandomForestClassifier(n_estimators=10,max_features='auto',random_state=101)
model.fit(X_train,y_train)

#预测
from sklearn.metrics import accuracy_score
preds = model.predict(X_test)
accuracy_score(y_test,preds)

Использование классификатора случайного лесаRandomForestClassifierПосле обучения точность модели составляет 97%.

2.2.5 Поиск по сетке и метод повышения AdaBoost (расширение)

Мы используемAdaBoostClassifierКлассификатор объединяет несколько классификаторов дерева решений.DecisionTreeClassifierСортировать. и используйте метод поиска по сеткеGridSearchCVнайти оптимальные параметры.

from sklearn.model_selection import GridSearchCV
from sklearn.ensemble import AdaBoostClassifier

ada_clf = AdaBoostClassifier(DecisionTreeClassifier(max_depth=1), random_state=101)
ada_clf.fit(X_train, y_train)
param_grid = {'n_estimators':[10,15,20,25,30,35,40], 'learning_rate':[0.01,0.1,0.5,1], 'algorithm':['SAMME', 'SAMME.R']}
grid = GridSearchCV(ada_clf,param_grid)
grid.fit(X_train,y_train)
print("grid.best_params_ = ",grid.best_params_,", grid.best_score_ =" ,grid.best_score_)

Это метод ансамблевого обучения, и результат выглядит следующим образом:

grid.best_params_ =  {'algorithm': 'SAMME', 'learning_rate': 1, 'n_estimators': 20} , grid.best_score_ = 0.9914893617021276

Суммировать

Двоичное дерево — это основная логика дерева решений, а случайный лес — это прикладная реализация теоремы больших чисел. Эту основную идею легко объяснить даже без математических формул, что также является основной стилевой особенностью этой серии курсов (статей), которые я делаю. На мой взгляд, математика — это объяснение реального мира, но реальный мир не может быть объяснен математикой.полностью объяснено. Как сказал Лоуренс Морони, глава отдела искусственного интеллекта в Google:

Многие люди боятся математики, боятся глубоких математических знаний. На самом деле, мы можем реализовать кодирование, не рассматривая математику, и мы можем использовать API-интерфейсы высокого (уровня) уровня в TensorFlow для решения таких задач, как обработка естественного языка, классификация изображений, модели последовательности компьютерного зрения и т. д. без необходимости разбираться в глубокой математике. Точно так же, как вы используете JAVA, но вам не обязательно знать, как она компилируется. В будущем искусственный интеллект станет лишь частью технологического стека (набора инструментов) каждого разработчика, точно так же, как HTML, CSS, JAVA.

Надеюсь, этот день наступит раньше...

Прошлые статьи: