Scikit Learn - Métodos de Boosting

Neste capítulo, aprenderemos sobre os métodos de reforço no Sklearn, que permitem construir um modelo de conjunto.

Os métodos de reforço constroem o modelo de conjunto de forma incremental. O princípio principal é construir o modelo de forma incremental, treinando cada estimador de modelo de base sequencialmente. Para construir um conjunto poderoso, esses métodos combinam basicamente vários alunos semanais que são treinados sequencialmente em várias iterações de dados de treinamento. O módulo sklearn.ensemble segue dois métodos de reforço.

AdaBoost

É um dos métodos de conjunto de boosting de maior sucesso, cuja chave principal está na maneira como eles atribuem pesos às instâncias no dataset. É por isso que o algoritmo precisa prestar menos atenção às instâncias ao construir modelos subsequentes.

Classificação com AdaBoost

Para criar um classificador AdaBoost, o módulo Scikit-learn fornece sklearn.ensemble.AdaBoostClassifier. Ao construir este classificador, o parâmetro principal que este módulo usa ébase_estimator. Aqui, base_estimator é o valor dobase estimatora partir do qual o conjunto amplificado é construído. Se escolhermos o valor deste parâmetro para nenhum, então, o estimador de base seriaDecisionTreeClassifier(max_depth=1).

Exemplo de implementação

No exemplo a seguir, estamos construindo um classificador AdaBoost usando sklearn.ensemble.AdaBoostClassifier e também prever e verificar sua pontuação.

from sklearn.ensemble import AdaBoostClassifier
from sklearn.datasets import make_classification
X, y = make_classification(n_samples = 1000, n_features = 10,n_informative = 2, n_redundant = 0,random_state = 0, shuffle = False)
ADBclf = AdaBoostClassifier(n_estimators = 100, random_state = 0)
ADBclf.fit(X, y)

Resultado

AdaBoostClassifier(algorithm = 'SAMME.R', base_estimator = None,
learning_rate = 1.0, n_estimators = 100, random_state = 0)

Exemplo

Uma vez ajustados, podemos prever para novos valores da seguinte forma -

print(ADBclf.predict([[0, 2, 3, 0, 1, 1, 1, 1, 2, 2]]))

Resultado

[1]

Exemplo

Agora podemos verificar a pontuação da seguinte forma -

ADBclf.score(X, y)

Resultado

0.995

Exemplo

Também podemos usar o conjunto de dados sklearn para construir o classificador usando o método Extra-Tree. Por exemplo, em um exemplo dado abaixo, estamos usando o conjunto de dados Pima-Indian.

from pandas import read_csv
from sklearn.model_selection import KFold
from sklearn.model_selection import cross_val_score
from sklearn.ensemble import AdaBoostClassifier
path = r"C:\pima-indians-diabetes.csv"
headernames = ['preg', 'plas', 'pres', 'skin', 'test', 'mass', 'pedi', 'age', 'class']
data = read_csv(path, names = headernames)
array = data.values
X = array[:,0:8]
Y = array[:,8]
seed = 5
kfold = KFold(n_splits = 10, random_state = seed)
num_trees = 100
max_features = 5
ADBclf = AdaBoostClassifier(n_estimators = num_trees, max_features = max_features)
results = cross_val_score(ADBclf, X, Y, cv = kfold)
print(results.mean())

Resultado

0.7851435406698566

Regressão com AdaBoost

Para criar um regressor com o método Ada Boost, a biblioteca Scikit-learn fornece sklearn.ensemble.AdaBoostRegressor. Ao construir o regressor, ele usará os mesmos parâmetros usados ​​porsklearn.ensemble.AdaBoostClassifier.

Exemplo de implementação

No exemplo a seguir, estamos construindo um regressor AdaBoost usando sklearn.ensemble.AdaBoostregressor e também prever para novos valores usando o método predict ().

from sklearn.ensemble import AdaBoostRegressor
from sklearn.datasets import make_regression
X, y = make_regression(n_features = 10, n_informative = 2,random_state = 0, shuffle = False)
ADBregr = RandomForestRegressor(random_state = 0,n_estimators = 100)
ADBregr.fit(X, y)

Resultado

AdaBoostRegressor(base_estimator = None, learning_rate = 1.0, loss = 'linear',
n_estimators = 100, random_state = 0)

Exemplo

Uma vez ajustados, podemos prever a partir do modelo de regressão da seguinte forma -

print(ADBregr.predict([[0, 2, 3, 0, 1, 1, 1, 1, 2, 2]]))

Resultado

[85.50955817]

Gradient Tree Boosting

Também é chamado Gradient Boosted Regression Trees(GRBT). É basicamente uma generalização do impulso para funções de perda diferenciáveis ​​arbitrárias. Ele produz um modelo de previsão na forma de um conjunto de modelos de previsão da semana. Pode ser usado para problemas de regressão e classificação. Sua principal vantagem reside no fato de que eles lidam naturalmente com os dados de tipo misto.

Classificação com Gradient Tree Boost

Para criar um classificador Gradient Tree Boost, o módulo Scikit-learn fornece sklearn.ensemble.GradientBoostingClassifier. Ao construir este classificador, o parâmetro principal que este módulo usa é 'perda'. Aqui, 'perda' é o valor da função de perda a ser otimizado. Se escolhermos perda = desvio, ele se refere ao desvio para classificação com resultados probabilísticos.

Por outro lado, se escolhermos o valor deste parâmetro para exponencial, ele recupera o algoritmo AdaBoost. O parâmetron_estimatorscontrolará o número de alunos semanais. Um hiperparâmetro chamadolearning_rate (na faixa de (0,0, 1,0]) controlará o sobreajuste via encolhimento.

Exemplo de implementação

No exemplo a seguir, estamos construindo um classificador Gradient Boosting usando sklearn.ensemble.GradientBoostingClassifier. Estamos equipando este classificador com alunos de 50 semanas.

from sklearn.datasets import make_hastie_10_2
from sklearn.ensemble import GradientBoostingClassifier
X, y = make_hastie_10_2(random_state = 0)
X_train, X_test = X[:5000], X[5000:]
y_train, y_test = y[:5000], y[5000:]

GDBclf = GradientBoostingClassifier(n_estimators = 50, learning_rate = 1.0,max_depth = 1, random_state = 0).fit(X_train, y_train)
GDBclf.score(X_test, y_test)

Resultado

0.8724285714285714

Exemplo

Também podemos usar o conjunto de dados sklearn para construir o classificador usando o Gradient Boosting Classifier. Como no exemplo a seguir, estamos usando o conjunto de dados Pima-Indian.

from pandas import read_csv
from sklearn.model_selection import KFold
from sklearn.model_selection import cross_val_score
from sklearn.ensemble import GradientBoostingClassifier
path = r"C:\pima-indians-diabetes.csv"
headernames = ['preg', 'plas', 'pres', 'skin', 'test', 'mass', 'pedi', 'age', 'class']
data = read_csv(path, names = headernames)
array = data.values
X = array[:,0:8]
Y = array[:,8]
seed = 5
kfold = KFold(n_splits = 10, random_state = seed)
num_trees = 100
max_features = 5
ADBclf = GradientBoostingClassifier(n_estimators = num_trees, max_features = max_features)
results = cross_val_score(ADBclf, X, Y, cv = kfold)
print(results.mean())

Resultado

0.7946582356674234

Regressão com Gradient Tree Boost

Para criar um regressor com o método Gradient Tree Boost, a biblioteca Scikit-learn fornece sklearn.ensemble.GradientBoostingRegressor. Ele pode especificar a função de perda para regressão por meio da perda do nome do parâmetro. O valor padrão para perda é 'ls'.

Exemplo de implementação

No exemplo a seguir, estamos construindo um regressor Gradient Boosting usando sklearn.ensemble.GradientBoostingregressor e também encontrar o erro quadrático médio usando o método mean_squared_error ().

import numpy as np
from sklearn.metrics import mean_squared_error
from sklearn.datasets import make_friedman1
from sklearn.ensemble import GradientBoostingRegressor
X, y = make_friedman1(n_samples = 2000, random_state = 0, noise = 1.0)
X_train, X_test = X[:1000], X[1000:]
y_train, y_test = y[:1000], y[1000:]
GDBreg = GradientBoostingRegressor(n_estimators = 80, learning_rate=0.1,
max_depth = 1, random_state = 0, loss = 'ls').fit(X_train, y_train)

Uma vez ajustado, podemos encontrar o erro quadrático médio da seguinte forma -

mean_squared_error(y_test, GDBreg.predict(X_test))

Resultado

5.391246106657164