Machine Learning con Scikit-Learn
El Machine Learning es enseñar a la computadora a encontrar patrones. Aquí aprenderás el flujo de trabajo profesional: Limpiar -> Entrenar -> Evaluar -> Predecir.
1. Conceptos Básicos (El Vocabulario)
Antes de escribir código, necesitas entender qué le vamos a pedir a la máquina. Tienes el Glosario Completo en el botón del menú, pero aquí tienes lo esencial:
- .fit(datos, respuestas): "¡Estudia!" (Entrenar el modelo).
- .predict(datos_nuevos): "¡Examen!" (Haz una predicción).
- .score(datos, respuestas): "¿Qué nota has sacado?" (Evaluar precisión).
2. Estructura de Datos (X vs y)
En Excel tienes una sola tabla. En ML separamos la tabla en dos partes:
| X (Features / Características) | y (Target / Objetivo) | |
|---|---|---|
| Metros | Habitaciones | Precio (Lo que queremos predecir) |
| 80 | 2 | 150.000 |
| 120 | 3 | 250.000 |
import pandas as pd
# Cargamos datos
df = pd.read_csv("casas.csv")
# X = Todo MENOS la columna precio (Mayúscula porque es una matriz)
X = df.drop("Precio", axis=1)
# y = SOLO la columna precio (Minúscula porque es un vector)
y = df["Precio"]
3. Preprocesamiento: Limpiando Datos
Caso A: Texto a Números (Encoding)
Convertimos "Barrio" (Norte/Sur) en números.
from sklearn.preprocessing import OneHotEncoder
import pandas as pd
df = pd.DataFrame({"Barrio": ["Norte", "Sur", "Norte"]})
# get_dummies es la forma más rápida en Pandas
df_numerico = pd.get_dummies(df)
print(df_numerico)
# Salida:
# Barrio_Norte | Barrio_Sur
# 1 | 0
# 0 | 1
Caso B: Escalar Datos (Scaling)
Si mezclas "Salario" (20.000€) con "Edad" (30 años), el modelo se confundirá porque 20.000 es mucho mayor que 30. Usamos StandardScaler para ponerlos en la misma escala.
from sklearn.preprocessing import StandardScaler
scaler = StandardScaler()
# Ajustar y transformar los datos
X_escalado = scaler.fit_transform(X)
4. Train / Test Split (El Examen)
Guardamos el 20% de los datos en una caja fuerte. El modelo NO puede verlos mientras estudia. Los usamos luego para ver si ha aprendido o solo memorizado.
from sklearn.model_selection import train_test_split
# X_train: Datos para estudiar
# X_test: Datos para el examen (ocultos)
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
5. Regresión: Predecir Cantidades
Usamos regresión cuando la respuesta es un Número (Precio, Temperatura, Velocidad).
main.pyfrom sklearn.linear_model import LinearRegression
# 1. Crear el cerebro vacío
modelo = LinearRegression()
# 2. Entrenar (FIT) solo con datos de train
modelo.fit(X_train, y_train)
# 3. Predecir una casa nueva (ej: 100m, 2 habs)
nueva_casa = [[100, 2]]
prediccion = modelo.predict(nueva_casa)
print(f"Precio estimado: {prediccion[0]}€")
6. Clasificación: Predecir Categorías
Usamos clasificación cuando la respuesta es Sí/No o una etiqueta (Gato/Perro/Pájaro).
Ejemplo: ¿Tiene el paciente diabetes? (1=Sí, 0=No).
from sklearn.linear_model import LogisticRegression # ¡Ojo! Logistic es para clasificar
clf = LogisticRegression()
clf.fit(X_train, y_train)
# Predecir paciente
resultado = clf.predict([[50, 1.75, 80]]) # Edad, Altura, Peso
if resultado[0] == 1:
print("Positivo en Diabetes")
else:
print("Negativo (Sano)")
7. Evaluación Profesional
No basta con decir "acerté el 90%". Si es un test de cáncer, es muy grave decir que alguien está sano cuando no lo está (Falso Negativo).
Compara lo que dijo el modelo vs la Realidad.
from sklearn.metrics import confusion_matrix, accuracy_score
y_pred = clf.predict(X_test)
# Precisión global
nota = accuracy_score(y_test, y_pred)
print(f"Nota global: {nota}")
# Detalle de errores
matriz = confusion_matrix(y_test, y_pred)
print("Matriz de confusión:\n", matriz)
Interpretación visual:
| Aciertos Reales | Falsos Positivos (Alarma falsa) |
| Falsos Negativos (Peligro) | Aciertos Negativos |
8. Optimización (GridSearchCV)
Los modelos tienen configuraciones internas llamadas "hiperparámetros". ¿Cómo sabemos cuál es la mejor configuración? Probándolas todas automáticamente.
from sklearn.model_selection import GridSearchCV
from sklearn.neighbors import KNeighborsClassifier
knn = KNeighborsClassifier()
# Definimos qué probar: ¿3 vecinos? ¿5? ¿7?
parametros = {'n_neighbors': [3, 5, 7, 9]}
# El GridSearch prueba todas las combinaciones
buscador = GridSearchCV(knn, parametros, cv=5)
buscador.fit(X_train, y_train)
print(f"La mejor configuración es: {buscador.best_params_}")
9. Persistencia (Guardar IA)
Entrenar tarda tiempo. Guarda tu modelo en un archivo para usarlo mañana sin re-entrenar.
import joblib
# Guardar
joblib.dump(modelo, 'cerebro_ia.pkl')
print("Modelo guardado en disco.")
# --- Al día siguiente ---
cerebro_cargado = joblib.load('cerebro_ia.pkl')
cerebro_cargado.predict(nueva_casa)