Reducción de Dimensionalidad y Regresión Logística con Python
Resumen
¿Cómo comienza el proceso de codificación?
Damos inicio a la codificación al importar las librerías necesarias. Comenzamos con pandas, utilizando el alias pd para simplificar su referencia en el código. A continuación, importamos Scikit-learn (sklearn) que es esencial para la implementación de algoritmos de aprendizaje automático. Para la visualización de gráficos, se emplea matplotlib.pyplot con el alias plt. Estas herramientas son fundamentales para manejar y procesar datos de manera eficiente.
¿Qué módulos de Scikit-learn son esenciales?
Dentro de scikit-learn, utilizamos módulos específicos para descomposición y clasificación. Del módulo de descomposición, importamos el algoritmo PCA y su variación incremental IncrementalPCA. Estos módulos son vitales para efectuar reducciones de dimensionalidad, optimizando el rendimiento de nuestros modelos sin perder información relevante. Además, implementamos un algoritmo de clasificación sencillo, la regresión logística, proveniente del submódulo linear_model.
PCA e IncrementalPCA: Permiten comparar la eficacia de estas dos técnicas, garantizando resultados casi idénticos.
Regresión logística: Aunque confusa por su nombre, actúa como un clasificador, no como un modelo de regresión.
Además, preparamos los datos importando otros dos módulos: uno para normalizar los datos, asegurando que se encuentren en una escala común, y otro para dividir estos datos en conjuntos de prueba y entrenamiento.
¿Cómo identificar el script principal?
Para asegurar la ejecución correcta de scripts, especialmente cuando trabajamos con múltiples archivos, utilizamos la directiva:
if __name__ =='__main__':# Código a ejecutar
Esta línea de código es crucial. Indica que el script actual es el principal, responsable de coordinar la ejecución del flujo total. Si este script llama a otros, estos no tendrán esta variable asignada, lo que previene la ejecución inadecuada de scripts secundarios al ser importados.
¿Cómo cargar y preparar los datos?
Una vez listas nuestras librerías, el siguiente paso es cargar los datos en un DataFrame de pandas. Se recomienda guardar los datos en una carpeta específica, como 'data', facilitando su identificación y manipulación.
Cargando los datos:
Usamos la función read_csv para cargar archivos .csv, asegurando que la ruta al archivo se especifica correctamente.
Estos comandos cargan los datos y verifican su correcta lectura imprimiendo las primeras filas del DataFrame.
¿Cómo se transforman y dividen los datos?
Con los datos cargados, es esencial prepararlos antes del entrenamiento del modelo. Esto implica la normalización y la división en conjuntos de entrenamiento y prueba.
Normalización:
El módulo StandardScaler de Scikit-learn normaliza los datos.
from sklearn.preprocessing import StandardScaler
scaler = StandardScaler()features_scaled = scaler.fit_transform(features)
División de datos:
Una vez normalizados, los datos se dividen utilizando train_test_split. Esta función esencial garantiza una repartición balanceada y aleatoria de los datos.
Aquí, especificamos que el 30% de los datos sean destinados a pruebas, mientras que el 70% restante se usará para entrenamiento. El uso de random_state asegura replicabilidad en experimentos futuros.
Al seguir estos pasos, los datos están listos para aplicar PCA y eventualmente ejecutar la regresión logística, lo que facilitará una correcta clasificación y análisis de las variables involucradas. ¡Continúa aprendiendo y perfeccionando tus habilidades en ciencia de datos!
Les dejo el código comentado, por si no les corre compañeros:
# Importamos las bibliotecas generalesimport pandas as pd
import sklearn
import matplotlib.pyplot as plt
# Importamos los módulos específicosfrom sklearn.decomposition import PCA
from sklearn.decomposition import IncrementalPCA
from sklearn.linear_model import LogisticRegression
from sklearn.preprocessing import StandardScaler
from sklearn.model_selection import train_test_split
if __name__ =="__main__":# Cargamos los datos del dataframe de pandas dt_heart = pd.read_csv('data/heart.csv')# Imprimimos un encabezado con los primeros 5 registrosprint(dt_heart.head(5))# Guardamos nuestro dataset sin la columna de target dt_features = dt_heart.drop(['target'], axis=1)# Este será nuestro dataset, pero sin la columna dt_target = dt_heart['target']# Normalizamos los datos dt_features = StandardScaler().fit_transform(dt_features)# Partimos el conjunto de entrenamiento. Para añadir replicabilidad usamos el random state X_train, X_test, y_train, y_test = train_test_split(dt_features, dt_target, test_size=0.3, random_state=42)
MIL GRACIAS
sos un genio mundial amigo!
¿Alguna vez se han preguntado por qué en ML la "X" se escribe en mayúsculas y la "y" en minúsculas?
Este es el motivo:
Fuente: Introduction to Machine Learning with Python, de Andreas C. Müller & Sarah Guido
100% recomendado ese libro :D
Genial, Siempre l osupuse que era asi todo el tiempo pero nunca me lo cuestione porque en mi mente lo vi logioco ahora esto me lo confirma, X es capital porque es un 2D array o matrix, mientras y es lower porque es solo un 1D_Array , osea una sola columna, demas es xX,y por lo de y = f(X), siempre ha sido asi desde los siglos antiguos.
Definitivamente me gusta más Jupyter Notebook o Google Collab Jajaja
totalmente deacuerdo en Google Collab no hay que instalar nada
y Jupyter Notebook 👌🏾 buenisismo
Personalmente también prefiero colab, pero es bueno hacer los ejercicios en local ya que en un entorno real, no siempre tendremos acceso a internet y es necesario en local, por ejemplo un robot con limitado acceso a internet (en Marte o la Luna por ejemplo). A demás te ayuda a entender más a fondo el funcionamiento de los scripts. Ya con estos conceptos bien claros se puede usar colab o cualquier otro cuaderno de jupiter.
La estandarizacion que hace sklearn con StandardScaler es:
z = x-u / s
u:media
s:desviacion estandar
Interesante saber esto, muchas gracias!
¿Qué es normalizar los datos en ML?
Para que funcionen mejor muchos algoritmos de Machine Learning usados en Data Science, hay que normalizar las variables de entrada al algoritmo. Normalizar significa, en este caso, comprimir o extender los valores de la variable para que estén en un rango definido. Sin embargo, una mala aplicación de la normalización, o una elección descuidada del método de normalización puede arruinar tus datos, y con ello tu análisis.
Ejemplo visto en clase:
Escalado estándar (Standard Scaler)
Una alternativa al escalado de variables es usar otra técnica conocida como escalado estándar (a cada dato se le resta la media de la variable y se le divide por la desviación típica).
Éste método funcionaría para normalizar la señal de la fibra óptica del ejemplo anterior, conservando su forma, pero, ¿qué pasará con otras señales?. Los dos estadísticos que se usan (media y desviación típica) son muy sensibles a valores anómalos (muy grandes o muy pequeños con respecto al resto).
Imaginemos otro ejemplo. Vamos a medir cuánto se usa la palabra “resaca” en publicaciones de Facebook (datos reales). La frecuencia de uso de esta palabra tiene picos durante el fin de semana y valles entre semana. Los datos tienen valores anormalmente altos en fiestas como Halloween y Navidad.
Antes de normalizar, calculamos la media (5.55) y la desviación típica (10.53). Ya podemos ver que la media está en torno a 5, cuando nuestros datos sin anomalias no pasan de valores en torno al 4 (mala señal). Si aplicamos ahora la normalización estándar, tenemos lo siguiente.
Lo primero que vemos es que no hemos conseguido normalizar entre 0-1 con este método. Además ahora tenemos valores negativos, cuando antes no los teníamos. Por si esto fuera poco, nuestros valores pico y valle han quedado muy atenuados por culpa de las anomalías. Una solución a esto sería eliminar las anomalías antes de normalizar (tema para otro post).
Análisis similares se puede hacer para otros métodos de normalización: escalar sobre máximo, normalizer, escalado robusto, etc. Puedes consultar una versión extendida de este análisis en este enlace.
Bibliografía:
.
Precauciones a la hora de normalizar datos en Data Science
Excelente aporte, me hubiera gustado que el profesor explicara porqué debía normalizar.
Hay un curso de esto ! es uno de esos de matemáticas que tiene Platzi.
El valor para "random_state" puede ser cualquier número, sin embargo casi siempre se utiliza el número 42. Aparentemente el número "42" fue elegido como un tributo a "Hitch-hiker's Guide" de Douglas Adams, ya que supuestamente era la respuesta a la gran pregunta de "La vida, el universo y todo" calculada por una super computadora con inteligencia artificial creada específicamente para resolver este misterio.
https://www.youtube.com/watch?v=tK0urw144cU
importante! El train_test_split se debe hacer antes de realizar el standardscaler ya que sino se hace en ese orden se estaría filtrando informacion al modelo. lo que se conoce como "data leakage"
Exactamente, de esta manera:
# Spliting our data
X_train,X_test, y_train, y_test =train_test_split( dt_features, dt_target, test_size=0.3, random_state=42) # Scaling our data
sc_x =StandardScaler().fit(X_train)X_train= sc_x.transform(X_train)X_test= sc_x.transform(X_test)print(X_train.shape)print(X_test.shape)
Hola a todos, acá la idea es no utilizar información de la porción de entrenamiento 'train' para escalar la porción de 'test', debido a que si no hacemos esto, estaríamos introduciendo información a los datos de 'test' que no tendríamos en condiciones reales, como lo indica @jmarinpavia260.
Es por ello que recomiendo ajustar o entrenar 2 escaladores (scalers), uno para 'train' y otro para 'test', así, a la hora de escalar, solamente estaríamos usando datos del 'test' para escalar el 'test' y sólo datos del 'train' para escalar el 'train'.
A continuación dejo un ejemplo.
Saludos !
No me quedó muy claro lo de random_state, en cursos anteriores entendía que se debía desactivar para no arrojar valores aleatorios. También me cuestiono, porque razón X_train usa mayúscula y y_train usa minúscula? supongo que es convención pero no comprendo la razón.
Es por convención:
X representa los features. Normalmente es una matriz, por eso la mayúscula.
y representa el target. Siempre es un vector, nunca una matriz, por eso la minúscula.
Gracias por tu respuesta.
No me parece buena idea dar estos curos en Visual Studio. Principalmente porque no te das cuenta oportunamente dónde está el error, tampoco puedes correr varias celdas a la vez para ir comparando, para explorar, para entender mejor el código.
Hola David, claro que lo puedes ver en VC, te sugiero instalar la extensión de jupiter notebook (.ipynb)
Para los que están en Linux, en Linux tenemos que poner el punto en el '.data/heart.csv
No así:
dt_heart = pd.read_csv('.data/heart.csv')
Sino, así:
dt_heart = pd.read_csv('data/heart.csv')
O les saldrá este espantoso error 😱:
Nota: La última ejecución ya fue sin el punto y la antepenúltima fue con punto, jejeje.
Me preguntaba por qué no había normalizado la variable y_target, pero cuando iba a hacer la pregunta me di cuenta de que era porque es categórica 😋. Por eso es importante analizar los datos ☝️.
Buena explicación la de este profesor.
Por qué importa primero la librería sklearn COMPLETA, y luego busca importar solo los módulos necesarios?
no era necesario
X = df_heart.drop(columns=["target"])y = df_heart["target"]X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)scaler = StandardScaler()X_train_scaled = scaler.fit_transform(X_train)X_test_scaled = scaler.transform(X_test)```Ese seria el orden correcto para esta clase
Yes sr!!
¿A qué se refiere específicamente en el minuto 7:13 con "Normalizar lo datos", cuál es el punto de este movimiento?
Hola, cuando se habla de normalizar una distribución de probabilidad se refiere a que la suma (si es discreta) o la integral (si es continua) de todos los datos debe ser igual a 1, es decir, al 100%.
Por ejemplo si en un experimento solo puedes obtener los resultados A, B y C, la suma de las probabilidades de los 3 tiene que ser el 100%.
Entonces, imagina que obtienes el evento A 40 veces, el B 50 veces y el C 10 veces. Tendrías el dataset[40, 50, 10].
Para trabajar correctamente debes normalizar esos datos, dividiendo por el número total de eventos, en este caso por 100, entonces el dataset te quedaría [0.4, 0.5, 0.1].
Supongo que el profe se refiera a eso
hola @ceporro muchas gracias por la respuesta
logre entender lo de dividir los datos
nos podrias explicar por que es necesario normalizar los datos??
muchas gracias
Si deseo que el estado del split sea random no es necesario usar el número de random?
Correcto :ok_hand:
¡En efecto! Eso permitirá probar diferentes configuraciones y tener una mejor perspectiva del modelo y su varianza. :)
porque no hemos normalizado dr_target?
Porque es una variable categorica. 0-1.
Si fuera una variable continua, por ejemplo [30-985], entonces si se normalizria, pero esto ya seria un problema de LinearRegression y no uno de classificación, como lo es el LogisticRegression.
Este curso es una chulada, vengo del de fundamentos practicos de machine learning y no explico NADA sobre train_test_split, estuve como 10 min buscando cada funcion y con varias dudas, si tan solo hubiera tenido este video antes.
Es curioso y agradable haber visto todas las clases de Platzi hasta llegar hasta este punto y entender e incorporar todo lo aprendido <3
Deberían actualizar este curso, ya lleva muchos muchos años