Tuesday, July 19, 2022

AdaBoost Algorithm From Scratch

 Boosting — это метод моделирования ансамбля, который пытается построить сильный классификатор из числа слабых классификаторов. Это делается путем построения модели с использованием последовательно слабых моделей. Во-первых, модель строится из обучающих данных. Затем строится вторая модель, которая пытается исправить ошибки, присутствующие в первой модели. Эта процедура продолжается, и модели добавляются до тех пор, пока не будет правильно предсказан полный набор обучающих данных или пока не будет добавлено максимальное количество моделей.

AdaBoost был первым действительно успешным алгоритмом повышения, разработанным для двоичной классификации. Модели AdaBoost относятся к классу ансамблевых моделей машинного обучения. Из буквального значения слова «ансамбль» мы можем легко лучше понять, как работает эта модель. Модели ансамбля берут на себя ответственность за объединение различных моделей, а затем создают усовершенствованную / более точную метамодель. Эта метамодель имеет сравнительно высокую точность прогнозирования по сравнению с соответствующими аналогами. Алгоритм AdaBoost подпадает под методы повышения ансамбля, поскольку он объединяет несколько моделей для получения более точных результатов, и это делается в два этапа: Несколько слабых учеников могут учиться на обучающих данных.Комбинируя эти модели для создания метамодели, эта метамодель направлена ​​на устранение ошибок, совершаемых отдельными слабыми учениками.AdaBoost — это сокращение от Adaptive Boosting, это очень популярный метод повышения, который объединяет несколько «слабых классификаторов» в один «сильный классификатор». 

Окончательная или комбинированная гипотеза H вычисляет знак взвешенной комбинации слабых гипотез.

          T

F(x)=∑α(t)*ht(x)

         t=1 

Это эквивалентно утверждению, что H вычисляется как взвешенное большинство голосов слабых гипотез ht, где каждой присваивается вес α(t). Так что да, итоговая возвращенная модель — это взвешенное голосование всех слабых учеников, обученных этой итерации. 

Хотя повышение не ограничено алгоритмически, большинство алгоритмов повышения состоят из итеративного изучения слабых классификаторов по отношению к распределению и добавления их к окончательному сильному классификатору. Когда они добавляются, они обычно взвешиваются, что обычно связано с точностью слабых учеников.Также обратите внимание на упоминание о том, что в исходных алгоритмах повышения использовалось «большинство». Понятие голосования довольно прочно встроено в бустинг: его руководящий принцип — улучшать ансамбль на каждой итерации, добавляя нового голосующего, а затем решая, какой вес придавать каждому голосу.

Алгоритм:

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

if (got required results): 

  Goto step End 

else: 

  Goto step Start 

End














































На приведенной выше диаграмме очень просто объясняется алгоритм AdaBoost. Давайте попробуем понять это поэтапно:
B1 состоит из 10 точек данных, которые состоят из двух типов, а именно плюс (+) и минус (-), и 5 из которых плюс (+), а остальные 5 минус (-), и каждому из них изначально был присвоен одинаковый вес. Первая модель пытается классифицировать точки данных и создает вертикальную разделительную линию, но ошибочно классифицирует 3 плюс (+) как минус (-).
B2 состоит из 10 точек данных из предыдущей модели, в которой 3 ошибочно классифицированных плюса (+) имеют больший вес, так что текущая модель больше пытается правильно классифицировать эти плюсы (+). Эта модель создает вертикальную разделительную линию, которая правильно классифицирует ранее неправильно классифицированные плюсы (+), но в этой попытке она неправильно классифицирует три минуса (-).
B3 состоит из 10 точек данных из предыдущей модели, в которой 3 ошибочно классифицированных минуса (-) имеют больший вес, так что текущая модель больше пытается правильно классифицировать эти минусы (-). Эта модель генерирует горизонтальную разделительную линию, которая правильно классифицирует ранее ошибочно классифицированные минусы (-).
B4 объединяет вместе B1, B2 и B3, чтобы построить надежную модель прогнозирования, которая намного лучше, чем любая отдельная используемая модель.

(.env) boris@boris-All-Series:~/ADABOOST$ cat AdaBoost.py
import pandas as pd
import numpy as np
from sklearn.model_selection import train_test_split
from sklearn.ensemble import AdaBoostClassifier
import warnings
warnings.filterwarnings("ignore")

data = pd.read_csv("Iris.csv")
# Printing the shape of the dataset
print(data.shape)
print(data.head())

X = data.iloc[:,:-1]
y = data.iloc[:,-1]
print("Shape of X is %s and shape of y is %s"%(X.shape,y.shape))
total_classes = y.nunique()
print("Number of unique species in dataset are: ",total_classes)

distribution = y.value_counts()
print(distribution)
X_train,X_val,Y_train,Y_val = train_test_split(X,y,test_size=0.25,random_state=28)

# Creating adaboost classifier model
adb = AdaBoostClassifier()
adb_model = adb.fit(X_train,Y_train)
print("The accuracy of the model on validation set is", adb_model.score(X_val,Y_val))

(.env) boris@boris-All-Series:~/ADABOOST$ python3 AdaBoost.py
(150, 5)
   sepal.length  sepal.width  petal.length  petal.width variety
0           5.1          3.5           1.4          0.2  Setosa
1           4.9          3.0           1.4          0.2  Setosa
2           4.7          3.2           1.3          0.2  Setosa
3           4.6          3.1           1.5          0.2  Setosa
4           5.0          3.6           1.4          0.2  Setosa
Shape of X is (150, 4) and shape of y is (150,)
Number of unique species in dataset are:  3
Setosa        50
Versicolor    50
Virginica     50
Name: variety, dtype: int64
The accuracy of the model on validation set is 0.9210526315789473





























Гиперпараметры AdaBoost
Исследуйте количество деревьев. Важным гиперпараметром алгоритма AdaBoost является количество деревьев решений, используемых в ансамбле.
Напомним, что каждое дерево решений, используемое в ансамбле, предназначено для слабого обучения. То есть у него есть навыки над случайным предсказанием, но он не очень искусен. Таким образом, используются одноуровневые деревья решений, называемые пнями решений.
Чтобы модель работала хорошо, количество деревьев, добавляемых в модель, должно быть большим, часто это сотни, если не тысячи. Количество деревьев можно установить с помощью аргумента «n_estimators», по умолчанию оно равно 50.В приведенном ниже примере исследуется влияние количества деревьев со значениями от 10 до 5000.
(.env) boris@boris-All-Series:~/ADABOOST$ cat AdaBoostHyper.py
# explore adaboost ensemble number of trees effect on performance
from numpy import mean
from numpy import std
from sklearn.datasets import make_classification
from sklearn.model_selection import cross_val_score
from sklearn.model_selection import RepeatedStratifiedKFold
from sklearn.ensemble import AdaBoostClassifier
from matplotlib import pyplot
 
# get the dataset
def get_dataset():
X, y = make_classification(n_samples=1000, n_features=20, n_informative=15, n_redundant=5, random_state=6)
return X, y
 
# get a list of models to evaluate
def get_models():
models = dict()
# define number of trees to consider
n_trees = [10, 50, 100, 500, 1000, 5000]
for n in n_trees:
models[str(n)] = AdaBoostClassifier(n_estimators=n)
return models
 
# evaluate a given model using cross-validation
def evaluate_model(model, X, y):
# define the evaluation procedure
cv = RepeatedStratifiedKFold(n_splits=10, n_repeats=3, random_state=1)
# evaluate the model and collect the results
scores = cross_val_score(model, X, y, scoring='accuracy', cv=cv, n_jobs=-1)
return scores
 
# define dataset
X, y = get_dataset()
# get the models to evaluate
models = get_models()
# evaluate the models and store results
results, names = list(), list()
for name, model in models.items():
# evaluate the model
scores = evaluate_model(model, X, y)
# store the results
results.append(scores)
names.append(name)
# summarize the performance along the way
print('>%s %.3f (%.3f)' % (name, mean(scores), std(scores)))
# plot model performance for comparison
pyplot.boxplot(results, labels=names, showmeans=True)
pyplot.show()





















Выполнение примера сначала сообщает о средней точности для каждого сконфигурированного количества деревьев решений.
В этом случае мы видим, что эта производительность улучшается в этом наборе данных примерно до 50 деревьев, а после этого снижается. Это может быть признаком того, что ансамбль переоснащает набор обучающих данных после добавления дополнительных деревьев.
===========================
Исследуйте слабого ученика
===========================
Дерево решений с одним уровнем используется в качестве слабого ученика по умолчанию. Мы можем сделать используемые в ансамбле модели менее слабыми (более искусными), увеличив глубину дерева решений.
В приведенном ниже примере исследуется влияние увеличения глубины слабого ученика DecisionTreeClassifier на ансамбль AdBoost.
(.env) boris@boris-All-Series:~/ADABOOST$ cat AdaBoostWeakLR.py
# explore adaboost ensemble tree depth effect on performance
from numpy import mean
from numpy import std
from sklearn.datasets import make_classification
from sklearn.model_selection import cross_val_score
from sklearn.model_selection import RepeatedStratifiedKFold
from sklearn.ensemble import AdaBoostClassifier
from sklearn.tree import DecisionTreeClassifier
from matplotlib import pyplot
 
# get the dataset
def get_dataset():
X, y = make_classification(n_samples=1000, n_features=20, n_informative=15, n_redundant=5, random_state=6)
return X, y
 
# get a list of models to evaluate
def get_models():
models = dict()
# explore depths from 1 to 10
for i in range(1,11):

# define base model
base = DecisionTreeClassifier(max_depth=i)
# define ensemble model
models[str(i)] = AdaBoostClassifier(base_estimator=base)

return models
 
# evaluate a given model using cross-validation
def evaluate_model(model, X, y):
# define the evaluation procedure
cv = RepeatedStratifiedKFold(n_splits=10, n_repeats=3, random_state=1)
# evaluate the model and collect the results
scores = cross_val_score(model, X, y, scoring='accuracy', cv=cv, n_jobs=-1)
return scores
 
# define dataset
X, y = get_dataset()
# get the models to evaluate
models = get_models()
# evaluate the models and store results
results, names = list(), list()
for name, model in models.items():
# evaluate the model
scores = evaluate_model(model, X, y)
# store the results
results.append(scores)
names.append(name)
# summarize the performance along the way
print('>%s %.3f (%.3f)' % (name, mean(scores), std(scores)))
# plot model performance for comparison
pyplot.boxplot(results, labels=names, showmeans=True)
pyplot.show()





















Диаграмма с прямоугольниками и усами создается для распределения оценок точности для каждой настроенной глубины слабого обучения

No comments:

Post a Comment