Как и 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 Примесь Джини
Очевидно, что когда мы классифицируем, чем меньше каждая категория фактически смешивается с другими категориями, тем лучше классификация.чисто, эта чистота выражается следующей формулой:
Рассчитываем коэффициент Джини узла радужной оболочки Вирджинии (фиолетовый)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.
Надеюсь, этот день наступит раньше...
Прошлые статьи:
- Машинное обучение (4): популярное понимание метода опорных векторов SVM и практика написания кода
- Машинное обучение (3): понимание логистической регрессии и практика кодирования двоичных и мультиклассификационных кодов
- Машинное обучение (2): понимание линейной регрессии и градиентного спуска и создание простых прогнозов
- Машинное обучение (1): 5 минут, чтобы понять машинное обучение и приступить к работе
- Предмашинное обучение (5): освойте использование часто используемой библиотеки Matplotlib за 30 минут.
- Предварительное машинное обучение (4): освойте использование Pandas в одной статье.
- Предварительное машинное обучение (3): освоение стандартного использования NumPy за 30 минут.
- Предварительное машинное обучение (2): освойте использование обычного ноутбука Jupyter за 30 минут.
- Предмашинное обучение (1): математические символы и греческие буквы