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

No tienes acceso a esta clase

隆Contin煤a aprendiendo! 脷nete y comienza a potenciar tu carrera

Implementaci贸n de Randomized

31/37
Recursos

Aportes 27

Preguntas 5

Ordenar por:

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

Hice algunas actualizaciones porque las funciones en la llave 鈥渃riterion鈥 est谩n descontinuadas, as铆 que el c贸digo queda de esta manera:

import pandas as pd

from sklearn.model_selection import RandomizedSearchCV
from sklearn.ensemble import RandomForestRegressor

if __name__ == "__main__":

    dataset = pd.read_csv('./data/felicidad.csv')

    print(dataset)

    X = dataset.drop(['country', 'rank', 'score'], axis=1)
    y = dataset[['score']].squeeze()

    reg = RandomForestRegressor()

    parametros = {
        'n_estimators' : range(4,16),
        'criterion' : ['squared_error', 'absolute_error'],
        'max_depth' : range(2,11)
    }

    rand_est = RandomizedSearchCV(reg, parametros , n_iter=10, cv=3, scoring='neg_mean_absolute_error').fit(X,y)

    print(rand_est.best_estimator_)
    print(rand_est.best_params_)
    print(rand_est.predict(X.loc[[0]]))

Impresionante! Esto ahorra mucho tiempo y con muy buena precisi贸n.
Y s铆, el profe se equivoc贸 de n煤mero al final. En realidad era el siguiente de la izquierda.

Con respecto a la raz贸n de eliminar el rank y el score, se hace porque generalmente lo que se quiere es que las features no tengan ninguna correlaci贸n entre ellas. Lo ideal es que exista correlaci贸n solo entre las features y la variable objetivo 馃槂

Dos cosas que ha prendido al momento y que hubiera deseado aprender hace unos a帽os.

  • Siempre testear, probar nuevas cosas y mas con esta forma, ya se me quit贸 la pereza.

  • Todos los modelos son malos, solo que se busca el mejor. as铆 que con esto se quiere siempre buscar el mejor, Obvio siempre llevare este curso en mi coraz贸n porque en verdad he aprendido tanto

En realidad el score del primer pais no es el se帽alado en el video, ya que si se presta atencion al conteo de columnas y valores, se viendo el valor de high
Para saber el score en ese punto simplemente podemos imprimir el valor de y en esa misma posicion

y_hat = randomized.predict(x.loc[[0]])

print('Predict: {:.4}'.format(y_hat[0]))
print('Real:    {:.4}'.format(y[0]))
Predict: 7.507
Real:    7.537

C贸digo corregido para evitar warnings and deprecated :

Cambiaron 鈥榤se鈥 y 鈥榤ae鈥 respectivamente

    parametros = {
        'n_estimators' : range(4,16),
        'criterion' : ['squared_error', 'absolute_error'],
        'max_depth' : range(2,11)
    }# definici贸n de par谩metros que vamos a revisar

Algunos par谩metros del c贸digo de la clase fueron actualizados posteriormente y estaban generando un error y warnings en Visual Studio Code. Ajust茅 los cambios con los par谩metros actualizados a hoy (27 de julio de 2023). Espero que a alguien le sirva.

import pandas as pd

from sklearn.model_selection import RandomizedSearchCV
from sklearn.ensemble import RandomForestRegressor

if __name__ == "__main__":

    dataset = pd.read_csv('./data/felicidad.csv')

    print(dataset)

    X = dataset.drop(['country', 'rank', 'score'], axis=1)
    y = dataset['score'].values.ravel()

    reg = RandomForestRegressor()

    parametros = {
        'n_estimators' : range(4,16),
        'criterion' : ['squared_error', 'absolute_error'],
        'max_depth' : range(2,11)
    }

    rand_est = RandomizedSearchCV(reg, parametros , n_iter=10, cv=3, scoring='neg_mean_absolute_error').fit(X,y)

    print(rand_est.best_estimator_)
    print(rand_est.best_params_)
    print(rand_est.predict(X.loc[[0]]))

    #implmentacion_randomizedSearchCV

utilizando python 3.9 solo cuando cambi茅 la forma de los datos objetivo quitando un par de corchetes pude correrlo adecuadamente (y=dataset[鈥渟core鈥漖)

Parametros de GridSearchCV

estimator: el modelo que est谩 utilizando.
params_grid: el objeto de diccionario que contiene los hiperpar谩metros que desea probar.
scoring: m茅trica de evaluaci贸n
cv: n煤mero de validaciones cruzadas para cada conjunto de hiperpar谩metros
verbose: cuanto m谩s alto, m谩s mensajes se imprimir谩n.
n_jobs: n煤mero de trabajos que se ejecutar谩n en paralelo
pre_dispatch: controla el n煤mero de trabajos que se pueden realizar en paralelo (para evitar problemas de memoria)
iid: asume que los datos se distribuyen de forma id茅ntica e independiente. El valor predeterminado es falso.
refit: una vez que se encuentran los mejores par谩metros, reajuste el estimador
error_score: valor para asignar al puntaje si ocurre un error al ajustar el estimador
return_train_score: incluya puntajes de tren en cv_results_

隆Ac谩 por fin quit贸 la columna 鈥榬ank鈥!

Falto realizar el SPLIT de los datos.

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

cross_val_score o KFold
驴Tienen una aplicaci贸n que no tenga que ver con la optimizaci贸n de par谩metros?

Aqu铆 tienes el c贸digo implementado con `GridSearchCV`: ```js import pandas as pd from sklearn.model_selection import GridSearchCV from sklearn.ensemble import RandomForestRegressor if __name__ == "__main__": # Leer el dataset dataset = pd.read_csv('./data/felicidad.csv') # Imprimir el dataset para verificar la carga print(dataset) # Seleccionar caracter铆sticas (X) y etiquetas (y) X = dataset.drop(['country', 'rank', 'score'], axis=1) y = dataset['score'] # Inicializar el regresor RandomForestRegressor reg = RandomForestRegressor() # Definir los par谩metros para la b煤squeda en cuadr铆cula parametros = { # N煤mero de 谩rboles en el bosque 'n_estimators': [10, 50, 100], # Criterio utilizado para medir la calidad de una divisi贸n 'criterion': ['mse', 'mae'], # 'mse': error cuadr谩tico medio, 'mae': error absoluto medio # Profundidad m谩xima de los 谩rboles en el bosque 'max_depth': [None, 10, 20], # N煤mero m铆nimo de muestras requeridas para dividir un nodo interno 'min_samples_split': [2, 5, 10], # N煤mero m铆nimo de muestras requeridas para estar en un nodo hoja 'min_samples_leaf': [1, 2, 4], # M茅todo para la selecci贸n de caracter铆sticas en cada split 'max_features': ['auto', 'sqrt', 'log2'], # 'auto': sqrt(num_features), 'sqrt': sqrt(num_features), 'log2': log2(num_features) # Bootstrap muestras al construir 谩rboles 'bootstrap': [True, False], # True: usar bootstrap samples, False: usar el dataset completo } # Realizar la b煤squeda en cuadr铆cula de hiperpar谩metros grid_est = GridSearchCV(reg, parametros, cv=3, scoring='neg_mean_absolute_error').fit(X, y) # Imprimir el mejor estimador encontrado print("Mejor estimador:") print(grid_est.best_estimator_) # Imprimir los mejores par谩metros encontrados print("Mejores par谩metros:") print(grid_est.best_params_) # Realizar una predicci贸n utilizando el mejor modelo encontrado print("Predicci贸n para el primer ejemplo del dataset:") print(grid_est.predict(X.loc[[0]])) ```import pandas as pd from sklearn.model\_selection import GridSearchCV from sklearn.ensemble import RandomForestRegressor if \_\_name\_\_ == "\_\_main\_\_": \# Leer el dataset dataset = pd.read\_csv('./data/felicidad.csv') \# Imprimir el dataset para verificar la carga print(dataset) \# Seleccionar caracter铆sticas (X) y etiquetas (y) X = dataset.drop(\['country', 'rank', 'score'], axis=1) y = dataset\['score'] \# Inicializar el regresor RandomForestRegressor reg = RandomForestRegressor() \# Definir los par谩metros para la b煤squeda en cuadr铆cula parametros = { \# N煤mero de 谩rboles en el bosque 'n\_estimators': \[10, 50, 100], \# Criterio utilizado para medir la calidad de una divisi贸n 'criterion': \['mse', 'mae'], # 'mse': error cuadr谩tico medio, 'mae': error absoluto medio \# Profundidad m谩xima de los 谩rboles en el bosque 'max\_depth': \[None, 10, 20], \# N煤mero m铆nimo de muestras requeridas para dividir un nodo interno 'min\_samples\_split': \[2, 5, 10], \# N煤mero m铆nimo de muestras requeridas para estar en un nodo hoja 'min\_samples\_leaf': \[1, 2, 4], \# M茅todo para la selecci贸n de caracter铆sticas en cada split 'max\_features': \['auto', 'sqrt', 'log2'], # 'auto': sqrt(num\_features), 'sqrt': sqrt(num\_features), 'log2': log2(num\_features) \# Bootstrap muestras al construir 谩rboles 'bootstrap': \[True, False], # True: usar bootstrap samples, False: usar el dataset completo } \# Realizar la b煤squeda en cuadr铆cula de hiperpar谩metros grid\_est = GridSearchCV(reg, parametros, cv=3, scoring='neg\_mean\_absolute\_error').fit(X, y) \# Imprimir el mejor estimador encontrado print("Mejor estimador:") print(grid\_est.best\_estimator\_) \# Imprimir los mejores par谩metros encontrados print("Mejores par谩metros:") print(grid\_est.best\_params\_) \# Realizar una predicci贸n utilizando el mejor modelo encontrado print("Predicci贸n para el primer ejemplo del dataset:") print(grid\_est.predict(X.loc\[\[0]])) Este c贸digo utiliza `GridSearchCV` en lugar de `RandomizedSearchCV`. Los par谩metros y su rango son especificados manualmente para realizar una b煤squeda exhaustiva sobre todas las combinaciones posibles de par谩metros dentro del rango especificado. Esto puede ser 煤til si la cantidad de combinaciones es manejable y no demasiado grande.
Aqu铆 tienen el c贸digo optimizado con m谩s par谩metros y bien explicado:import pandas as pd from sklearn.model\_selection import RandomizedSearchCV from sklearn.ensemble import RandomForestRegressor if \_\_name\_\_ == "\_\_main\_\_": # Leer el dataset dataset = pd.read\_csv('./data/felicidad.csv') # Imprimir el dataset para verificar la carga print(dataset) # Seleccionar caracter铆sticas (X) y etiquetas (y) X = dataset.drop(\['country', 'rank', 'score'], axis=1) y = dataset\['score'] # Inicializar el regresor RandomForestRegressor reg = RandomForestRegressor() # Definir los par谩metros para la b煤squeda aleatoria parametros = { # N煤mero de 谩rboles en el bosque 'n\_estimators': range(4, 16), # Criterio utilizado para medir la calidad de una divisi贸n 'criterion': \['mse', 'mae'], # 'mse': error cuadr谩tico medio, 'mae': error absoluto medio # Profundidad m谩xima de los 谩rboles en el bosque 'max\_depth': range(2, 11), # N煤mero m铆nimo de muestras requeridas para dividir un nodo interno 'min\_samples\_split': range(2, 10), # N煤mero m铆nimo de muestras requeridas para estar en un nodo hoja 'min\_samples\_leaf': range(1, 10), # M茅todo para la selecci贸n de caracter铆sticas en cada split 'max\_features': \['auto', 'sqrt', 'log2', None], # 'auto': sqrt(num\_features), 'sqrt': sqrt(num\_features), 'log2': log2(num\_features), None: num\_features # Bootstrap muestras al construir 谩rboles 'bootstrap': \[True, False], # True: usar bootstrap samples, False: usar el dataset completo # M茅todo para la selecci贸n de muestras cuando se construyen los 谩rboles 'oob\_score': \[True, False], # True: permitir out-of-bag estimation, False: no permitir out-of-bag estimation # Criterio utilizado para elegir los nodos en el crecimiento del 谩rbol 'splitter': \['best', 'random'] # 'best': el mejor split, 'random': el mejor split aleatorio } # Realizar la b煤squeda aleatoria de hiperpar谩metros rand\_est = RandomizedSearchCV(reg, parametros, n\_iter=10, cv=3, scoring='neg\_mean\_absolute\_error').fit(X, y) # Imprimir el mejor estimador encontrado print("Mejor estimador:") print(rand\_est.best\_estimator\_) # Imprimir los mejores par谩metros encontrados print("Mejores par谩metros:") print(rand\_est.best\_params\_) # Realizar una predicci贸n utilizando el mejor modelo encontrado print("Predicci贸n para el primer ejemplo del dataset:") print(rand\_est.predict(X.loc\[\[0]])) ```python import pandas as pd from sklearn.model_selection import RandomizedSearchCV from sklearn.ensemble import RandomForestRegressor if __name__ == "__main__": # Leer el dataset dataset = pd.read_csv('./data/felicidad.csv') # Imprimir el dataset para verificar la carga print(dataset) # Seleccionar caracter铆sticas (X) y etiquetas (y) X = dataset.drop(['country', 'rank', 'score'], axis=1) y = dataset['score'] # Inicializar el regresor RandomForestRegressor reg = RandomForestRegressor() # Definir los par谩metros para la b煤squeda aleatoria parametros = { # N煤mero de 谩rboles en el bosque 'n_estimators': range(4, 16), # Criterio utilizado para medir la calidad de una divisi贸n 'criterion': ['mse', 'mae'], # 'mse': error cuadr谩tico medio, 'mae': error absoluto medio # Profundidad m谩xima de los 谩rboles en el bosque 'max_depth': range(2, 11), # N煤mero m铆nimo de muestras requeridas para dividir un nodo interno 'min_samples_split': range(2, 10), # N煤mero m铆nimo de muestras requeridas para estar en un nodo hoja 'min_samples_leaf': range(1, 10), # M茅todo para la selecci贸n de caracter铆sticas en cada split 'max_features': ['auto', 'sqrt', 'log2', None], # 'auto': sqrt(num_features), 'sqrt': sqrt(num_features), 'log2': log2(num_features), None: num_features # Bootstrap muestras al construir 谩rboles 'bootstrap': [True, False], # True: usar bootstrap samples, False: usar el dataset completo # M茅todo para la selecci贸n de muestras cuando se construyen los 谩rboles 'oob_score': [True, False], # True: permitir out-of-bag estimation, False: no permitir out-of-bag estimation # Criterio utilizado para elegir los nodos en el crecimiento del 谩rbol 'splitter': ['best', 'random'] # 'best': el mejor split, 'random': el mejor split aleatorio } # Realizar la b煤squeda aleatoria de hiperpar谩metros rand_est = RandomizedSearchCV(reg, parametros, n_iter=10, cv=3, scoring='neg_mean_absolute_error').fit(X, y) # Imprimir el mejor estimador encontrado print("Mejor estimador:") print(rand_est.best_estimator_) # Imprimir los mejores par谩metros encontrados print("Mejores par谩metros:") print(rand_est.best_params_) # Realizar una predicci贸n utilizando el mejor modelo encontrado print("Predicci贸n para el primer ejemplo del dataset:") print(rand_est.predict(X.loc[[0]])) ```
Que tal, Respecto a `max_depht`. Me sirvi贸 entenderlo mejor con las siguientes analog铆as para no confundirlo con otros par谩metros: **Qu茅 no hace max depht?** * *"Qu茅 tan grande ser谩 el 谩rbol y cu谩ntas ramas tendr谩"*: Esto m谩s bien **se refiere al n煤mero total de nodos en un 谩rbol**. Lo cu谩l se relaciona otros par谩metros como: `min_samples_split` y `min_samples_leaf.` max\_depth no controla directamente el n煤mero total de nodos o ramas en el 谩rbol, sino m谩s bien la profundidad m谩xima desde la ra铆z hasta una hoja. **Qu茅 s铆 hace max depht ?** * *"Qu茅 tan grandes son las ramas de los 谩rboles y la cantidad de ramas chiquitas en su composici贸n"*: Influye directamente en la longitud y estructura de las ramas del 谩rbol, o sea: **cu谩ntas divisiones se realizan antes de llegar a una hoja**. Un valor mayor permite que las ramas del 谩rbol sean m谩s largas, m谩s subdivisiones y nodos internos Fun fact: al limitar la profundidad del 谩rbol, ayuda a prevenir el overfitting. Generalizando mejor los datos no vistos.

Estos fueron mis resultados ! 馃槃

RandomForestRegressor(criterion='absolute_error', max_depth=10, n_estimators=4)
{'n_estimators': 4, 'max_depth': 10, 'criterion': 'absolute_error'}
[7.53325009]

RandomizedSearchCV es una t茅cnica de b煤squeda de hiperpar谩metros que realiza una b煤squeda aleatoria en lugar de una b煤squeda exhaustiva como GridSearchCV. Esto es 煤til cuando tienes una gran cantidad de posibles combinaciones de hiperpar谩metros y deseas encontrar una configuraci贸n de hiperpar谩metros 贸ptima de manera m谩s eficiente.

Si algunx tiene problemas para instalar auto-sklearn desde ubuntu o no tiene un sistema linux en deepnote se puede usar, solo hay que intalarlo con:

!pip install auto-sklearn

En la parte del c贸digo de los par谩metros se debe reemplazar por este c贸digo, ya que los par谩metros de criterion est谩n descontinuados y sale error.

parametros = {
        'n_estimators' : range(4,16),
        'criterion' : ['poisson', 'friedman_mse', 'absolute_error', 'squared_error'],
        'max_depth' : range(2,11)
    }

Para evitar ciertos warnings en Jupyter Notebooks:

parametros = {
        'n_estimators' : range(4,16),
        'criterion' : ['squared_error', 'absolute_error'],
        'max_depth' : range(2,11)

Si en la actualidad les figura este error :
FutureWarning: Criterion 鈥榤ae鈥 was deprecated in v1.0 and will be removed in version 1.2. Use criterion='absolute_error' which is equivalent.

les dejo lo que a mi me lo soluciono:

import pandas as pd

from sklearn.model_selection import RandomizedSearchCV
from sklearn.ensemble import RandomForestRegressor

if name == 鈥main鈥:

dataset = pd.read_csv('../Data/felicidad.csv')

print(dataset)

X = dataset.drop(['country', 'rank', 'score'], axis=1)
y = dataset['score']

reg = RandomForestRegressor()

parametros = {
    'n_estimators' : range(4,16),
    'criterion' : ["absolute_error"],
    'max_depth' : range(2,11),
}

rand_est = RandomizedSearchCV(reg, parametros , n_iter=10, cv=3, scoring='neg_mean_absolute_error').fit(X,y)

print(rand_est.best_estimator_)

print(rand_est.best_params_)

print(rand_est.predict(X.loc[[0]]))

#implmentacion_randomizedSearchCV

import pandas as pd
from sklearn.model_selection import RandomizedSearchCV
from sklearn.ensemble import RandomForestRegressor

dataset = pd.read_csv(鈥榝elicidad.csv鈥)
X = dataset.drop([鈥榗ountry鈥, 鈥榮core鈥,鈥榬ank鈥橾, axis=1)
y = dataset[鈥榮core鈥橾

modelo = RandomForestRegressor()

parametros = {
鈥榥_estimators鈥: range(4,15), #busque entre 4 y 15 arboles
鈥檆riterion鈥: [鈥榤se鈥,鈥榤ae鈥橾,
鈥榤ax_depth鈥: range(2,11) #que tan profundo el arbol
}

#estimador 10 iteraciones maximo y divida en 3 grupos
#3 = 2 de training y 1 de test
#scoring = con que deseamos medir
rand_est = RandomizedSearchCV(modelo,parametros,n_iter=10, cv=3, scoring=鈥榥eg_mean_absolute_error鈥).fit(X,y)

print("")
print("Mejores criterios a usar son ",rand_est.best_estimator_)
print("Mejores parametros a usar son ", rand_est.best_params_)
print(鈥淧rediccion al primer pais [0] es 鈥,rand_est.predict(X.loc[[0]]))
print(鈥濃)

OUTPUT:
Mejores criterios a usar son RandomForestRegressor(criterion=鈥榤ae鈥, max_depth=5, n_estimators=4)
Mejores parametros a usar son {鈥榥_estimators鈥: 4, 鈥榤ax_depth鈥: 5, 鈥榗riterion鈥: 鈥榤ae鈥檥
Prediccion al primer pais [0] es [7.51200008]

Mis resultados

{'criterion': 'mse', 'max_depth': 10, 'n_estimators': 6}

print('Predict: ', rand_est.predict(X.loc[[0]]))
print('Real: ', str(y[0]))

Predict:  [7.53700018]
Real:  7.537000179

Super acertado 馃ぉ

Mis resultados:

================================================================
Best estimator: RandomForestRegressor(criterion='mae', max_depth=7, n_estimators=12)
================================================================
Best params: {'n_estimators': 12, 'max_depth': 7, 'criterion': 'mae'}
================================================================
predict: [7.50891674]