<jupyter_start><jupyter_text>05. Hiperparametros del Modelo     Resolver dudas → Pregunta en  Discord    Tutoriales →  YouTube    Reservar Clases → @ sotastica  Cargar Datos > Usamos una tabla del _[Respositorio de Datos de Machine Learning UCI](https://archive.ics.uci.edu/ml/datasets/adult)_. Esta tabla resume la información de personas que ganan más de 50,000 al año o menos. Por tanto, nuestro objetivo es desarrollar un modelo que calcule mejor si una persona gana por encima o por debajo de dicho umbral. La columna a predecir es la última.>> PD: Si te interesa conocer el nombre de las variables, puedes ir al enlace de del repositorio.```pythonimport pandas as pdpd.set_option("display.max_columns", None)url = 'https://archive.ics.uci.edu/ml/machine-learning-databases/adult/adult.data'df = pd.read_csv(url, header=None, na_values=' ?')df.rename(columns={14: 'target'}, inplace=True)df.head()```> Copiamos y pegamos en la siguiente celda las líneas de código que aparecen justo arriba para descargar los datos de internet y almacenar la tabla en un `DataFrame` con el que trabajaremos durante la práctica.<jupyter_code>import pandas as pd
pd.set_option("display.max_columns", None)

url = 'https://archive.ics.uci.edu/ml/machine-learning-databases/adult/adult.data'
df = pd.read_csv(url, header=None, na_values=' ?')
df.rename(columns={14: 'target'}, inplace=True)
df.head()<jupyter_output><empty_output><jupyter_text>Seleccionar Variables > 1. `Variable Objetivo y`> 2. El resto las usaremos como `Variables Explicativas X`<jupyter_code>X = df.iloc[:, :-1]
y = df.iloc[:, -1]
X = pd.get_dummies(X, drop_first=True)<jupyter_output><empty_output><jupyter_text>Entrenar Modelo `DecisionTreeClassifier()` por Defecto > Usaremos los hiperparámetros que vienen por defecto (dejamos el paréntesis en blanco).<jupyter_code>from sklearn.tree import DecisionTreeClassifier
model = DecisionTreeClassifier(min_samples_leaf=1)
from sklearn.model_selection import train_test_split
X = pd.DataFrame(scaler.fit_transform(X), columns=X.columns)
X_train, X_test, y_train, y_test = train_test_split(X, y, train_size=0.7, random_state=42)
X.shape
X_train.shape
X_test.shape
model.fit(X_train, y_train)<jupyter_output><empty_output><jupyter_text>Realidad vs Predicciones > ¿Cómo de bueno es el modelo en los datos de **entrenamiento**?¿Y en los datos de **testeo**?<jupyter_code>model.score(X=X_train, y=y_train)
model.score(X=X_test, y=y_test)<jupyter_output><empty_output><jupyter_text>Visualizar Modelo > - Usaremos la función `plot_tree()`, que se encuentra en el módulo `tree` de la librería `sklearn`> - Podéis usar `shift + tab` para que `Python` os explique cómo usar la función `plot_tree()`<jupyter_code>from sklearn.tree import plot_tree
plot_tree(decision_tree=model, feature_names=X_train.columns, filled=True, max_depth=3, fontsize=10);<jupyter_output><empty_output><jupyter_text>Interpretar Modelo > ¿Por qué el modelo es muy bueno en los datos de entrenamiento y tan malo en los datos de testeo?  Entrenar Modelo `DecisionTreeClassifier()` con Diferentes Hiperparámetros > - Debemos emplear el **objeto** `GridSearchCV()` para encontrar los mejores Hiperparámetros que nos den mejores resultados en datos que el modelo no conocía: enl los datos de testeo.>> Si queremos ver los hiperparámetros del modelo, ejecutaremos: `model.get_params()`>> Si queremos ver los posibles valores que deben tener los hiperpámetros, podemos ver la ayuda `shift + tab` sobre el paréntesis del objeto `DecisionTreeClassifier()`.<jupyter_code>from sklearn.model_selection import GridSearchCV
cv = GridSearchCV(estimator=model, param_grid={'min_samples_leaf': [10, 20, 40, 80, 160, 320]}, cv=5, verbose=2)
cv.fit(X_train, y_train)
cv.best_params_
model = DecisionTreeClassifier(min_samples_leaf=80)
model.fit(X_train, y_train)<jupyter_output><empty_output><jupyter_text>Realidad vs Predicciones > ¿Cómo de bueno es el modelo en los datos de **entrenamiento**?¿Y en los datos de **testeo**?<jupyter_code>model.score(X_train, y_train)
model.score(X_test, y_test)<jupyter_output><empty_output><jupyter_text>Visualizar Modelo > - Usaremos la función `plot_tree()`, que se encuentra en el módulo `tree` de la librería `sklearn`> - Podéis usar `shift + tab` para que `Python` os explique cómo usar la función `plot_tree()`<jupyter_code>from sklearn.tree import plot_tree
import matplotlib.pyplot as plt
plt.figure(figsize=(15, 20))
plot_tree(decision_tree=model, feature_names=X_train.columns, filled=True, fontsize=10);<jupyter_output><empty_output><jupyter_text>Interpretar Modelo > ¿Por qué el modelo es muy bueno en los datos de entrenamiento y tan malo en los datos de testeo?¿Por qué ha cambiado tanto la precisión en los datos de testeo al haber usado diferentes hiperparámetros?<jupyter_code>porque hemos ajustado más los datos para aquellos que aun no conocemos<jupyter_output><empty_output><jupyter_text>Configurar Hiperparámetros de Otros Modelos  K Nearest Neighbours > Aquí tan solo debemos configurar el número K de vecinos a tener en cuenta.<jupyter_code>from sklearn.preprocessing import MinMaxScaler
from sklearn.neighbors import KNeighborsClassifier
model = KNeighborsClassifier()
from sklearn.model_selection import train_test_split
X = pd.DataFrame(scaler.fit_transform(X), columns=X.columns)
X_train, X_test, y_train, y_test = train_test_split(X, y, train_size=0.7, random_state=42)
model.get_params()
model.fit(X_train, y_train)
model.score(X_train, y_train)
model.score(X_test, y_test)
import numpy as np
cv = GridSearchCV(estimator=model, param_grid={'n_neighbors': [5, 10, 20, 40, 80, 160, 320]}, cv=5, verbose=2)
cv.fit(X_train, y_train)
cv.best_params_
model = KNeighborsClassifier(n_neighbors=320)
model.fit(X_train, y_train)
model.score(X_train, y_train)
model.score(X_test, y_test)<jupyter_output><empty_output><jupyter_text>Support Vector Machines > _Durante la corrección te explicare en detalle el funcionamiento de este algoritmo. Mientras tanto, podéis ver el vídeo que usaré para que os relacionéis con los conceptos:_>> - https://www.youtube.com/watch?v=efR1C6CvhmE>> Además de un script en Internet:>> - https://jakevdp.github.io/PythonDataScienceHandbook/05.07-support-vector-machines.html>> Cambiad tan solo los hiperparámetros del coste `C` y el tipo de `kernel`. En el último enlace veréis los posibles valores con los que podemos jugar. Además, podréis ver qué significan cada uno de los hiperparámetros solicitando ayuda con `shift + tab`.<jupyter_code>from sklearn.preprocessing import MinMaxScaler
from sklearn.svm import SVC
model = SVC()
from sklearn.model_selection import train_test_split
X = pd.DataFrame(scaler.fit_transform(X), columns=X.columns)
X_train, X_test, y_train, y_test = train_test_split(X, y, train_size=0.7, random_state=42)
model.get_params()
model.fit(X_train, y_train)
model.score(X_train, y_train)
model.score(X_test, y_test)
import numpy as np
cv = GridSearchCV(estimator=model, param_grid={'C': [0.000001,0.0000001,0.00000001], 'kernel': ['rbf']}, cv=5, verbose=2)
cv.fit(X_train, y_train)
cv.best_params_
model = KNeighborsClassifier(n_neighbors=320)
model.fit(X_train, y_train)
model.score(X_train, y_train)
model.score(X_test, y_test)<jupyter_output><empty_output>
{'fraction_non_alphanumeric': 0.10128862408202854, 'fraction_numerical': 0.015241790217541915, 'mean_word_length': 6.879912663755459, 'pattern_counts': {'":': 0, '<': 45, '<?xml version=': 0, '>': 75, 'https://': 5, 'lorem ipsum': 0, 'www.': 1, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 1, 'word_list_counts': {'cursed_substrings.json': 1, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'chain_length': '11', 'dir': 'jupyter-structured-clean-dedup', 'id': '181745', 'license': 'MIT', 'n_tokens_mistral': 2706, 'n_tokens_neox': 2608, 'n_words': 706, 'path': 'II Machine Learning & Deep Learning/programa completado/#05. Hiperparametros del Modelo/Notebooks/tarea.ipynb', 'repo_name': 'escarpa23/machine-learning-program', 'size': '7217'}