Crea una cuenta o inicia sesi贸n

隆Contin煤a aprendiendo sin ning煤n costo! 脷nete y comienza a potenciar tu carrera

Aprende Ingl茅s, Programaci贸n, AI, Ciberseguridad y mucho m谩s.

Antes: $249

Currency
$209
Suscr铆bete

Termina en:

4 D铆as
10 Hrs
39 Min
56 Seg

Revisi贸n de notebooks y modelado

6/24
Recursos

Aportes 21

Preguntas 5

Ordenar por:

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

la metrica del data set de train es: 0.96677 y del dataset de Test es: 0.76, luego de la hiperparametrizacion, es claro que el modelo tiene Overfitting.
Aunque el ejercicio es sobre despliegue es bueno anotar que se debe hacer una etapa de seleccion de modelos, pero se ve que el modelo seleccionado tiene Min_samples_leaf=1, este puede ser el principal parametro que esta haciendo el sobreajuste.
es bueno probar con numeros minimos por hoja mucho mas grande como 5.

la verdad est谩 muy interesante el curso.

Los que estan usando GItBash desde Windonws deber谩n poner :

source venv/Scripts/activate en lugar de

source venv/bin/activate

Yo voy a usar este proyecto, es de un dataset de kaggle que me intereso, dejo el notebook con la parte donde elijo el modelo de machine learning.

Dejo este comentario aca, para que se vea, solucione el overfitting del modelo:

estimator = Pipeline([
    ('imputer', imputer),
    ('core_model', GradientBoostingRegressor(n_estimators=260,
                                            #  alpha=0.9,
                                             ccp_alpha=0.0,
                                             criterion='friedman_mse',
                                             init=None,
                                             learning_rate=0.02,
                                             loss='huber',
                                             max_depth=4,
                                             max_features=None,
                                             max_leaf_nodes=None,
                                             min_impurity_decrease=0.0,
                                             min_samples_leaf=2,
                                             min_samples_split=3,
                                             min_weight_fraction_leaf=0.0,
                                             n_iter_no_change=None,
                                             random_state=None,
                                             subsample=1,
                                             tol=0.0001,
                                             validation_fraction=0.14,
                                             verbose=0,
                                             warm_start=False))
])

No es el regresor con el mejor performance, pero es el que se nos dio en la clase. Y es mucho mejor que un regresor aleatorio.

seguir茅 el curso con el Notebook actual pero al finalizar lo har茅 tambi茅n con este problema que me llam贸 la atenci贸n de Kaggle https://www.kaggle.com/sakshigoyal7/credit-card-customers

El profesor hace todo excesiva e innecesariamente r谩pido. No parece un tutorial sino un overview.

Si alguno tiene problemas con los m贸dulos o dependencias por el kernel, tambi茅n pueden incluir: `%pip install -r ../notebooks/requirements.txt` Al inicio de su notebook. Otra cosa a mencionar, hoy 19-12-2023, tras buscar en stackoverflow, se recomienda utilizar la versi贸n 3.9 de python, pues las versiones superiores generan algunas incompatibilidades al realizar la instalaci贸n, y sobretodo al generar el metadata en tu venv (cosa que me sucedi贸)

En caso de que lo est茅n haciendo desde un computador con sistema operativo windows, pueden activar el ambiente virtual de esta manera:

.\venv\Scripts\activate.bat

A mi me funcion贸 y espero que a ustedes tambi茅n!

隆Es hermoso!, por el momento me est谩 gustando mucho.

Script carga datos de pel铆culas, realiza manipulaciones para preparar los datos, entrena y optimiza un modelo de regresi贸n de Gradient Boosting, guarda el modelo entrenado y muestra las columnas de las caracter铆sticas utilizadas en el entrenamiento del modelo Debido a las actualizaciones tube que solucionar muchos ploblemas ![](https://static.platzi.com/media/user_upload/image-9e19e089-154e-41a9-803d-d8abc165d8bf.jpg) estoy trabajando es VScode
隆Hola! En caso de querer correr este modelo en la nube, tambi茅n se puede hacer en GitHub codespaces. <https://github.com/features/codespaces>

En mi caso, el curso del que se saco el proyecto ya no existe, sin embargo me tome el tiempo de analizar el scrip que se esta usando, eso si , si me equivoco en algo o me falta algo me lo escriben en los comentarios

Espero que les sirva y les ahorre tiempo.馃挭馃挭馃挭

import pandas as pd

movies_data_path = 'D:/NIXON/universidad/platzy/PROYECTO FINAL_1/introduccion.ml/dataset/movies.csv'
finantial_data_path = 'D:/NIXON/universidad/platzy/PROYECTO FINAL_1/introduccion.ml/dataset/finantials.csv'
opening_data_path = 'D:/NIXON/universidad/platzy/PROYECTO FINAL_1/introduccion.ml/dataset/opening_gross.csv'


fin_data = pd.read_csv(finantial_data_path)
movie_data = pd.read_csv(movies_data_path)
opening_data = pd.read_csv(opening_data_path)

#aqui se realiza una mascara para separar como true a los valores flotantes y como false a los demas
#el simbolo | sirve como alternativa al or y lo que nos genera los boleanos son las condicionantes ==
numeric_columns_mask = (movie_data.dtypes == float) | (movie_data.dtypes == int)
#aqui sacamos los nombres de las columnas que necesitemos y que cumplan con la mascara o sea con los boleanos true
numeric_columns = [column for column in numeric_columns_mask.index if numeric_columns_mask[column]]
#aqui estraemos los valores que necesitamos del df movie_data
movie_data2 = movie_data[numeric_columns+['movie_title']]
#aqui vamos a leer el otro df pero ignorando las columnas que no nos importan
fin_data2 = fin_data[['movie_title','production_budget','worldwide_gross']]
#unimos 2 df , los unimos segun su titulo y con predominancia el de la derecha
fin_movie_data = pd.merge(fin_data2, movie_data2, on= 'movie_title', how='left')
#y le agregamos el ultimo df que hacia falta
full_movie_data = pd.merge( opening_data,fin_movie_data, on = 'movie_title', how='left')

##revision
#revisamos cuantos datos no nulos y diferentes a cero tenemso
print(full_movie_data[(full_movie_data.worldwide_gross != 0) & (full_movie_data.worldwide_gross.notnull())].shape)

#aqui vamos a eliminar 2 columnas
full_movie_data = full_movie_data.drop(['movie_title','gross'],axis=1)
#revisamos las columnas
print(full_movie_data.columns)



##################Modeling####################################

from sklearn.model_selection import train_test_split #con esta generamos la data de entrenamiento
from sklearn.pipeline import Pipeline #esta permite juntar acciones
from sklearn.impute import SimpleImputer #este se utiliza para la impuestacion de datos nulos por lo genera
from sklearn.ensemble import GradientBoostingRegressor #este es el modelo predictor que vamos a utilizar
from sklearn.model_selection import cross_validate #es la validacion cruzada del modelo
import numpy as np

#aqui vamos a asacar la variable dependiente e independiente
X = full_movie_data.drop(['worldwide_gross'], axis = 1)
y = full_movie_data['worldwide_gross']

pipeline = Pipeline([
    ('imputer', SimpleImputer(missing_values=np.nan, strategy='mean')), #aqui le decimos que los valores nulos nos lo sustiytuya por la media
    ('core_model', GradientBoostingRegressor()) #despues de hacer la funcion de arriba aplicara de forma conjunta el modelo predictor
])


'''
los resultados seran lo siguientes
fit time = tiempo de ejecucion por columna o tiempo en lo que tarda el modelo en ajustarse
score time = el tiempo en el que tarda realizando la prediccion
score train y test = es el resultado de la cross validation o sea que tan bien estan los resultados, o bueno es un indicador 
'''
results = cross_validate(pipeline ,X,y,return_train_score=True,cv=10) #realizamos la validacion cruzada
print(results)

#aqui vamos a extraer lo que nos importa que el elver que tan bien se realizo el modelo o sea la calificacion para el set de entrenamiento y de test
train_score = np.mean(results['train_score'])
test_score = np.mean(results['test_score'])

'''
La palabra clave assert se usa al depurar c贸digo. La palabra clave assert le permite probar si una condici贸n
en su c贸digo devuelve True, si no, el programa generar谩 un AssertionError. Puede escribir un mensaje para que 
se escriba si el c贸digo devuelve False, verifique el ejemplo a continuaci贸n.

basicamente si nuestra media de train y test score nos hubiera dado menor a lo que dicta el parametro nos da un error
'''
assert train_score > 0.7
assert test_score > 0.65
print(f'Train Score: {train_score}')
print(f'Test Score: {test_score}')


########### Hyperparameter tunning ##############################

from sklearn.model_selection import GridSearchCV


#aqui lo que vamosa  a realizar es un metodo de obtimizacion en este caso se aplica el metodo de la grilla
# revisarla clase de optimiacion parametrica del curos profesional de machine learning
param_tunning = {'core_model__n_estimators': range(20,501,20)}

#aqui volvemos a aplicar un pipe, con una imputacion simple y el modelo predictivo
estimator = Pipeline([
    ('imputer', SimpleImputer(missing_values=np.nan, strategy='mean')),
    ('core_model', GradientBoostingRegressor())
])

#aqui es donde vamos a aplicar la obtimizacion parametrica por metodo de grilla
grid_search= GridSearchCV(estimator,
                       param_grid = param_tunning,
                       scoring='r2',
                       cv=5)

#generamos el modelo de entrenamiento
X_train, X_test, y_train, y_test = train_test_split(X,y, test_size = 0.35,random_state= 42)

#ajustamos el modelo con los datos de entrenamiento
grid_search.fit(X_train, y_train)

'''
resultado del ajuste 'fit'

GridSearchCV(cv=5,
             estimator=Pipeline(steps=[('imputer', SimpleImputer()),
                                       ('core_model',
                                        GradientBoostingRegressor())]),
             param_grid={'core_model__n_estimators': range(20, 501, 20)},
             scoring='r2')
'''

#ahora vamos a calificar el modelo usando el cross validation
final_result = cross_validate(grid_search.best_estimator_,X_train,y_train,return_train_score=True,cv=7)
train_score = np.mean(final_result['train_score'])
test_score = np.mean(final_result['test_score'])
assert train_score > 0.7
assert test_score > 0.65
print(f'Train Score: {train_score}')
print(f'Test Score: {test_score}')

#con este codigo podemos ver las metricas o parametros del mejor estimador
print(grid_search.best_estimator_.get_params())

#aqui literalmente lo que hacemos es poner los parametros generados en el print anterior dentro de un nuevo pipe
#el cual ejecuta un imutador simple de datos nulos
#y el modelo predictivo con los parametros recomendados para generar el mejor score
estimator = Pipeline([
    ('imputer', SimpleImputer(missing_values=np.nan, strategy='mean')),
    ('core_model', GradientBoostingRegressor(n_estimators=220,
                                             alpha=0.9,
                                             ccp_alpha=0.0,
                                             criterion='friedman_mse',
                                             init=None,
                                             learning_rate=0.1,
                                             loss='squared_error',
                                             max_depth=3,
                                             max_features=None,
                                             max_leaf_nodes=None,
                                             min_impurity_decrease=0.0,
                                             min_samples_leaf=1,
                                             min_samples_split=2,
                                             min_weight_fraction_leaf=0.0,
                                             n_iter_no_change=None,
                                             random_state=None,
                                             subsample=1.0,
                                             tol=0.0001,
                                             validation_fraction=0.1,
                                             verbose=0,
                                             warm_start=False))
])

print(estimator.fit(X_train,y_train))

print(estimator.score(X_test, y_test))


################## Saving model #################################

from joblib import dump

dump(estimator, 'D:/NIXON/universidad/platzy/PROYECTO FINAL_1/introduccion.ml/model/model2.pkl')

print(X_train.columns)

Perd贸nenme si estoy confundido, pero, no se normalizaron los datos. Deber铆amos considerar un StandardScaler como segunda fase de nuestro pipeline para mejorar 茅l desempe帽贸.
馃槂馃槂

En el notebook hay errorcitos en el codigo, cuando hacemos el ultimo pipeline, pasamos al regresor alpha:

GradientBoostingRegressor(n_estimators=270,
                                            #  alpha=0.9,
                                             ccp_alpha=0.0,

Pero este parametro, no hace nada, ya que solo funciona si loss=鈥榟uber鈥 o loss=鈥榪uantile鈥, y pasamos loss=鈥榮quared_error鈥.

Ademas, esta bastante mal optimizado el regresor,

yo logre con un poquito de pericia lograr un 0.8 para test modificando los valores de la funcion, para bajar la distancia entre el score de train y el de test.

estimator = Pipeline([
    ('imputer', imputer),
    ('core_model', GradientBoostingRegressor(n_estimators=270,
                                            #  alpha=0.9,
                                             ccp_alpha=0.0,
                                             criterion='friedman_mse',
                                             init=None,
                                             learning_rate=0.04,
                                             loss='squared_error',
                                             max_depth=4,
                                             max_features=None,
                                             max_leaf_nodes=None,
                                             min_impurity_decrease=0.0,
                                             min_samples_leaf=1,
                                             min_samples_split=3,
                                             min_weight_fraction_leaf=0.0,
                                             n_iter_no_change=None,
                                             random_state=None,
                                             subsample=1.0,
                                             tol=0.0001,
                                             validation_fraction=0.1,
                                             verbose=0,
                                             warm_start=False))
])

Mas que esto creo que no le podemos exigir a este modelo.

Quiz谩 a alguien le sea de utilidad: en el archivo notebooks/requirements.txt expl铆citamente s贸lo se listan para instalar pandas y scikit-learn, pero impl铆citamente se instalan joblib y las dem谩s librer铆as que Gerson menciona.

Creo s贸lo ver茅 el curso porque est谩 muy avanzado.

pip3 install virtualenv
Para instalar desde GitHub

**En caso de correr el comando **

Jupyter notebook

y les pida contrase帽a si no se acuerdan pueden hacer los siguientes pasos:

  1. Establecer una contrase帽a por defecto usando

jupyter notebook password

y escribir la contrase帽a nueva que tendra su notebook luego de confirmar si intentan ingresar ver谩n que a煤n no les permite hacerlo y es por que deben correr nuevamente el aplicativo para que corra los nuevos cambios.

  1. Listar los notebooks abiertos

jupyter notebook list
jupyter notebook stop ####

y corren nuevamente su notebook usando

jupyter notebook