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:

🔑 Las 3 Palabras Mágicas
  • .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)
802150.000
1203250.000
Python
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

⚠️ Regla de Oro: Los modelos de ML NO entienden texto. Solo entienden números. Si le das "Rojo", fallará. Tienes que convertirlo a números.

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.py
from 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).

Matriz de Confusión:
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 RealesFalsos 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)