No tienes acceso a esta clase

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

Validaci贸n cruzada en Python

21/22
Recursos

Aportes 25

Preguntas 5

Ordenar por:

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

o inicia sesi贸n.

Los 谩rboles de decisi贸n te dejan con una decisi贸n dif铆cil (#jajajajajaja no jodas#)鈥 Un 谩rbol profundo con muchas hojas se ajustar谩 demasiado porque cada predicci贸n proviene de datos hist贸ricos de solo las pocas casas en su hoja. Pero un 谩rbol poco profundo con pocas hojas tendr谩 un desempe帽o deficiente porque no logra capturar tantas distinciones en los datos sin procesar.

Incluso las t茅cnicas de modelado m谩s sofisticadas de la actualidad se enfrentan a esta tensi贸n entre el ajuste insuficiente y el ajuste excesivo. Sin embargo, muchos modelos tienen ideas inteligentes que pueden conducir a un mejor rendimiento. Veremos el bosque aleatorio como ejemplo.

El bosque aleatorio usa muchos 谩rboles y hace una predicci贸n promediando las predicciones de cada 谩rbol componente. Por lo general, tiene una precisi贸n predictiva mucho mejor que un 谩rbol de decisi贸n 煤nico y funciona bien con los par谩metros predeterminados. Si contin煤a modelando, puede aprender m谩s modelos con un rendimiento a煤n mejor, pero muchos de ellos son sensibles para obtener los par谩metros correctos.

from sklearn.ensemble import RandomForestClassifier
modelo = RandomForestClassifier()
modelo.fit(train_X, train_y)
resultado = modelo.score(test_X, test_y)
print(resultado) 

Con este codigo obtendran valores cercanos al 96% o 97%.

Comunidad! Les comparto los apuntes que tome de esta clase en Deepnote. Tambien lo complemente con otros art铆culos y videos disponibles en internet.

Hola, no s茅 muy bien porqu茅 pero al descargar el dataset desde Kaggle me aparec铆a una columna al final que creo que no aparece en la clase:

Por este motivo me daba un error al intentar imprimir el resultado. Lo solucione excluyendo esta columna de la variable X:

X = df.iloc[:,2:32]

Si alguien m谩s tiene este problema espero que esto les pueda ayudar. 馃槂

La validaci贸n cruzada es muy potente cuando usamos hiperpar谩metros en nuestros modelos, ya que aumenta la precisi贸n considerablemente. Sin embargo es buena pr谩ctica balancear los datos, ya que en la vida real pasa siempre que tenemos una clase mayoritaria.
La evaluci贸n con una matriz de decisi贸n es sumamente importante para detetectar falsos positivos y faltos negativos en nuestro modelo.

overfitting: hold-out vs cross-validation

El overfitting sucede cuando tu modelo se vuelve muy exacto al predecir datos con los que fue entrenado y no puede generalizar, cuando se le presentan nuevas muestras que nunca ha visto.
Este problema se soluciona con 2 t茅cnicas:
hold-out: partir el dataset en una proporci贸n para el entrenamiento y otra para las pruebas.
cross-validation: al igual que el de atr谩s se hacen particiones para el training y el test, pero en este caso se llevan a cabo varias pruebas con diferentes particiones, haciendo m谩s eficiente este m茅todo que el anterior.
Esta clase me gusto mucho ya que abarcan estos dos m茅todos para evitar el overfitting.
les recomiendo esta lectura:
https://medium.com/@eijaz/holdout-vs-cross-validation-in-machine-learning-7637112d3f8f

y DEBEN ver este buen video de DOTCSV donde explica el problema del overfitting:
https://www.youtube.com/watch?v=7-6X3DTt3R8

El dataframe tiene como ultima columna datos no numericos, asi que si sigues los pasos de la profesora el modelo va darte un error, para arreglarlo simplemente pon en la declaracion de x:

X = df.iloc[:,2:(df.shape[1]-1)]

Faltar铆a un ejemplo balanceado los datos, dado que en el mundo real las cosas no son como en Kaggle (Ejemplos limpios)

Combinando el aporte de Felix para balancear los datos y el aporte de Alfonso para crear un bosque de 谩rboles y no un 煤nico 谩rbol obtengo un Score del 99.45%

Es genial c贸mo aplicando varios conceptos los modelos son mucho mejores y eso que no apliqu茅 hiperparametros.

Estos fueron los m铆os y fueron resultados muy buenos:
[0.89473684 0.9122807 0.87719298 0.9122807 0.9122807 0.98245614
0.9122807 0.96491228 0.92982456 0.92857143]
0.9226817042606517

En el nuevo csv de Kaggle a帽aden una columna 鈥楿nnamed:32鈥 si bien pueden hacer un drop de ella pues solo contiene valores NaN, tambi茅n podr铆an no contar la ultima columna.

X = df.iloc[:, 2:-1]
Y = df.iloc[:,1]

Un aporte un poco purista. Silvia dice 鈥渁ccuracy鈥 y 鈥減recisi贸n鈥, como si fueran lo mismo. Sin embargo, estos conceptos no son lo mismo. Mientras que accuracy (traducci贸n: exactitud) significa qu茅 tan cercano es un modelo a la realidad, precision (traducci贸n: precisi贸n) se refiere a que tan similares son un conjunto de datos. En este caso, la validaci贸n cruzada busca analizar qu茅 tan 鈥減recisos鈥 y no 鈥渁ccurate鈥 o exactos son un conjunto de datos.

Siento que necesito repasar m谩s estos conceptos y aplicaciones, ya que del todo no me han quedado claros, de igual manera excelente clase!

Creo que de las clases m谩s interesantes que he tenido hasta ahora jejee

Si, mis valores son cercanos al 100%:[0.94736842 0.9122807 0.85964912 0.94736842 0.9122807 0.98245614
0.9122807 0.94736842 0.92982456 0.92857143]
0.9279448621553884, mi modelo tambi茅n est谩 validado

Mis resultados:
[0.94736842 0.9122807 0.87719298 0.9122807 0.92982456 0.98245614
0.9122807 0.98245614 0.92982456 0.92857143]
0.9314536340852131

Aunque son muy buenos los resultados, un accuracy >=90% nos habla sobre la presencia de overfit, lo que indica que el modelo no es capaz de generalizar, esto representa un problema si en un futuro al modelo se le presentan datos nuevos.

Tuve muy buenos resultados y de verdad me motiva a estudiar m谩s
[0.98245614 0.9122807 0.9122807 0.96491228 0.92982456 0.96491228
0.9122807 0.98245614 0.98245614 0.89285714]

Mis resultados

[0.9122807  0.9122807  0.89473684 0.94736842 0.94736842 0.98245614
 0.9122807  0.94736842 0.94736842 0.94642857]
0.9349937343358394

Mis resulados de la clase

[0.94736842 0.9122807  0.87719298 0.94736842 0.9122807  0.98245614
 0.9122807  0.96491228 0.92982456 0.94642857]
0.9332393483709274

Resumen de la clase

  • En Python, se puede utilizar la librer铆a 鈥淪cikit-learn鈥 para implementar la validaci贸n cruzada. La clase 鈥淜Fold鈥 de esta librer铆a se utiliza para dividir los datos en 鈥渇olds鈥 y luego se puede utilizar el m茅todo 鈥渃ross_val_score鈥 para entrenar y evaluar el modelo en cada fold.

  • Por ejemplo, si se quiere hacer una validaci贸n cruzada K-fold con k=5 en un modelo de regresi贸n lineal, se puede utilizar el siguiente c贸digo:

from sklearn.linear_model import LinearRegression
from sklearn.model_selection import KFold
from sklearn.model_selection import cross_val_score

# Crear el objeto del modelo
model = LinearRegression()

# Crear el objeto de validaci贸n cruzada K-fold
kfold = KFold(n_splits=5, shuffle=True, random_state=0)

# Evaluar el modelo utilizando validaci贸n cruzada
scores = cross_val_score(model, X, y, cv=kfold)

# Imprimir los resultados
print("Accuracy: %.2f%% (%.2f%%)" % (scores.mean()*100, scores.std()*100))

  • En este ejemplo, X es el conjunto de datos de entrada y y es el conjunto de datos objetivo. El par谩metro 鈥渘_splits鈥 es el n煤mero de divisiones a realizar, el par谩metro 鈥渟huffle鈥 indica si los datos deben ser mezclados antes de ser divididos, y el par谩metro 鈥渞andom_state鈥 es utilizado para establecer una semilla aleatoria.

La funci贸n cross_val_score devuelve un array con las puntuaciones obtenidas en cada fold, y se pueden calcular estad铆sticas como la media y la desviaci贸n est谩ndar para evaluar el rendimiento del modelo.

Mi aporte como qued贸:

#imprimir los promedios de los 10 primeros registros con la validacion cruzada y que luego imprima un promedio global
from sklearn.model_selection import cross_val_score

resultados = cross_val_score(modelo,x,y,cv = KFold_validacion)# con KFOLD se ponderan los promedios
print("Los promedios se desglosan as铆:", resultados) 
print("Se imprime el promedio general:", resultados.mean())#media o promedio

Los promedios se desglosan as铆: [0.94736842 0.9122807 0.9122807 0.94736842 0.89473684 0.96491228
0.9122807 0.94736842 0.92982456 0.94642857]
Se imprime el promedio general: 0.931484962406015

Hola Comunidad, les comparto mis resultados:
[0.92982456 0.9122807 0.87719298 0.96491228 0.89473684 0.98245614
0.9122807 0.94736842 0.94736842 0.91071429]
0.9279135338345865

Si quieren entender mejor el parametro Random State, les dejo este link de stackoverflow que lo explica muy bien: https://stackoverflow.com/questions/67186677/why-random-state-differs-in-test-train-split-of-scikit-learn

Los m铆os 馃槂
[0.96491228 0.9122807 0.87719298 0.94736842 0.94736842 0.98245614
0.89473684 0.96491228 0.94736842 0.92857143]
0.93671679197995

Mis resultados:

[0.89473684 0.9122807 0.87719298 0.94736842 0.89473684 0.98245614
0.89473684 0.94736842 0.92982456 0.89285714]

0.9173558897243106

Estos son mis resultados, un poco mas bajo el promedio pero bueno igual

[0.9122807 0.9122807 0.89473684 0.94736842 0.9122807 0.96491228
0.9122807 0.96491228 0.94736842 0.91071429]
0.9279135338345865