Introducció

Ensemble Learning és una tècnica de Machine Learning que combina múltiples models per millorar la precisió i robustesa de les prediccions. La idea darrere de l'Ensemble Learning és que un conjunt de models, treballant junts, pot superar el rendiment d'un sol model.

Tipus d'Ensemble Learning

Hi ha diversos mètodes d'Ensemble Learning, però els més comuns són:

  1. Bagging (Bootstrap Aggregating)
  2. Boosting
  3. Stacking

Bagging (Bootstrap Aggregating)

Bagging és una tècnica que millora la precisió del model reduint la variància. Això es fa creant múltiples subconjunts de dades a partir del conjunt de dades original, amb reemplaçament, i entrenant un model separat en cada subconjunt. Les prediccions finals es fan mitjançant la mitjana (per a regressió) o la votació majoritària (per a classificació) de les prediccions de tots els models.

Exemple de Bagging amb Scikit-Learn

from sklearn.ensemble import BaggingClassifier
from sklearn.tree import DecisionTreeClassifier
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score

# Carregar el conjunt de dades
iris = load_iris()
X, y = iris.data, iris.target

# Dividir el conjunt de dades en entrenament i prova
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)

# Crear el model base
base_model = DecisionTreeClassifier()

# Crear el model de Bagging
bagging_model = BaggingClassifier(base_model, n_estimators=50, random_state=42)

# Entrenar el model
bagging_model.fit(X_train, y_train)

# Fer prediccions
y_pred = bagging_model.predict(X_test)

# Avaluar el model
accuracy = accuracy_score(y_test, y_pred)
print(f'Accuracy: {accuracy:.2f}')

Boosting

Boosting és una tècnica que millora la precisió del model reduint el biaix. Això es fa entrenant models seqüencialment, on cada model intenta corregir els errors del model anterior. Els models més comuns de Boosting són AdaBoost, Gradient Boosting i XGBoost.

Exemple de AdaBoost amb Scikit-Learn

from sklearn.ensemble import AdaBoostClassifier
from sklearn.tree import DecisionTreeClassifier
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score

# Carregar el conjunt de dades
iris = load_iris()
X, y = iris.data, iris.target

# Dividir el conjunt de dades en entrenament i prova
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)

# Crear el model base
base_model = DecisionTreeClassifier(max_depth=1)

# Crear el model de AdaBoost
adaboost_model = AdaBoostClassifier(base_model, n_estimators=50, random_state=42)

# Entrenar el model
adaboost_model.fit(X_train, y_train)

# Fer prediccions
y_pred = adaboost_model.predict(X_test)

# Avaluar el model
accuracy = accuracy_score(y_test, y_pred)
print(f'Accuracy: {accuracy:.2f}')

Stacking

Stacking és una tècnica que combina múltiples models utilitzant un model meta-aprenentatge. Els models base fan prediccions, i aquestes prediccions es converteixen en les característiques d'entrada per al model meta-aprenentatge, que fa la predicció final.

Exemple de Stacking amb Scikit-Learn

from sklearn.ensemble import StackingClassifier
from sklearn.linear_model import LogisticRegression
from sklearn.tree import DecisionTreeClassifier
from sklearn.svm import SVC
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score

# Carregar el conjunt de dades
iris = load_iris()
X, y = iris.data, iris.target

# Dividir el conjunt de dades en entrenament i prova
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)

# Crear els models base
base_models = [
    ('decision_tree', DecisionTreeClassifier()),
    ('svm', SVC(probability=True))
]

# Crear el model meta-aprenentatge
meta_model = LogisticRegression()

# Crear el model de Stacking
stacking_model = StackingClassifier(estimators=base_models, final_estimator=meta_model)

# Entrenar el model
stacking_model.fit(X_train, y_train)

# Fer prediccions
y_pred = stacking_model.predict(X_test)

# Avaluar el model
accuracy = accuracy_score(y_test, y_pred)
print(f'Accuracy: {accuracy:.2f}')

Avantatges i Desavantatges de l'Ensemble Learning

Avantatges

  1. Millora de la Precisió: Els models d'ensemble sovint tenen una precisió més alta que els models individuals.
  2. Reducció de la Variància: Bagging ajuda a reduir la variància dels models.
  3. Reducció del Biaix: Boosting ajuda a reduir el biaix dels models.
  4. Robustesa: Els models d'ensemble són més robustos davant dades sorolloses i outliers.

Desavantatges

  1. Complexitat: Els models d'ensemble són més complexos i difícils d'interpretar.
  2. Temps de Càlcul: Entrenar múltiples models pot ser computacionalment costós.
  3. Risc d'Overfitting: Si no es controla adequadament, els models d'ensemble poden sobreajustar-se a les dades d'entrenament.

Exercici Pràctic

Exercici

  1. Carrega el conjunt de dades breast_cancer de Scikit-Learn.
  2. Divideix el conjunt de dades en entrenament i prova.
  3. Implementa un model de Bagging utilitzant RandomForestClassifier com a model base.
  4. Implementa un model de Boosting utilitzant GradientBoostingClassifier.
  5. Implementa un model de Stacking utilitzant RandomForestClassifier i GradientBoostingClassifier com a models base, i LogisticRegression com a model meta-aprenentatge.
  6. Compara les precisions dels tres models.

Solució

from sklearn.ensemble import BaggingClassifier, GradientBoostingClassifier, StackingClassifier
from sklearn.ensemble import RandomForestClassifier
from sklearn.linear_model import LogisticRegression
from sklearn.datasets import load_breast_cancer
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score

# Carregar el conjunt de dades
cancer = load_breast_cancer()
X, y = cancer.data, cancer.target

# Dividir el conjunt de dades en entrenament i prova
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)

# Model de Bagging
bagging_model = BaggingClassifier(RandomForestClassifier(), n_estimators=50, random_state=42)
bagging_model.fit(X_train, y_train)
y_pred_bagging = bagging_model.predict(X_test)
accuracy_bagging = accuracy_score(y_test, y_pred_bagging)

# Model de Boosting
boosting_model = GradientBoostingClassifier(n_estimators=50, random_state=42)
boosting_model.fit(X_train, y_train)
y_pred_boosting = boosting_model.predict(X_test)
accuracy_boosting = accuracy_score(y_test, y_pred_boosting)

# Model de Stacking
base_models = [
    ('random_forest', RandomForestClassifier()),
    ('gradient_boosting', GradientBoostingClassifier())
]
meta_model = LogisticRegression()
stacking_model = StackingClassifier(estimators=base_models, final_estimator=meta_model)
stacking_model.fit(X_train, y_train)
y_pred_stacking = stacking_model.predict(X_test)
accuracy_stacking = accuracy_score(y_test, y_pred_stacking)

# Resultats
print(f'Accuracy Bagging: {accuracy_bagging:.2f}')
print(f'Accuracy Boosting: {accuracy_boosting:.2f}')
print(f'Accuracy Stacking: {accuracy_stacking:.2f}')

Conclusió

Ensemble Learning és una tècnica poderosa que combina múltiples models per millorar la precisió i robustesa de les prediccions. Tot i que pot ser més complex i computacionalment costós, els beneficis en termes de precisió i robustesa sovint justifiquen el seu ús. En aquest mòdul, hem explorat tres mètodes principals d'Ensemble Learning: Bagging, Boosting i Stacking, i hem vist com implementar-los utilitzant Scikit-Learn.

Curs de Machine Learning

Mòdul 1: Introducció al Machine Learning

Mòdul 2: Fonaments d'Estadística i Probabilitat

Mòdul 3: Preprocessament de Dades

Mòdul 4: Algoritmes de Machine Learning Supervisat

Mòdul 5: Algoritmes de Machine Learning No Supervisat

Mòdul 6: Avaluació i Validació de Models

Mòdul 7: Tècniques Avançades i Optimització

Mòdul 8: Implementació i Desplegament de Models

Mòdul 9: Projectes Pràctics

Mòdul 10: Recursos Addicionals

© Copyright 2024. Tots els drets reservats