Aprender los conceptos clave

1

Todo lo que aprender谩s sobre MA con Scikit-Learn

2

驴C贸mo aprenden las m谩quinas?

3

Problemas que podemos resolver con Scikit-learn

4

Las matem谩ticas que vamos a necesitar

Iniciar un proyecto con sklearn

5

Configuraci贸n de nuestro entorno Python

6

Instalaci贸n de librer铆as en Python

7

Datasets que usaremos en el curso

Optimizaci贸n de features

8

驴C贸mo afectan nuestros features a los modelos de Machine Learning?

9

Introducci贸n al PCA

10

Preparaci贸n de datos para PCA e IPCA

11

Implementaci贸n del algoritmo PCA e IPCA

12

Kernels y KPCA

13

驴Qu茅 es la regularizaci贸n y c贸mo aplicarla?

14

Implementaci贸n de Lasso y Ridge

15

Explicaci贸n resultado de la implementaci贸n

16

ElasticNet: Una t茅cnica intermedia

Regresiones robustas

17

El problema de los valores at铆picos

18

Regresiones Robustas en Scikit-learn

19

Preparaci贸n de datos para la regresi贸n robusta

20

Implementaci贸n regresi贸n robusta

M茅todos de ensamble aplicados a clasificaci贸n

21

驴Qu茅 son los m茅todos de ensamble?

22

Preparaci贸n de datos para implementar m茅todos de ensamble

23

Implementaci贸n de Bagging

24

Implementaci贸n de Boosting

Clustering

25

Estrategias de Clustering

26

Implementaci贸n de Batch K-Means

27

Implementaci贸n de Mean-Shift

Optimizaci贸n param茅trica

28

Validaci贸n de nuestro modelo usando Cross Validation

29

Implementaci贸n de K-Folds Cross Validation

30

Optimizaci贸n param茅trica

31

Implementaci贸n de Randomized

32

Bonus: Auto Machine Learning

Salida a producci贸n

33

Revisi贸n de nuestra arquitectura de c贸digo

34

Importar y exportar modelos con Sklearn

35

Creaci贸n de una API con Flask para el modelo

36

Cierre del curso

37

Material adicional para consultar

ElasticNet: Una t茅cnica intermedia

16/37

Lectura

ElasticNet: Una t茅cnica intermedia:

Hasta el momento hemos podido ver dos t茅cnicas de regularizaci贸n en las cuales a帽adimos un componente de penalizaci贸n en el proceso donde encontramos los valores de los par谩metros 饾浗 minimizando la funci贸n de error.

...

Reg铆strate o inicia sesi贸n para leer el resto del contenido.

Aportes 14

Preguntas 2

Ordenar por:

驴Quieres ver m谩s aportes, preguntas y respuestas de la comunidad?

Al comparar con distintos valores de alpha, al parecer lo que nos indica es que es mejor idea usar Ridge que lasso.

   # elasticnet model
    
    def modelElastic(alpha=1):
        modelElastic= ElasticNet(random_state=0, alpha=alpha)
        modelElastic.fit(X_train, y_train)
        y_predic_elastic=modelElastic.predict(X_test)
        # loss function
        elastic_loss = mean_squared_error(y_test, y_predic_elastic)
        return elastic_loss

    alphas = np.arange(0,1,0.01)
    loss_total = []
    for i in alphas:
        res = modelElastic(i)
        loss_total.append(res)

    loss_total = np.array(loss_total)
    plt.plot(alphas, loss_total)
    plt.xlabel('alphas')
    plt.ylabel('Loss Elastic')
    plt.text(0.02, 0.8, 'loss min:{}'.format(np.min(loss_total)), fontsize=7)
    plt.show()

Me hubiese gustado entender el alcance del modelo desde el punto de vista pr谩ctico, es decir, c贸mo el modelo est谩 prediciendo la enfermedad y basado en qu茅 par谩metros, en la vida real. Ejecutar el algoritmo de manera mec谩nica ayuda a aprender el c贸digo y la sintaxis de las librer铆as, y conceptualmente se entiende que hace el modelo y que tan bueno es, pero no a ver la aplicaci贸n pr谩ctica. Es decir cuando ingreso algunos datos, que hace el modelo y qu茅 conclusiones sacar铆a qui茅n lo utilice para la vida pr谩ctica

Al agregar este algoritmo de regularizaci贸n al ejercicio anterior, vemos que tiene da por resultados que los otros dos y que lo que hizo fue lleva todos los coeficientes a cero.

Linear Loss:  9.11362706964361e-08
Lasso Loss:  0.04613142141272012
Ridge Loss:  0.005158990858509752
ElasticNet Loss:  1.1991244060565747
================================

Coef Linear:  [[1.00012822 0.99987164 0.9999141  1.00013558 0.9996458  1.00007078
  0.99987976]]
Coef Lasso:  [1.35269253 0.86910384 0.37857477 0.83535984 0.         0.22914234
 0.90887934]
Coef Ridge:  [[1.08843372 0.95300018 0.84338277 0.90422291 0.64360573 0.76090281
  0.96456701]]
Coef Elastic:  [0. 0. 0. 0. 0. 0. 0.]

A continuaci贸n les dejo el c贸digo:

import pandas as pd
import sklearn

from sklearn.linear_model import LinearRegression
from sklearn.linear_model import Lasso
from sklearn.linear_model import Ridge
from sklearn.linear_model import ElasticNet

from sklearn. model_selection import train_test_split
from sklearn.metrics import mean_squared_error


if __name__ == "__main__":
    dataset = pd.read_csv('./dataset/felicidad.csv')
    # print(dataset.describe())

    X = dataset[['gdp', 'family', 'lifexp', 'freedom',
                 'corruption', 'generosity', 'dystopia']]
    y = dataset[['score']]

    # print(X.shape)
    # print(y.shape)

    X_train, X_test, y_train, y_test = train_test_split(
        X, y, test_size=0.25, random_state=0)

    modelLinear = LinearRegression().fit(X_train, y_train)
    y_pred_linear = modelLinear.predict(X_test)

    modelLasso = Lasso(alpha=0.02).fit(X_train, y_train)
    y_pred_lasso = modelLasso.predict(X_test)

    modelRidge = Ridge(alpha=1).fit(X_train, y_train)
    y_pred_ridge = modelRidge.predict(X_test)

    modelElasticNet = ElasticNet(random_state=0).fit(X_train, y_train)
    y_pred_elastic = modelElasticNet.predict(X_test)

    linear_loss = mean_squared_error(y_test, y_pred_linear)
    print('Linear Loss: ', linear_loss)

    lasso_loss = mean_squared_error(y_test, y_pred_lasso)
    print('Lasso Loss: ', lasso_loss)

    ridge_loss = mean_squared_error(y_test, y_pred_ridge)
    print('Ridge Loss: ', ridge_loss)

    elastic_loss = mean_squared_error(y_test, y_pred_elastic)
    print('ElasticNet Loss: ', elastic_loss)

    print('='*32, '\n')
    print("Coef Linear: ", modelLinear.coef_)
    print("Coef Lasso: ", modelLasso.coef_)
    print("Coef Ridge: ", modelRidge.coef_)
    print("Coef Elastic: ", modelElasticNet.coef_)```

Probando el modelo ElasticNet obtuve estos scores:

Loss Modelo Lineal: 9.113627069637195e-08
Loss Modelo Lasso: 0.04613142141272011
Loss Modelo Ridge: 0.005158990858509747
Loss Modelo ElasticNet: 1.1991244060565747

Una forma de comparar el error cuadr谩tico medio variando el par谩metro alpha para los 4 modelos distintos, puede ser la siguiente:

# Importamos las bibliotecas
import pandas as pd
import numpy as np
import sklearn

# Importamos los modelos de sklearn 
from sklearn.linear_model import LinearRegression, Lasso, Ridge, ElasticNet

# Importamos las metricas de entrenamiento y el error medio cuadrado
from sklearn.model_selection import train_test_split
from sklearn.metrics import mean_squared_error
    
mse_lineal = []
mse_lasso = []
mse_ridge = []
mse_ElasticNet = []

dataset = pd.read_csv('data/felicidad.csv')
X = dataset[['gdp', 'family', 'lifexp', 'freedom' , 'corruption' , 'generosity', 'dystopia']]
y = dataset[['score']]
X_train, X_test, y_train, y_test = train_test_split(X,y, test_size=0.25, random_state=42)

# Lineal
modelLinear = LinearRegression().fit(X_train, y_train)
y_predict_linear = modelLinear.predict(X_test)
alphas = np.linspace(0.01,1,50)

for alpha in alphas:

    modelLasso = Lasso(alpha=alpha).fit(X_train, y_train)
    y_predict_lasso = modelLasso.predict(X_test)

    modelRidge = Ridge(alpha=alpha).fit(X_train, y_train)
    y_predict_ridge = modelRidge.predict(X_test)

    modelElasticNet = ElasticNet(random_state=0, alpha=alpha).fit(X_train, y_train)
    y_predict_ElasticNet = modelElasticNet.predict(X_test)
 
    mse_lineal.append(mean_squared_error(y_test, y_predict_linear))
    mse_lasso.append(mean_squared_error(y_test, y_predict_lasso))
    mse_ridge.append(mean_squared_error(y_test, y_predict_ridge))
    mse_ElasticNet.append(mean_squared_error(y_test, y_predict_ElasticNet))

plt.plot(alphas, mse_lineal)
plt.plot(alphas, mse_lasso)
plt.plot(alphas, mse_ridge)
plt.plot(alphas, mse_ElasticNet)

plt.legend(["Linear", "Lasso", "Ridge", "ElasticNet"])
plt.title('MSE')
plt.xlabel(r'$\alpha$')
plt.ylabel('Accuracy')
plt.axis
plt.show()

Agregen esto: intenta con un alpha bajo.
ElasticNet(random_state=0, alpha = 0.02)

from sklearn.linear_model import ElasticNet

modelElasticNet = ElasticNet(random_state=0, alpha=0.02).fit(X_train, y_train)
y_pred_elastic = modelElasticNet.predict(X_test)

elastic_loss = mean_squared_error(y_test, y_pred_elastic)
print('ElasticNet Loss: ', elastic_loss)
import matplotlib.pyplot as plt
import numpy as np


residuals_l = np.subtract(y_test, y_predict_linear)
residuals_r = np.subtract(y_test, y_predict_ridge)
residuals_ls = np.subtract(y_test, y_predict_lasso.reshape((-1, 1)))
residuals_el = np.subtract(y_test, y_pred_elastic.reshape((-1, 1)))
plt.scatter(y_predict_linear, residuals_l,label='Linear Regression')
plt.scatter(y_predict_ridge, residuals_r,label='Ridge Regression')
plt.scatter(y_predict_lasso, residuals_ls,label='Lasso Regression')
plt.scatter(y_pred_elastic, residuals_el,label='ElasticNet')
plt.legend(frameon=True, fancybox=True, shadow=True, borderpad=1, loc='upper left')


plt.axhline(y=0, color='r', linestyle='--')  # Agregar la l铆nea en el valor cero
plt.show()
Este es mi modelo cuando le puse un alpha = 1 ````txt 鉂 python elastic_net.py /root/scikitlearnPro/elastic_net.py:2: DeprecationWarning: Pyarrow will become a required dependency of pandas in the next major release of pandas (pandas 3.0), (to allow more performant data types, such as the Arrow string type, and better interoperability with other libraries) but was not found to be installed on your system. If this would cause problems for you, please provide us feedback at https://github.com/pandas-dev/pandas/issues/54466 import pandas as pd rank score high low ... freedom generosity corruption dystopia count 155.000000 155.000000 155.000000 155.000000 ... 155.000000 155.000000 155.000000 155.000000 mean 78.000000 5.354019 5.452326 5.255713 ... 0.408786 0.246883 0.123120 1.850238 std 44.888751 1.131230 1.118542 1.145030 ... 0.149997 0.134780 0.101661 0.500028 min 1.000000 2.693000 2.864884 2.521116 ... 0.000000 0.000000 0.000000 0.377914 25% 39.500000 4.505500 4.608172 4.374955 ... 0.303677 0.154106 0.057271 1.591291 50% 78.000000 5.279000 5.370032 5.193152 ... 0.437454 0.231538 0.089848 1.832910 75% 116.500000 6.101500 6.194600 6.006527 ... 0.516561 0.323762 0.153296 2.144654 max 155.000000 7.537000 7.622030 7.479556 ... 0.658249 0.838075 0.464308 3.117485 [8 rows x 11 columns] (155, 7) (155, 1) Linear: 8.349947304787681e-08 Elastic Net: 1.4916349037786831 ================================ Coef Linear [[1.00014406 0.99996072 0.99988617 1.00005009 0.99966092 1.0000819 0.9999592 ]] ================================ Coef Elastic [0. 0. 0. 0. 0. 0. 0.] ```鉂 python elastic\_net.py /root/scikitlearnPro/elastic\_net.py:2: DeprecationWarning: Pyarrow will become a required dependency of pandas in the next major release of pandas (pandas 3.0), (to allow more performant data types, such as the Arrow string type, and better interoperability with other libraries) but was not found to be installed on your system. If this would cause problems for you, please provide us feedback at <https://github.com/pandas-dev/pandas/issues/54466> import pandas as pd rank score high low ... freedom generosity corruption dystopia count 155.000000 155.000000 155.000000 155.000000 ... 155.000000 155.000000 155.000000 155.000000 mean 78.000000 5.354019 5.452326 5.255713 ... 0.408786 0.246883 0.123120 1.850238 std 44.888751 1.131230 1.118542 1.145030 ... 0.149997 0.134780 0.101661 0.500028 min 1.000000 2.693000 2.864884 2.521116 ... 0.000000 0.000000 0.000000 0.377914 25% 39.500000 4.505500 4.608172 4.374955 ... 0.303677 0.154106 0.057271 1.591291 50% 78.000000 5.279000 5.370032 5.193152 ... 0.437454 0.231538 0.089848 1.832910 75% 116.500000 6.101500 6.194600 6.006527 ... 0.516561 0.323762 0.153296 2.144654 max 155.000000 7.537000 7.622030 7.479556 ... 0.658249 0.838075 0.464308 3.117485 \[8 rows x 11 columns] (155, 7) (155, 1) Linear: 8.349947304787681e-08 Elastic Net: 1.4916349037786831 \================================ Coef Linear \[\[1.00014406 0.99996072 0.99988617 1.00005009 0.99966092 1.0000819 0.9999592 ]] \================================ Coef Elastic \[0. 0. 0. 0. 0. 0. 0.] ```` Y aqui cuando lo mande con un alpha = 0 ```txt 鉂 python elastic_net.py /root/scikitlearnPro/elastic_net.py:2: DeprecationWarning: Pyarrow will become a required dependency of pandas in the next major release of pandas (pandas 3.0), (to allow more performant data types, such as the Arrow string type, and better interoperability with other libraries) but was not found to be installed on your system. If this would cause problems for you, please provide us feedback at https://github.com/pandas-dev/pandas/issues/54466 import pandas as pd rank score high low ... freedom generosity corruption dystopia count 155.000000 155.000000 155.000000 155.000000 ... 155.000000 155.000000 155.000000 155.000000 mean 78.000000 5.354019 5.452326 5.255713 ... 0.408786 0.246883 0.123120 1.850238 std 44.888751 1.131230 1.118542 1.145030 ... 0.149997 0.134780 0.101661 0.500028 min 1.000000 2.693000 2.864884 2.521116 ... 0.000000 0.000000 0.000000 0.377914 25% 39.500000 4.505500 4.608172 4.374955 ... 0.303677 0.154106 0.057271 1.591291 50% 78.000000 5.279000 5.370032 5.193152 ... 0.437454 0.231538 0.089848 1.832910 75% 116.500000 6.101500 6.194600 6.006527 ... 0.516561 0.323762 0.153296 2.144654 max 155.000000 7.537000 7.622030 7.479556 ... 0.658249 0.838075 0.464308 3.117485 [8 rows x 11 columns] (155, 7) (155, 1) /root/miniforge3/envs/scikitlearnPro/lib/python3.12/site-packages/sklearn/base.py:1351: UserWarning: With alpha=0, this algorithm does not converge well. You are advised to use the LinearRegression estimator return fit_method(estimator, *args, **kwargs) /root/miniforge3/envs/scikitlearnPro/lib/python3.12/site-packages/sklearn/linear_model/_coordinate_descent.py:678: UserWarning: Coordinate descent with no regularization may lead to unexpected results and is discouraged. model = cd_fast.enet_coordinate_descent( Linear: 9.298974919237338e-08 Elastic Net: 9.256987412040729e-08 ================================ Coef Linear [[1.00003374 0.99993444 1.0000665 1.00010215 0.99952352 1.00027709 0.99998163]] ================================ Coef Elastic [1.00015248 0.9999915 0.999874 1.0000184 0.99948386 1.0003127 0.99998826] ```Segun lo entendi en las clases mientras el score mas se acerque a uno (siendo score nuestra variable de seguimiento) mas preciso va a ser nuestro modelo, por lo que podemos detectar que los datos se comportan mucho mejor con un modelo de Regresion "Ridge" Aqui les dejo el codigo, se aceptan correcciones ```python # Importamos las bibliotecas generales import pandas as pd import sklearn import matplotlib.pyplot as plt # Importamos los m贸dulos espec铆ficos from sklearn.linear_model import LinearRegression from sklearn.linear_model import ElasticNet from sklearn.model_selection import train_test_split from sklearn.metrics import mean_squared_error if __name__ == "__main__": dataset = pd.read_csv('./data/felicidad.csv') print(dataset.describe()) X = dataset[['gdp', 'family', 'lifexp', 'freedom' , 'corruption' , 'generosity', 'dystopia']] y = dataset[['score']] print(X.shape) print(y.shape) X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.25) modelLinear = LinearRegression().fit(X_train, y_train) y_predict_linear = modelLinear.predict(X_test) regr = ElasticNet(random_state=0, alpha=0) #alpha = 0 = Ridge, alpha = 1 = Lasso regr.fit(X_train, y_train) y_predict_linear = modelLinear.predict(X_test) y_predict_elastic = regr.predict(X_test) linearLoss = mean_squared_error(y_test, y_predict_linear) elasticnetLoss = mean_squared_error(y_test, y_predict_elastic) print('Linear: ', linearLoss) print("Elastic Net: ", elasticnetLoss) print('='*32) print("Coef Linear") print(modelLinear.coef_) print('='*32) print("Coef Elastic") print(regr.coef_) ```
Victoria de ElasticNet ![](https://static.platzi.com/media/user_upload/image-edc1b284-07d7-4cfc-863f-ce64ca48f768.jpg) ```js model_elasticnet = ElasticNet(random_state=0, alpha=0.005).fit(x_train, y_train) ```model\_elasticnet = ElasticNet(random\_state=0, alpha=0.005).fit(x\_train, y\_train)

Implementaci贸n de ElasticNet con Scikit-learn:

  • Indica c贸mo importa la clase ElasticNetdel m贸dulo linear_modelde Scikit-learn.
  • Muestra c贸mo inicializar y entrenar un modelo ElasticNet con ElasticNet()y fit().

Resumiendo en pocas palabras, el texto de la clase nos da una explicaci贸n detallada de c贸mo funciona la regularizaci贸n, especialmente enfoc谩ndose en ElasticNet. Tambi茅n proporciona una idea clara de cu谩ndo y por qu茅 podr铆amos preferir ElasticNet en comparaci贸n con

Resultados de trabajar con ElasticNet

ElasticNet Loss: 0.006499475630064783
Lasso Loss: 0.010312766264690335
Ridge Loss: 0.029278438946391875

Un humilde consejo, intenten probar los accuracy de cada uno.
En el caso de Elastic Net y utilizando el r2_score da un accuracy negativo. Esto se puede solucionar dandole un valor de aplha muy peque帽o, con lo cual logramos que se aproxime a los que conseguimos Linear Regression que tuvo el mejor accuracy y menos perdida.
Ejemplo de calculo de precision:

y_predict_elastic_net = model_elastic_net.predict(X_test)
elastic_net_loss = mean_squared_error(y_test, y_predict_elastic_net)
elastic_net_accuracy = r2_score(y_test, y_predict_elastic_net)
print(f'Elastic Net loss: {elastic_net_loss}, accuracy: {(elastic_net_accuracy*100).round(4)}% and coef: {model_elastic_net.coef_}')

Al mio no le gusto ni una columna ajajaj.

En este caso, las variables fueron escogidas a mano por lo que tiene sentido que est茅n altamente correlacionadas con la resoluci贸n del problema y por lo tanto una soluci贸n Ridge o una ElasticNet con un coeficiente cercano a 0 den buenos resultados. Sin embargo, en este caso en particular no parece haber overfitting de la predicci贸n usando simplemente una regresi贸n lineal ya que es la que obtuvo el mejor resultados de MSE

Siempre que tengan dudas, investigar directamente en la fuente, que ser铆a https://scikit-learn.org/stable/modules/generated/sklearn.linear_model.ElasticNet.html.

Resulta que lo que la informaci贸n de esta clase est谩 totalmente equivocada (Lo cual considero bastante mediocre e irresponsable de parte de una plataforma educativa). Uno puede ir variando de Lasso a Ridge cambiando el par谩metro l1_ratio (donde l1_ratio=1 se refiere a un modelo full Lasso y l1_ratio=0 es un modelo full Ridge. Ojo que en la documentaci贸n dice que usar l1_ratio<0.01 no es confiable) .

Si est谩n interesados en controlar especificamente la proporci贸n de L1 y L2, se hace con las siguientes expresiones:

La p茅rdida es mucho mayor y el score me da negativo, a alguien m谩s le ocurri贸?