Menu iconMenu icon
Héroe del Aprendizaje Automático

Capítulo 4: Técnicas de Aprendizaje Supervisado

4.1 Regresión Lineal y Polinómica

El aprendizaje supervisado se destaca como una de las ramas más prominentes y ampliamente aplicadas dentro del vasto campo del aprendizaje automático. Este enfoque implica entrenar algoritmos en conjuntos de datos etiquetados, donde cada ejemplo de entrada se empareja meticulosamente con su etiqueta de salida correspondiente.

El objetivo principal del aprendizaje supervisado es permitir que el modelo discierna y comprenda las complejas relaciones entre las características de entrada y las variables objetivo. De este modo, el modelo se vuelve capaz de realizar predicciones precisas para nuevos datos que no ha visto antes.

El ámbito del aprendizaje supervisado abarca dos categorías principales, cada una de las cuales se adapta a tipos específicos de tareas de predicción:

  • Regresión: Esta categoría se ocupa de variables objetivo continuas, lo que permite realizar predicciones numéricas precisas. Algunos ejemplos incluyen la predicción de precios de casas en función de diversas características, la estimación de cambios de temperatura a lo largo del tiempo o la predicción de precios futuros de acciones de una empresa basándose en datos históricos y en indicadores del mercado.
  • Clasificación: A diferencia de la regresión, la clasificación se enfoca en variables objetivo categóricas. Implica asignar datos de entrada a clases o categorías predefinidas. Las aplicaciones comunes incluyen determinar si un correo electrónico es spam o legítimo, diagnosticar enfermedades basándose en los resultados de pruebas médicas, o identificar la especie de una planta basándose en sus características físicas.

Este capítulo explora las técnicas de aprendizaje supervisado más importantes y ampliamente utilizadas. Comenzamos examinando los fundamentos de la regresión lineal y polinómica, que sirven como base para comprender modelos de regresión más complejos.

Posteriormente, nos adentramos en el ámbito de los algoritmos de clasificación, donde elucidaremos métodos clave como la regresión logística, árboles de decisión y máquinas de soporte vectorial (SVM). Cada una de estas técnicas ofrece fortalezas únicas y se adapta a diferentes tipos de problemas de clasificación, proporcionando un conjunto de herramientas completas para abordar una amplia gama de desafíos del aprendizaje automático en el mundo real.

La regresión lineal es la forma más simple y fundamental de análisis de regresión en el aprendizaje automático. Esta técnica modela la relación entre una o más características de entrada (variables independientes) y una variable objetivo continua (variable dependiente) ajustando una línea recta a través de los puntos de datos. El objetivo principal de la regresión lineal es encontrar la línea que mejor se ajusta, minimizando el error de predicción general.

En su forma más simple, la regresión lineal asume una relación lineal entre las variables de entrada y salida. Esto significa que los cambios en las variables de entrada resultan en cambios proporcionales en la variable de salida. El modelo aprende a partir de datos etiquetados de entrenamiento para determinar los parámetros óptimos (pendiente e intercepto) de la línea, que luego pueden usarse para hacer predicciones sobre datos nuevos y no vistos.

Las principales características de la regresión lineal incluyen:

  • Simplicidad: La regresión lineal ofrece un enfoque sencillo y fácil de implementar, lo que la convierte en un excelente punto de partida para muchos problemas de regresión. Su naturaleza simple permite que incluso los principiantes en aprendizaje automático comprendan rápidamente sus conceptos y los apliquen de manera efectiva.
  • Interpretabilidad: Una de las principales fortalezas de la regresión lineal radica en su alto grado de interpretabilidad. Los coeficientes del modelo representan directamente el impacto de cada característica sobre la variable objetivo, lo que permite obtener información clara sobre las relaciones entre las variables. Esta transparencia es particularmente valiosa en campos donde comprender los factores subyacentes es tan importante como hacer predicciones precisas.
  • Eficiencia: La regresión lineal demuestra un rendimiento impresionante con recursos computacionales limitados, especialmente al trabajar con conjuntos de datos pequeños. Esta eficiencia la convierte en una opción ideal para análisis rápidos o en entornos donde el poder computacional está limitado, sin sacrificar la calidad de los resultados.
  • Versatilidad: A pesar de su aparente simplicidad, la regresión lineal posee una notable versatilidad. Se puede extender para manejar múltiples características de entrada a través de la regresión lineal múltiple, lo que permite análisis más complejos. Además, puede transformarse para modelar relaciones no lineales mediante técnicas como la regresión polinómica, ampliando su aplicabilidad a una gama más amplia de escenarios del mundo real.

Si bien la regresión lineal es poderosa en su simplicidad, es importante tener en cuenta que asume una relación lineal entre las variables y puede no capturar patrones no lineales complejos en los datos. En tales casos, es posible que se necesiten técnicas de regresión más avanzadas o modelos de aprendizaje automático más complejos.

La línea en la regresión lineal está definida por una ecuación lineal, que forma la base de las predicciones del modelo:

y = β₀ + β₁x₁ + β₂x₂ + ... + βₙxₙ + ε

Esta ecuación representa cómo el modelo calcula sus predicciones y se desglosa de la siguiente manera:

  • y es el valor predicho (variable objetivo)
  • β₀ es la intersección con el eje y (término de sesgo), que representa el valor predicho cuando todas las características son cero
  • β₁, β₂, ..., βₙ son los coeficientes (pesos) que determinan el impacto de cada característica en la predicción
  • x₁, x₂, ..., xₙ son las características de entrada (variables independientes)
  • ε es el término de error, que representa la diferencia entre los valores predichos y los reales

Comprender esta ecuación es crucial, ya que forma la base de la regresión lineal y ayuda a interpretar el comportamiento y los resultados del modelo.

4.1.1 Regresión Lineal

En la regresión lineal, el objetivo principal es determinar los coeficientes (pesos) óptimos que minimicen la discrepancia entre los valores predichos y los valores reales. Este proceso es crucial para crear un modelo que represente con precisión la relación entre las características de entrada y la variable objetivo.

Para lograr este objetivo, la regresión lineal generalmente emplea una técnica llamada "minimización del error cuadrático medio (MSE)". El MSE es una medida de la diferencia promedio al cuadrado entre los valores predichos y los valores reales. Aquí tienes una explicación más detallada de este proceso:

  1. Predicción: El modelo hace predicciones basadas en los coeficientes actuales.
  2. Cálculo del error: Para cada punto de datos, se calcula la diferencia entre el valor predicho y el valor real. Esta diferencia se denomina error o residuo.
  3. Elevar al cuadrado: Cada error se eleva al cuadrado. Este paso tiene dos propósitos:
    • Asegura que todos los errores sean positivos, evitando que los errores negativos cancelen los positivos.
    • Penaliza más fuertemente los errores grandes, fomentando que el modelo minimice los valores atípicos.
  4. Cálculo del promedio: Se calcula el promedio de todos estos errores cuadrados, lo que da como resultado el MSE.
  5. Optimización: El modelo ajusta sus coeficientes para minimizar este MSE, generalmente utilizando técnicas como el descenso de gradiente.

Al ajustar iterativamente los coeficientes para minimizar el MSE, el modelo de regresión lineal mejora gradualmente sus predicciones, encontrando finalmente la línea que mejor se ajusta a los datos. Este proceso garantiza que las predicciones del modelo sean lo más cercanas posible a los valores reales en todo el conjunto de datos.

a. Regresión Lineal Simple

En la regresión lineal simple, el modelo se enfoca en la relación entre una sola característica de entrada (variable independiente) y una variable objetivo (variable dependiente). Este enfoque sencillo permite un análisis directo de cómo los cambios en la característica de entrada afectan directamente a la variable objetivo.

La simplicidad de este método lo convierte en un excelente punto de partida para comprender el análisis de regresión y proporciona una base para técnicas de regresión más complejas.

La ecuación para la regresión lineal simple puede expresarse como:

y = β₀ + β₁x + ε

Donde:

  • y es la variable objetivo (variable dependiente)
  • x es la característica de entrada (variable independiente)
  • β₀ es la intersección con el eje y (el valor de y cuando x es 0)
  • β₁ es la pendiente (el cambio en y por un cambio unitario en x)
  • ε es el término de error (representa la variabilidad no explicada por la relación lineal)

Ejemplo: Regresión Lineal Simple con Scikit-learn

import numpy as np
import matplotlib.pyplot as plt
from sklearn.linear_model import LinearRegression
from sklearn.metrics import mean_squared_error, r2_score
from sklearn.model_selection import train_test_split

# Generate sample data (Hours studied vs. Exam score)
np.random.seed(42)
X = np.random.rand(100, 1) * 10  # 100 random values between 0 and 10
y = 2 * X + 1 + np.random.randn(100, 1) * 2  # Linear relationship with some noise

# Split the data into training and testing sets
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

# Initialize and train the linear regression model
model = LinearRegression()
model.fit(X_train, y_train)

# Make predictions on the test set
y_pred = model.predict(X_test)

# Calculate performance metrics
mse = mean_squared_error(y_test, y_pred)
r2 = r2_score(y_test, y_pred)

# Predict for new values
X_new = np.array([[6], [7], [8]])
y_new_pred = model.predict(X_new)

# Plotting the data and the regression line
plt.figure(figsize=(10, 6))
plt.scatter(X_train, y_train, color='blue', label='Training data')
plt.scatter(X_test, y_test, color='green', label='Testing data')
plt.plot(X, model.predict(X), color='red', label='Regression line')
plt.xlabel("Hours Studied")
plt.ylabel("Exam Score")
plt.title("Linear Regression: Hours Studied vs. Exam Score")
plt.legend()
plt.grid(True)
plt.show()

# Print results
print(f"Model coefficients: {model.coef_[0][0]:.2f}")
print(f"Model intercept: {model.intercept_[0]:.2f}")
print(f"Mean squared error: {mse:.2f}")
print(f"R-squared score: {r2:.2f}")
print(f"Predicted exam scores for new values (6, 7, 8 hours):")
for hours, score in zip(X_new, y_new_pred):
    print(f"  {hours[0]} hours: {score[0]:.2f}")

Explicación del Desglose del Código:

  1. Importación de Bibliotecas:
    • Importamos numpy para operaciones numéricas, matplotlib para graficar y varias funciones de sklearn para tareas de machine learning.
  2. Generación de Datos:
    • En lugar de usar un conjunto de datos pequeño predefinido, generamos un conjunto de datos más realista con 100 muestras.
    • Usamos las funciones aleatorias de numpy para crear horas de estudio (X) entre 0 y 10, y calificaciones de exámenes (y) con una relación lineal más algo de ruido aleatorio.
  3. División de Datos:
    • Dividimos los datos en conjuntos de entrenamiento (80%) y prueba (20%) usando train_test_split.
    • Esto nos permite evaluar el rendimiento del modelo con datos no vistos previamente.
  4. Entrenamiento del Modelo:
    • Creamos un modelo de Regresión Lineal (LinearRegression) y lo ajustamos con los datos de entrenamiento.
  5. Evaluación del Modelo:
    • Hacemos predicciones sobre el conjunto de prueba y calculamos dos métricas comunes de rendimiento:
      • Error Cuadrático Medio (MSE): Mide la diferencia cuadrada promedio entre los valores predichos y los valores reales.
      • Coeficiente de Determinación (R²): Indica la proporción de la varianza en la variable dependiente que es predecible a partir de la variable independiente.
  6. Nuevas Predicciones:
    • Predecimos las calificaciones de exámenes para nuevos valores (6, 7 y 8 horas de estudio).
  7. Visualización:
    • Creamos un gráfico más informativo que muestra:
      • Puntos de datos de entrenamiento (azul)
      • Puntos de datos de prueba (verde)
      • La línea de regresión (roja)
    • El gráfico incluye un título, leyenda y cuadrícula para mayor legibilidad.
  8. Resultados:
    • Imprimimos los coeficientes del modelo (pendiente) y la intersección, que definen la línea de regresión.
    • Mostramos el MSE y el coeficiente R² para cuantificar el rendimiento del modelo.
    • Finalmente, mostramos las calificaciones predichas para los nuevos valores.

Este ejemplo de código ofrece una visión más completa del proceso de regresión lineal, incluyendo la generación de datos, evaluación del modelo e interpretación de resultados. Demuestra las mejores prácticas como la división de datos y el uso de múltiples métricas de evaluación, que son cruciales en aplicaciones reales de machine learning.

b. Regresión Lineal Múltiple

La regresión lineal múltiple es una técnica avanzada que extiende el concepto de regresión lineal simple para incluir dos o más características de entrada (variables independientes). Este método permite un análisis más completo de las relaciones complejas en los datos.

Aquí tienes una visión más profunda de la regresión lineal múltiple:

  1. Estructura del Modelo: En la regresión lineal múltiple, el modelo intenta establecer una relación lineal entre varias variables independientes y una única variable dependiente (objetivo). La forma general de la ecuación es:

    y = β₀ + β₁x₁ + β₂x₂ + ... + βₙxₙ + ε

    Donde y es la variable objetivo, x₁, x₂, ..., xₙ son las características de entrada, β₀ es la intersección, β₁, β₂, ..., βₙ son los coeficientes para cada característica y ε es el término de error.

  2. Interacción de Características: A diferencia de la regresión lineal simple, la regresión lineal múltiple puede capturar cómo diferentes características interactúan para influir en la variable objetivo. Esto permite una comprensión más matizada de los datos.
  3. Interpretación de Coeficientes: Cada coeficiente (β) representa el cambio en la variable objetivo por un cambio de una unidad en la característica correspondiente, suponiendo que todas las demás características permanezcan constantes. Esto permite una evaluación individual del impacto de cada característica.
  4. Complejidad Aumentada: Aunque ofrece más poder explicativo, la regresión lineal múltiple también introduce una mayor complejidad. Problemas como la multicolinealidad (alta correlación entre características) deben gestionarse cuidadosamente.
  5. Aplicaciones: Esta técnica se utiliza ampliamente en diversos campos como la economía, las finanzas y las ciencias sociales, donde múltiples factores a menudo influyen en un resultado.

Al incorporar múltiples características, este modelo proporciona un enfoque más completo para comprender y predecir relaciones complejas en los datos, lo que lo convierte en una herramienta poderosa en el ámbito del aprendizaje supervisado.

Ejemplo: Regresión Lineal Múltiple con Scikit-learn

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from sklearn.linear_model import LinearRegression
from sklearn.model_selection import train_test_split
from sklearn.metrics import mean_squared_error, r2_score

# Sample data (Features: hours studied, number of practice tests, Target: exam score)
data = {
    'Hours_Studied': [1, 2, 3, 4, 5, 6, 7, 8, 9, 10],
    'Practice_Tests': [1, 2, 2, 3, 3, 4, 4, 5, 5, 6],
    'Exam_Score': [50, 60, 65, 70, 75, 80, 85, 90, 92, 95]
}
df = pd.DataFrame(data)

# Features (X) and target (y)
X = df[['Hours_Studied', 'Practice_Tests']]
y = df['Exam_Score']

# Split the data into training and testing sets
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

# Initialize and train the linear regression model
model = LinearRegression()
model.fit(X_train, y_train)

# Make predictions on the test set
y_pred = model.predict(X_test)

# Calculate performance metrics
mse = mean_squared_error(y_test, y_pred)
r2 = r2_score(y_test, y_pred)

# Print model coefficients and intercept
print("Model Coefficients:")
print(f"Hours Studied: {model.coef_[0]:.2f}")
print(f"Practice Tests: {model.coef_[1]:.2f}")
print(f"Intercept: {model.intercept_:.2f}")

# Print performance metrics
print(f"\nMean Squared Error: {mse:.2f}")
print(f"R-squared Score: {r2:.2f}")

# Predict exam scores for new data
X_new = np.array([[6, 2], [7, 3], [8, 3]])
y_new_pred = model.predict(X_new)

print("\nPredicted exam scores for new values:")
for i, (hours, tests) in enumerate(X_new):
    print(f"Hours Studied: {hours}, Practice Tests: {tests}, Predicted Score: {y_new_pred[i]:.2f}")

# Visualize the results
fig = plt.figure(figsize=(12, 5))

# Plot for Hours Studied
ax1 = fig.add_subplot(121, projection='3d')
ax1.scatter(X['Hours_Studied'], X['Practice_Tests'], y, c='b', marker='o')
ax1.set_xlabel('Hours Studied')
ax1.set_ylabel('Practice Tests')
ax1.set_zlabel('Exam Score')
ax1.set_title('3D Scatter Plot of Data')

# Create a mesh grid for the prediction surface
xx, yy = np.meshgrid(np.linspace(X['Hours_Studied'].min(), X['Hours_Studied'].max(), 10),
                     np.linspace(X['Practice_Tests'].min(), X['Practice_Tests'].max(), 10))
Z = model.predict(np.c_[xx.ravel(), yy.ravel()]).reshape(xx.shape)

# Plot the prediction surface
ax1.plot_surface(xx, yy, Z, alpha=0.5)

# Plot residuals
ax2 = fig.add_subplot(122)
ax2.scatter(y_pred, y_test - y_pred, c='r', marker='o')
ax2.set_xlabel('Predicted Values')
ax2.set_ylabel('Residuals')
ax2.set_title('Residual Plot')
ax2.axhline(y=0, color='k', linestyle='--')

plt.tight_layout()
plt.show()

Explicación del Desglose del Código:

  1. Importación de Bibliotecas:
    • Importamos numpy para operaciones numéricas, pandas para la manipulación de datos, matplotlib para graficar y varias funciones de sklearn para tareas de machine learning.
  2. Preparación de Datos:
    • Creamos un conjunto de datos más grande con 10 muestras, que incluyen horas de estudio, número de pruebas de práctica y calificaciones de exámenes.
    • Los datos se almacenan en un DataFrame de pandas para facilitar su manipulación.
  3. División de Datos:
    • Dividimos los datos en características (X) y la variable objetivo (y).
    • Los datos se dividen aún más en conjuntos de entrenamiento (80%) y prueba (20%) utilizando train_test_split.
  4. Entrenamiento del Modelo:
    • Creamos un modelo de Regresión Lineal (LinearRegression) y lo ajustamos con los datos de entrenamiento.
  5. Evaluación del Modelo:
    • Realizamos predicciones sobre el conjunto de prueba y calculamos dos métricas comunes de rendimiento:
    • Error Cuadrático Medio (MSE): Mide la diferencia cuadrada promedio entre los valores predichos y los valores reales.
    • Coeficiente de Determinación (R²): Indica la proporción de la varianza en la variable dependiente que es predecible a partir de las variables independientes.
  6. Interpretación del Modelo:
    • Imprimimos los coeficientes para cada característica y la intersección, lo que ayuda a interpretar el comportamiento del modelo.
  7. Nuevas Predicciones:
    • Predecimos las calificaciones de los exámenes para nuevos valores (combinaciones de horas de estudio y pruebas de práctica).
  8. Visualización:
    • Creamos dos gráficos para visualizar los resultados:
      • Un gráfico de dispersión 3D que muestra la relación entre horas de estudio, pruebas de práctica y calificaciones de exámenes, junto con la superficie de predicción.
      • Un gráfico de residuos para verificar si hay patrones en los errores del modelo.

Este ejemplo proporciona una visión más completa del proceso de regresión lineal múltiple, que incluye la preparación de datos, evaluación del modelo, interpretación y visualización. Demuestra mejores prácticas como la división de datos, el uso de múltiples métricas de evaluación y la visualización de resultados, que son cruciales en aplicaciones de machine learning en el mundo real.

4.1.2 Regresión Polinómica

La regresión polinómica es una extensión avanzada de la regresión lineal que nos permite modelar relaciones complejas y no lineales entre las características de entrada y la variable objetivo. Esto se logra incorporando términos polinómicos en la ecuación de regresión, lo que permite una representación más flexible y matizada de los datos.

En esencia, la regresión polinómica transforma las características originales elevándolas a diferentes potencias, creando nuevas características que capturan patrones no lineales. Por ejemplo, una relación cuadrática se puede modelar como:

y = β₀ + β₁x + β₂x² + ε

Donde:

  • y es la variable objetivo
  • x es la característica de entrada
  • β₀ es la intersección
  • β₁ y β₂ son los coeficientes
  • ε es el término de error

Esta ecuación permite relaciones curvas entre x e y, a diferencia de la línea recta de la regresión lineal simple.

Es importante notar que, a pesar de su nombre, la regresión polinómica sigue utilizando un modelo lineal en su núcleo. El aspecto 'polinómico' proviene de la transformación aplicada a las características de entrada. Al agregar estas características transformadas (por ejemplo, x², x³, etc.), creamos un modelo que puede ajustar patrones no lineales en los datos.

La belleza de este enfoque radica en su capacidad para capturar relaciones complejas mientras conserva la simplicidad y la interpretabilidad de la regresión lineal. El modelo sigue siendo lineal en sus parámetros (los coeficientes β), lo que significa que aún podemos usar mínimos cuadrados ordinarios para la estimación y beneficiarnos de las propiedades estadísticas de los modelos lineales.

Sin embargo, es crucial usar la regresión polinómica con precaución. Aunque puede capturar patrones no lineales, usar un polinomio de grado demasiado alto puede llevar a sobreajuste, donde el modelo funciona bien con los datos de entrenamiento, pero mal con datos nuevos no vistos. Por lo tanto, seleccionar el grado adecuado del polinomio es una consideración clave en esta técnica.

Aplicación de la Regresión Polinómica con Scikit-learn

Scikit-learn ofrece una herramienta poderosa llamada PolynomialFeatures que simplifica el proceso de incorporar términos polinómicos en nuestras características de entrada. Esta clase automatiza la creación de características polinómicas de mayor grado, lo que nos permite transformar sin esfuerzo nuestro modelo de regresión lineal en uno polinómico.

Al utilizar PolynomialFeatures, podemos explorar y capturar relaciones no lineales en nuestros datos sin tener que calcular manualmente términos polinómicos complejos. Esta funcionalidad resulta particularmente útil cuando trabajamos con conjuntos de datos donde la relación entre las variables no es estrictamente lineal, lo que nos permite modelar patrones más intrincados y, potencialmente, mejorar nuestra precisión predictiva.

Ejemplo: Regresión Polinómica con Scikit-learn

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from sklearn.preprocessing import PolynomialFeatures
from sklearn.linear_model import LinearRegression
from sklearn.model_selection import train_test_split
from sklearn.metrics import mean_squared_error, r2_score

# Generate sample data (Hours studied vs. Exam score with a non-linear relationship)
np.random.seed(42)
X = np.random.rand(100, 1) * 10
y = 3 * X**2 + 2 * X + 5 + np.random.randn(100, 1) * 5

# Split the data into training and testing sets
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

# Create polynomial features (degree 2)
poly = PolynomialFeatures(degree=2)
X_train_poly = poly.fit_transform(X_train)
X_test_poly = poly.transform(X_test)

# Train the polynomial regression model
model = LinearRegression()
model.fit(X_train_poly, y_train)

# Make predictions on the test set
y_pred = model.predict(X_test_poly)

# Calculate performance metrics
mse = mean_squared_error(y_test, y_pred)
r2 = r2_score(y_test, y_pred)

# Print model coefficients and performance metrics
print("Model Coefficients:")
for i, coef in enumerate(model.coef_[0]):
    print(f"Degree {i}: {coef:.4f}")
print(f"Intercept: {model.intercept_[0]:.4f}")
print(f"\nMean Squared Error: {mse:.4f}")
print(f"R-squared Score: {r2:.4f}")

# Predict for new values
X_new = np.array([[6], [7], [8]])
X_new_poly = poly.transform(X_new)
y_new_pred = model.predict(X_new_poly)

print("\nPredicted exam scores for new values:")
for hours, score in zip(X_new, y_new_pred):
    print(f"Hours Studied: {hours[0]:.1f}, Predicted Score: {score[0]:.2f}")

# Plot the data and the polynomial regression curve
plt.figure(figsize=(12, 6))

# Scatter plot of original data
plt.scatter(X, y, color='blue', alpha=0.5, label='Original data')

# Polynomial regression curve
X_plot = np.linspace(0, 10, 100).reshape(-1, 1)
X_plot_poly = poly.transform(X_plot)
y_plot = model.predict(X_plot_poly)
plt.plot(X_plot, y_plot, color='red', label='Polynomial regression curve')

# Scatter plot of test data
plt.scatter(X_test, y_test, color='green', alpha=0.7, label='Test data')

# Scatter plot of predictions on test data
plt.scatter(X_test, y_pred, color='orange', alpha=0.7, label='Predictions')

plt.xlabel("Hours Studied")
plt.ylabel("Exam Score")
plt.title("Polynomial Regression: Hours Studied vs. Exam Score")
plt.legend()
plt.grid(True, alpha=0.3)
plt.show()

# Residual plot
plt.figure(figsize=(10, 6))
residuals = y_test - y_pred
plt.scatter(y_pred, residuals, color='purple', alpha=0.7)
plt.xlabel("Predicted Values")
plt.ylabel("Residuals")
plt.title("Residual Plot")
plt.axhline(y=0, color='r', linestyle='--')
plt.grid(True, alpha=0.3)
plt.show()

Explicación del Desglose del Código:

  1. Importación de Bibliotecas:
    • Importamos numpy para operaciones numéricas, pandas para manipulación de datos, matplotlib para graficar y varias funciones de sklearn para tareas de machine learning.
  2. Generación de Datos:
    • Creamos un conjunto de datos sintéticos con 100 muestras, representando horas de estudio (X) y calificaciones de exámenes (y).
    • La relación entre X e y es no lineal, siguiendo una función cuadrática con algo de ruido añadido.
  3. División de Datos:
    • Dividimos los datos en conjuntos de entrenamiento (80%) y prueba (20%) utilizando train_test_split.
    • Esto nos permite evaluar el rendimiento del modelo con datos no vistos previamente.
  4. Ingeniería de Características:
    • Usamos PolynomialFeatures para crear términos polinómicos de hasta grado 2.
    • Esto transforma nuestras características de entrada para incluir términos x², lo que permite que el modelo capture relaciones no lineales.
  5. Entrenamiento del Modelo:
    • Creamos un modelo de Regresión Lineal (LinearRegression) y lo ajustamos con los datos transformados polinómicamente del conjunto de entrenamiento.
  6. Evaluación del Modelo:
    • Realizamos predicciones sobre el conjunto de prueba y calculamos dos métricas comunes de rendimiento:
      • Error Cuadrático Medio (MSE): Mide la diferencia cuadrada promedio entre los valores predichos y los valores reales.
      • Coeficiente de Determinación (R²): Indica la proporción de la varianza en la variable dependiente que es predecible a partir de las variables independientes.
  7. Interpretación del Modelo:
    • Imprimimos los coeficientes para cada término polinómico y la intersección, lo que ayuda a interpretar el comportamiento del modelo.
  8. Nuevas Predicciones:
    • Predecimos calificaciones de exámenes para nuevos valores de horas de estudio (6, 7 y 8 horas).
  9. Visualización:
    • Creamos dos gráficos para visualizar los resultados:
      • Un gráfico de dispersión que muestra los datos originales, los datos de prueba, las predicciones y la curva de regresión polinómica.
      • Un gráfico de residuos para verificar si hay patrones en los errores del modelo.

Este ejemplo proporciona una visión más completa del proceso de regresión polinómica, que incluye la generación de datos, división, evaluación del modelo, interpretación y visualización. Demuestra mejores prácticas como el uso de conjuntos de entrenamiento y prueba por separado, la evaluación con múltiples métricas y la visualización tanto del ajuste del modelo como de los residuos.

Estas prácticas son cruciales en aplicaciones de machine learning en el mundo real para garantizar la fiabilidad del modelo y obtener información sobre su rendimiento.

En conclusión, la regresión lineal y la polinómica son técnicas fundamentales en el aprendizaje supervisado para modelar relaciones entre las características de entrada y las variables objetivo continuas. La regresión lineal es útil cuando la relación es aproximadamente lineal, mientras que la regresión polinómica nos permite capturar relaciones no lineales transformando las características. Estas técnicas forman la base para métodos de regresión más avanzados y son fundamentales para resolver una amplia gama de tareas de modelado predictivo.

4.1 Regresión Lineal y Polinómica

El aprendizaje supervisado se destaca como una de las ramas más prominentes y ampliamente aplicadas dentro del vasto campo del aprendizaje automático. Este enfoque implica entrenar algoritmos en conjuntos de datos etiquetados, donde cada ejemplo de entrada se empareja meticulosamente con su etiqueta de salida correspondiente.

El objetivo principal del aprendizaje supervisado es permitir que el modelo discierna y comprenda las complejas relaciones entre las características de entrada y las variables objetivo. De este modo, el modelo se vuelve capaz de realizar predicciones precisas para nuevos datos que no ha visto antes.

El ámbito del aprendizaje supervisado abarca dos categorías principales, cada una de las cuales se adapta a tipos específicos de tareas de predicción:

  • Regresión: Esta categoría se ocupa de variables objetivo continuas, lo que permite realizar predicciones numéricas precisas. Algunos ejemplos incluyen la predicción de precios de casas en función de diversas características, la estimación de cambios de temperatura a lo largo del tiempo o la predicción de precios futuros de acciones de una empresa basándose en datos históricos y en indicadores del mercado.
  • Clasificación: A diferencia de la regresión, la clasificación se enfoca en variables objetivo categóricas. Implica asignar datos de entrada a clases o categorías predefinidas. Las aplicaciones comunes incluyen determinar si un correo electrónico es spam o legítimo, diagnosticar enfermedades basándose en los resultados de pruebas médicas, o identificar la especie de una planta basándose en sus características físicas.

Este capítulo explora las técnicas de aprendizaje supervisado más importantes y ampliamente utilizadas. Comenzamos examinando los fundamentos de la regresión lineal y polinómica, que sirven como base para comprender modelos de regresión más complejos.

Posteriormente, nos adentramos en el ámbito de los algoritmos de clasificación, donde elucidaremos métodos clave como la regresión logística, árboles de decisión y máquinas de soporte vectorial (SVM). Cada una de estas técnicas ofrece fortalezas únicas y se adapta a diferentes tipos de problemas de clasificación, proporcionando un conjunto de herramientas completas para abordar una amplia gama de desafíos del aprendizaje automático en el mundo real.

La regresión lineal es la forma más simple y fundamental de análisis de regresión en el aprendizaje automático. Esta técnica modela la relación entre una o más características de entrada (variables independientes) y una variable objetivo continua (variable dependiente) ajustando una línea recta a través de los puntos de datos. El objetivo principal de la regresión lineal es encontrar la línea que mejor se ajusta, minimizando el error de predicción general.

En su forma más simple, la regresión lineal asume una relación lineal entre las variables de entrada y salida. Esto significa que los cambios en las variables de entrada resultan en cambios proporcionales en la variable de salida. El modelo aprende a partir de datos etiquetados de entrenamiento para determinar los parámetros óptimos (pendiente e intercepto) de la línea, que luego pueden usarse para hacer predicciones sobre datos nuevos y no vistos.

Las principales características de la regresión lineal incluyen:

  • Simplicidad: La regresión lineal ofrece un enfoque sencillo y fácil de implementar, lo que la convierte en un excelente punto de partida para muchos problemas de regresión. Su naturaleza simple permite que incluso los principiantes en aprendizaje automático comprendan rápidamente sus conceptos y los apliquen de manera efectiva.
  • Interpretabilidad: Una de las principales fortalezas de la regresión lineal radica en su alto grado de interpretabilidad. Los coeficientes del modelo representan directamente el impacto de cada característica sobre la variable objetivo, lo que permite obtener información clara sobre las relaciones entre las variables. Esta transparencia es particularmente valiosa en campos donde comprender los factores subyacentes es tan importante como hacer predicciones precisas.
  • Eficiencia: La regresión lineal demuestra un rendimiento impresionante con recursos computacionales limitados, especialmente al trabajar con conjuntos de datos pequeños. Esta eficiencia la convierte en una opción ideal para análisis rápidos o en entornos donde el poder computacional está limitado, sin sacrificar la calidad de los resultados.
  • Versatilidad: A pesar de su aparente simplicidad, la regresión lineal posee una notable versatilidad. Se puede extender para manejar múltiples características de entrada a través de la regresión lineal múltiple, lo que permite análisis más complejos. Además, puede transformarse para modelar relaciones no lineales mediante técnicas como la regresión polinómica, ampliando su aplicabilidad a una gama más amplia de escenarios del mundo real.

Si bien la regresión lineal es poderosa en su simplicidad, es importante tener en cuenta que asume una relación lineal entre las variables y puede no capturar patrones no lineales complejos en los datos. En tales casos, es posible que se necesiten técnicas de regresión más avanzadas o modelos de aprendizaje automático más complejos.

La línea en la regresión lineal está definida por una ecuación lineal, que forma la base de las predicciones del modelo:

y = β₀ + β₁x₁ + β₂x₂ + ... + βₙxₙ + ε

Esta ecuación representa cómo el modelo calcula sus predicciones y se desglosa de la siguiente manera:

  • y es el valor predicho (variable objetivo)
  • β₀ es la intersección con el eje y (término de sesgo), que representa el valor predicho cuando todas las características son cero
  • β₁, β₂, ..., βₙ son los coeficientes (pesos) que determinan el impacto de cada característica en la predicción
  • x₁, x₂, ..., xₙ son las características de entrada (variables independientes)
  • ε es el término de error, que representa la diferencia entre los valores predichos y los reales

Comprender esta ecuación es crucial, ya que forma la base de la regresión lineal y ayuda a interpretar el comportamiento y los resultados del modelo.

4.1.1 Regresión Lineal

En la regresión lineal, el objetivo principal es determinar los coeficientes (pesos) óptimos que minimicen la discrepancia entre los valores predichos y los valores reales. Este proceso es crucial para crear un modelo que represente con precisión la relación entre las características de entrada y la variable objetivo.

Para lograr este objetivo, la regresión lineal generalmente emplea una técnica llamada "minimización del error cuadrático medio (MSE)". El MSE es una medida de la diferencia promedio al cuadrado entre los valores predichos y los valores reales. Aquí tienes una explicación más detallada de este proceso:

  1. Predicción: El modelo hace predicciones basadas en los coeficientes actuales.
  2. Cálculo del error: Para cada punto de datos, se calcula la diferencia entre el valor predicho y el valor real. Esta diferencia se denomina error o residuo.
  3. Elevar al cuadrado: Cada error se eleva al cuadrado. Este paso tiene dos propósitos:
    • Asegura que todos los errores sean positivos, evitando que los errores negativos cancelen los positivos.
    • Penaliza más fuertemente los errores grandes, fomentando que el modelo minimice los valores atípicos.
  4. Cálculo del promedio: Se calcula el promedio de todos estos errores cuadrados, lo que da como resultado el MSE.
  5. Optimización: El modelo ajusta sus coeficientes para minimizar este MSE, generalmente utilizando técnicas como el descenso de gradiente.

Al ajustar iterativamente los coeficientes para minimizar el MSE, el modelo de regresión lineal mejora gradualmente sus predicciones, encontrando finalmente la línea que mejor se ajusta a los datos. Este proceso garantiza que las predicciones del modelo sean lo más cercanas posible a los valores reales en todo el conjunto de datos.

a. Regresión Lineal Simple

En la regresión lineal simple, el modelo se enfoca en la relación entre una sola característica de entrada (variable independiente) y una variable objetivo (variable dependiente). Este enfoque sencillo permite un análisis directo de cómo los cambios en la característica de entrada afectan directamente a la variable objetivo.

La simplicidad de este método lo convierte en un excelente punto de partida para comprender el análisis de regresión y proporciona una base para técnicas de regresión más complejas.

La ecuación para la regresión lineal simple puede expresarse como:

y = β₀ + β₁x + ε

Donde:

  • y es la variable objetivo (variable dependiente)
  • x es la característica de entrada (variable independiente)
  • β₀ es la intersección con el eje y (el valor de y cuando x es 0)
  • β₁ es la pendiente (el cambio en y por un cambio unitario en x)
  • ε es el término de error (representa la variabilidad no explicada por la relación lineal)

Ejemplo: Regresión Lineal Simple con Scikit-learn

import numpy as np
import matplotlib.pyplot as plt
from sklearn.linear_model import LinearRegression
from sklearn.metrics import mean_squared_error, r2_score
from sklearn.model_selection import train_test_split

# Generate sample data (Hours studied vs. Exam score)
np.random.seed(42)
X = np.random.rand(100, 1) * 10  # 100 random values between 0 and 10
y = 2 * X + 1 + np.random.randn(100, 1) * 2  # Linear relationship with some noise

# Split the data into training and testing sets
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

# Initialize and train the linear regression model
model = LinearRegression()
model.fit(X_train, y_train)

# Make predictions on the test set
y_pred = model.predict(X_test)

# Calculate performance metrics
mse = mean_squared_error(y_test, y_pred)
r2 = r2_score(y_test, y_pred)

# Predict for new values
X_new = np.array([[6], [7], [8]])
y_new_pred = model.predict(X_new)

# Plotting the data and the regression line
plt.figure(figsize=(10, 6))
plt.scatter(X_train, y_train, color='blue', label='Training data')
plt.scatter(X_test, y_test, color='green', label='Testing data')
plt.plot(X, model.predict(X), color='red', label='Regression line')
plt.xlabel("Hours Studied")
plt.ylabel("Exam Score")
plt.title("Linear Regression: Hours Studied vs. Exam Score")
plt.legend()
plt.grid(True)
plt.show()

# Print results
print(f"Model coefficients: {model.coef_[0][0]:.2f}")
print(f"Model intercept: {model.intercept_[0]:.2f}")
print(f"Mean squared error: {mse:.2f}")
print(f"R-squared score: {r2:.2f}")
print(f"Predicted exam scores for new values (6, 7, 8 hours):")
for hours, score in zip(X_new, y_new_pred):
    print(f"  {hours[0]} hours: {score[0]:.2f}")

Explicación del Desglose del Código:

  1. Importación de Bibliotecas:
    • Importamos numpy para operaciones numéricas, matplotlib para graficar y varias funciones de sklearn para tareas de machine learning.
  2. Generación de Datos:
    • En lugar de usar un conjunto de datos pequeño predefinido, generamos un conjunto de datos más realista con 100 muestras.
    • Usamos las funciones aleatorias de numpy para crear horas de estudio (X) entre 0 y 10, y calificaciones de exámenes (y) con una relación lineal más algo de ruido aleatorio.
  3. División de Datos:
    • Dividimos los datos en conjuntos de entrenamiento (80%) y prueba (20%) usando train_test_split.
    • Esto nos permite evaluar el rendimiento del modelo con datos no vistos previamente.
  4. Entrenamiento del Modelo:
    • Creamos un modelo de Regresión Lineal (LinearRegression) y lo ajustamos con los datos de entrenamiento.
  5. Evaluación del Modelo:
    • Hacemos predicciones sobre el conjunto de prueba y calculamos dos métricas comunes de rendimiento:
      • Error Cuadrático Medio (MSE): Mide la diferencia cuadrada promedio entre los valores predichos y los valores reales.
      • Coeficiente de Determinación (R²): Indica la proporción de la varianza en la variable dependiente que es predecible a partir de la variable independiente.
  6. Nuevas Predicciones:
    • Predecimos las calificaciones de exámenes para nuevos valores (6, 7 y 8 horas de estudio).
  7. Visualización:
    • Creamos un gráfico más informativo que muestra:
      • Puntos de datos de entrenamiento (azul)
      • Puntos de datos de prueba (verde)
      • La línea de regresión (roja)
    • El gráfico incluye un título, leyenda y cuadrícula para mayor legibilidad.
  8. Resultados:
    • Imprimimos los coeficientes del modelo (pendiente) y la intersección, que definen la línea de regresión.
    • Mostramos el MSE y el coeficiente R² para cuantificar el rendimiento del modelo.
    • Finalmente, mostramos las calificaciones predichas para los nuevos valores.

Este ejemplo de código ofrece una visión más completa del proceso de regresión lineal, incluyendo la generación de datos, evaluación del modelo e interpretación de resultados. Demuestra las mejores prácticas como la división de datos y el uso de múltiples métricas de evaluación, que son cruciales en aplicaciones reales de machine learning.

b. Regresión Lineal Múltiple

La regresión lineal múltiple es una técnica avanzada que extiende el concepto de regresión lineal simple para incluir dos o más características de entrada (variables independientes). Este método permite un análisis más completo de las relaciones complejas en los datos.

Aquí tienes una visión más profunda de la regresión lineal múltiple:

  1. Estructura del Modelo: En la regresión lineal múltiple, el modelo intenta establecer una relación lineal entre varias variables independientes y una única variable dependiente (objetivo). La forma general de la ecuación es:

    y = β₀ + β₁x₁ + β₂x₂ + ... + βₙxₙ + ε

    Donde y es la variable objetivo, x₁, x₂, ..., xₙ son las características de entrada, β₀ es la intersección, β₁, β₂, ..., βₙ son los coeficientes para cada característica y ε es el término de error.

  2. Interacción de Características: A diferencia de la regresión lineal simple, la regresión lineal múltiple puede capturar cómo diferentes características interactúan para influir en la variable objetivo. Esto permite una comprensión más matizada de los datos.
  3. Interpretación de Coeficientes: Cada coeficiente (β) representa el cambio en la variable objetivo por un cambio de una unidad en la característica correspondiente, suponiendo que todas las demás características permanezcan constantes. Esto permite una evaluación individual del impacto de cada característica.
  4. Complejidad Aumentada: Aunque ofrece más poder explicativo, la regresión lineal múltiple también introduce una mayor complejidad. Problemas como la multicolinealidad (alta correlación entre características) deben gestionarse cuidadosamente.
  5. Aplicaciones: Esta técnica se utiliza ampliamente en diversos campos como la economía, las finanzas y las ciencias sociales, donde múltiples factores a menudo influyen en un resultado.

Al incorporar múltiples características, este modelo proporciona un enfoque más completo para comprender y predecir relaciones complejas en los datos, lo que lo convierte en una herramienta poderosa en el ámbito del aprendizaje supervisado.

Ejemplo: Regresión Lineal Múltiple con Scikit-learn

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from sklearn.linear_model import LinearRegression
from sklearn.model_selection import train_test_split
from sklearn.metrics import mean_squared_error, r2_score

# Sample data (Features: hours studied, number of practice tests, Target: exam score)
data = {
    'Hours_Studied': [1, 2, 3, 4, 5, 6, 7, 8, 9, 10],
    'Practice_Tests': [1, 2, 2, 3, 3, 4, 4, 5, 5, 6],
    'Exam_Score': [50, 60, 65, 70, 75, 80, 85, 90, 92, 95]
}
df = pd.DataFrame(data)

# Features (X) and target (y)
X = df[['Hours_Studied', 'Practice_Tests']]
y = df['Exam_Score']

# Split the data into training and testing sets
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

# Initialize and train the linear regression model
model = LinearRegression()
model.fit(X_train, y_train)

# Make predictions on the test set
y_pred = model.predict(X_test)

# Calculate performance metrics
mse = mean_squared_error(y_test, y_pred)
r2 = r2_score(y_test, y_pred)

# Print model coefficients and intercept
print("Model Coefficients:")
print(f"Hours Studied: {model.coef_[0]:.2f}")
print(f"Practice Tests: {model.coef_[1]:.2f}")
print(f"Intercept: {model.intercept_:.2f}")

# Print performance metrics
print(f"\nMean Squared Error: {mse:.2f}")
print(f"R-squared Score: {r2:.2f}")

# Predict exam scores for new data
X_new = np.array([[6, 2], [7, 3], [8, 3]])
y_new_pred = model.predict(X_new)

print("\nPredicted exam scores for new values:")
for i, (hours, tests) in enumerate(X_new):
    print(f"Hours Studied: {hours}, Practice Tests: {tests}, Predicted Score: {y_new_pred[i]:.2f}")

# Visualize the results
fig = plt.figure(figsize=(12, 5))

# Plot for Hours Studied
ax1 = fig.add_subplot(121, projection='3d')
ax1.scatter(X['Hours_Studied'], X['Practice_Tests'], y, c='b', marker='o')
ax1.set_xlabel('Hours Studied')
ax1.set_ylabel('Practice Tests')
ax1.set_zlabel('Exam Score')
ax1.set_title('3D Scatter Plot of Data')

# Create a mesh grid for the prediction surface
xx, yy = np.meshgrid(np.linspace(X['Hours_Studied'].min(), X['Hours_Studied'].max(), 10),
                     np.linspace(X['Practice_Tests'].min(), X['Practice_Tests'].max(), 10))
Z = model.predict(np.c_[xx.ravel(), yy.ravel()]).reshape(xx.shape)

# Plot the prediction surface
ax1.plot_surface(xx, yy, Z, alpha=0.5)

# Plot residuals
ax2 = fig.add_subplot(122)
ax2.scatter(y_pred, y_test - y_pred, c='r', marker='o')
ax2.set_xlabel('Predicted Values')
ax2.set_ylabel('Residuals')
ax2.set_title('Residual Plot')
ax2.axhline(y=0, color='k', linestyle='--')

plt.tight_layout()
plt.show()

Explicación del Desglose del Código:

  1. Importación de Bibliotecas:
    • Importamos numpy para operaciones numéricas, pandas para la manipulación de datos, matplotlib para graficar y varias funciones de sklearn para tareas de machine learning.
  2. Preparación de Datos:
    • Creamos un conjunto de datos más grande con 10 muestras, que incluyen horas de estudio, número de pruebas de práctica y calificaciones de exámenes.
    • Los datos se almacenan en un DataFrame de pandas para facilitar su manipulación.
  3. División de Datos:
    • Dividimos los datos en características (X) y la variable objetivo (y).
    • Los datos se dividen aún más en conjuntos de entrenamiento (80%) y prueba (20%) utilizando train_test_split.
  4. Entrenamiento del Modelo:
    • Creamos un modelo de Regresión Lineal (LinearRegression) y lo ajustamos con los datos de entrenamiento.
  5. Evaluación del Modelo:
    • Realizamos predicciones sobre el conjunto de prueba y calculamos dos métricas comunes de rendimiento:
    • Error Cuadrático Medio (MSE): Mide la diferencia cuadrada promedio entre los valores predichos y los valores reales.
    • Coeficiente de Determinación (R²): Indica la proporción de la varianza en la variable dependiente que es predecible a partir de las variables independientes.
  6. Interpretación del Modelo:
    • Imprimimos los coeficientes para cada característica y la intersección, lo que ayuda a interpretar el comportamiento del modelo.
  7. Nuevas Predicciones:
    • Predecimos las calificaciones de los exámenes para nuevos valores (combinaciones de horas de estudio y pruebas de práctica).
  8. Visualización:
    • Creamos dos gráficos para visualizar los resultados:
      • Un gráfico de dispersión 3D que muestra la relación entre horas de estudio, pruebas de práctica y calificaciones de exámenes, junto con la superficie de predicción.
      • Un gráfico de residuos para verificar si hay patrones en los errores del modelo.

Este ejemplo proporciona una visión más completa del proceso de regresión lineal múltiple, que incluye la preparación de datos, evaluación del modelo, interpretación y visualización. Demuestra mejores prácticas como la división de datos, el uso de múltiples métricas de evaluación y la visualización de resultados, que son cruciales en aplicaciones de machine learning en el mundo real.

4.1.2 Regresión Polinómica

La regresión polinómica es una extensión avanzada de la regresión lineal que nos permite modelar relaciones complejas y no lineales entre las características de entrada y la variable objetivo. Esto se logra incorporando términos polinómicos en la ecuación de regresión, lo que permite una representación más flexible y matizada de los datos.

En esencia, la regresión polinómica transforma las características originales elevándolas a diferentes potencias, creando nuevas características que capturan patrones no lineales. Por ejemplo, una relación cuadrática se puede modelar como:

y = β₀ + β₁x + β₂x² + ε

Donde:

  • y es la variable objetivo
  • x es la característica de entrada
  • β₀ es la intersección
  • β₁ y β₂ son los coeficientes
  • ε es el término de error

Esta ecuación permite relaciones curvas entre x e y, a diferencia de la línea recta de la regresión lineal simple.

Es importante notar que, a pesar de su nombre, la regresión polinómica sigue utilizando un modelo lineal en su núcleo. El aspecto 'polinómico' proviene de la transformación aplicada a las características de entrada. Al agregar estas características transformadas (por ejemplo, x², x³, etc.), creamos un modelo que puede ajustar patrones no lineales en los datos.

La belleza de este enfoque radica en su capacidad para capturar relaciones complejas mientras conserva la simplicidad y la interpretabilidad de la regresión lineal. El modelo sigue siendo lineal en sus parámetros (los coeficientes β), lo que significa que aún podemos usar mínimos cuadrados ordinarios para la estimación y beneficiarnos de las propiedades estadísticas de los modelos lineales.

Sin embargo, es crucial usar la regresión polinómica con precaución. Aunque puede capturar patrones no lineales, usar un polinomio de grado demasiado alto puede llevar a sobreajuste, donde el modelo funciona bien con los datos de entrenamiento, pero mal con datos nuevos no vistos. Por lo tanto, seleccionar el grado adecuado del polinomio es una consideración clave en esta técnica.

Aplicación de la Regresión Polinómica con Scikit-learn

Scikit-learn ofrece una herramienta poderosa llamada PolynomialFeatures que simplifica el proceso de incorporar términos polinómicos en nuestras características de entrada. Esta clase automatiza la creación de características polinómicas de mayor grado, lo que nos permite transformar sin esfuerzo nuestro modelo de regresión lineal en uno polinómico.

Al utilizar PolynomialFeatures, podemos explorar y capturar relaciones no lineales en nuestros datos sin tener que calcular manualmente términos polinómicos complejos. Esta funcionalidad resulta particularmente útil cuando trabajamos con conjuntos de datos donde la relación entre las variables no es estrictamente lineal, lo que nos permite modelar patrones más intrincados y, potencialmente, mejorar nuestra precisión predictiva.

Ejemplo: Regresión Polinómica con Scikit-learn

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from sklearn.preprocessing import PolynomialFeatures
from sklearn.linear_model import LinearRegression
from sklearn.model_selection import train_test_split
from sklearn.metrics import mean_squared_error, r2_score

# Generate sample data (Hours studied vs. Exam score with a non-linear relationship)
np.random.seed(42)
X = np.random.rand(100, 1) * 10
y = 3 * X**2 + 2 * X + 5 + np.random.randn(100, 1) * 5

# Split the data into training and testing sets
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

# Create polynomial features (degree 2)
poly = PolynomialFeatures(degree=2)
X_train_poly = poly.fit_transform(X_train)
X_test_poly = poly.transform(X_test)

# Train the polynomial regression model
model = LinearRegression()
model.fit(X_train_poly, y_train)

# Make predictions on the test set
y_pred = model.predict(X_test_poly)

# Calculate performance metrics
mse = mean_squared_error(y_test, y_pred)
r2 = r2_score(y_test, y_pred)

# Print model coefficients and performance metrics
print("Model Coefficients:")
for i, coef in enumerate(model.coef_[0]):
    print(f"Degree {i}: {coef:.4f}")
print(f"Intercept: {model.intercept_[0]:.4f}")
print(f"\nMean Squared Error: {mse:.4f}")
print(f"R-squared Score: {r2:.4f}")

# Predict for new values
X_new = np.array([[6], [7], [8]])
X_new_poly = poly.transform(X_new)
y_new_pred = model.predict(X_new_poly)

print("\nPredicted exam scores for new values:")
for hours, score in zip(X_new, y_new_pred):
    print(f"Hours Studied: {hours[0]:.1f}, Predicted Score: {score[0]:.2f}")

# Plot the data and the polynomial regression curve
plt.figure(figsize=(12, 6))

# Scatter plot of original data
plt.scatter(X, y, color='blue', alpha=0.5, label='Original data')

# Polynomial regression curve
X_plot = np.linspace(0, 10, 100).reshape(-1, 1)
X_plot_poly = poly.transform(X_plot)
y_plot = model.predict(X_plot_poly)
plt.plot(X_plot, y_plot, color='red', label='Polynomial regression curve')

# Scatter plot of test data
plt.scatter(X_test, y_test, color='green', alpha=0.7, label='Test data')

# Scatter plot of predictions on test data
plt.scatter(X_test, y_pred, color='orange', alpha=0.7, label='Predictions')

plt.xlabel("Hours Studied")
plt.ylabel("Exam Score")
plt.title("Polynomial Regression: Hours Studied vs. Exam Score")
plt.legend()
plt.grid(True, alpha=0.3)
plt.show()

# Residual plot
plt.figure(figsize=(10, 6))
residuals = y_test - y_pred
plt.scatter(y_pred, residuals, color='purple', alpha=0.7)
plt.xlabel("Predicted Values")
plt.ylabel("Residuals")
plt.title("Residual Plot")
plt.axhline(y=0, color='r', linestyle='--')
plt.grid(True, alpha=0.3)
plt.show()

Explicación del Desglose del Código:

  1. Importación de Bibliotecas:
    • Importamos numpy para operaciones numéricas, pandas para manipulación de datos, matplotlib para graficar y varias funciones de sklearn para tareas de machine learning.
  2. Generación de Datos:
    • Creamos un conjunto de datos sintéticos con 100 muestras, representando horas de estudio (X) y calificaciones de exámenes (y).
    • La relación entre X e y es no lineal, siguiendo una función cuadrática con algo de ruido añadido.
  3. División de Datos:
    • Dividimos los datos en conjuntos de entrenamiento (80%) y prueba (20%) utilizando train_test_split.
    • Esto nos permite evaluar el rendimiento del modelo con datos no vistos previamente.
  4. Ingeniería de Características:
    • Usamos PolynomialFeatures para crear términos polinómicos de hasta grado 2.
    • Esto transforma nuestras características de entrada para incluir términos x², lo que permite que el modelo capture relaciones no lineales.
  5. Entrenamiento del Modelo:
    • Creamos un modelo de Regresión Lineal (LinearRegression) y lo ajustamos con los datos transformados polinómicamente del conjunto de entrenamiento.
  6. Evaluación del Modelo:
    • Realizamos predicciones sobre el conjunto de prueba y calculamos dos métricas comunes de rendimiento:
      • Error Cuadrático Medio (MSE): Mide la diferencia cuadrada promedio entre los valores predichos y los valores reales.
      • Coeficiente de Determinación (R²): Indica la proporción de la varianza en la variable dependiente que es predecible a partir de las variables independientes.
  7. Interpretación del Modelo:
    • Imprimimos los coeficientes para cada término polinómico y la intersección, lo que ayuda a interpretar el comportamiento del modelo.
  8. Nuevas Predicciones:
    • Predecimos calificaciones de exámenes para nuevos valores de horas de estudio (6, 7 y 8 horas).
  9. Visualización:
    • Creamos dos gráficos para visualizar los resultados:
      • Un gráfico de dispersión que muestra los datos originales, los datos de prueba, las predicciones y la curva de regresión polinómica.
      • Un gráfico de residuos para verificar si hay patrones en los errores del modelo.

Este ejemplo proporciona una visión más completa del proceso de regresión polinómica, que incluye la generación de datos, división, evaluación del modelo, interpretación y visualización. Demuestra mejores prácticas como el uso de conjuntos de entrenamiento y prueba por separado, la evaluación con múltiples métricas y la visualización tanto del ajuste del modelo como de los residuos.

Estas prácticas son cruciales en aplicaciones de machine learning en el mundo real para garantizar la fiabilidad del modelo y obtener información sobre su rendimiento.

En conclusión, la regresión lineal y la polinómica son técnicas fundamentales en el aprendizaje supervisado para modelar relaciones entre las características de entrada y las variables objetivo continuas. La regresión lineal es útil cuando la relación es aproximadamente lineal, mientras que la regresión polinómica nos permite capturar relaciones no lineales transformando las características. Estas técnicas forman la base para métodos de regresión más avanzados y son fundamentales para resolver una amplia gama de tareas de modelado predictivo.

4.1 Regresión Lineal y Polinómica

El aprendizaje supervisado se destaca como una de las ramas más prominentes y ampliamente aplicadas dentro del vasto campo del aprendizaje automático. Este enfoque implica entrenar algoritmos en conjuntos de datos etiquetados, donde cada ejemplo de entrada se empareja meticulosamente con su etiqueta de salida correspondiente.

El objetivo principal del aprendizaje supervisado es permitir que el modelo discierna y comprenda las complejas relaciones entre las características de entrada y las variables objetivo. De este modo, el modelo se vuelve capaz de realizar predicciones precisas para nuevos datos que no ha visto antes.

El ámbito del aprendizaje supervisado abarca dos categorías principales, cada una de las cuales se adapta a tipos específicos de tareas de predicción:

  • Regresión: Esta categoría se ocupa de variables objetivo continuas, lo que permite realizar predicciones numéricas precisas. Algunos ejemplos incluyen la predicción de precios de casas en función de diversas características, la estimación de cambios de temperatura a lo largo del tiempo o la predicción de precios futuros de acciones de una empresa basándose en datos históricos y en indicadores del mercado.
  • Clasificación: A diferencia de la regresión, la clasificación se enfoca en variables objetivo categóricas. Implica asignar datos de entrada a clases o categorías predefinidas. Las aplicaciones comunes incluyen determinar si un correo electrónico es spam o legítimo, diagnosticar enfermedades basándose en los resultados de pruebas médicas, o identificar la especie de una planta basándose en sus características físicas.

Este capítulo explora las técnicas de aprendizaje supervisado más importantes y ampliamente utilizadas. Comenzamos examinando los fundamentos de la regresión lineal y polinómica, que sirven como base para comprender modelos de regresión más complejos.

Posteriormente, nos adentramos en el ámbito de los algoritmos de clasificación, donde elucidaremos métodos clave como la regresión logística, árboles de decisión y máquinas de soporte vectorial (SVM). Cada una de estas técnicas ofrece fortalezas únicas y se adapta a diferentes tipos de problemas de clasificación, proporcionando un conjunto de herramientas completas para abordar una amplia gama de desafíos del aprendizaje automático en el mundo real.

La regresión lineal es la forma más simple y fundamental de análisis de regresión en el aprendizaje automático. Esta técnica modela la relación entre una o más características de entrada (variables independientes) y una variable objetivo continua (variable dependiente) ajustando una línea recta a través de los puntos de datos. El objetivo principal de la regresión lineal es encontrar la línea que mejor se ajusta, minimizando el error de predicción general.

En su forma más simple, la regresión lineal asume una relación lineal entre las variables de entrada y salida. Esto significa que los cambios en las variables de entrada resultan en cambios proporcionales en la variable de salida. El modelo aprende a partir de datos etiquetados de entrenamiento para determinar los parámetros óptimos (pendiente e intercepto) de la línea, que luego pueden usarse para hacer predicciones sobre datos nuevos y no vistos.

Las principales características de la regresión lineal incluyen:

  • Simplicidad: La regresión lineal ofrece un enfoque sencillo y fácil de implementar, lo que la convierte en un excelente punto de partida para muchos problemas de regresión. Su naturaleza simple permite que incluso los principiantes en aprendizaje automático comprendan rápidamente sus conceptos y los apliquen de manera efectiva.
  • Interpretabilidad: Una de las principales fortalezas de la regresión lineal radica en su alto grado de interpretabilidad. Los coeficientes del modelo representan directamente el impacto de cada característica sobre la variable objetivo, lo que permite obtener información clara sobre las relaciones entre las variables. Esta transparencia es particularmente valiosa en campos donde comprender los factores subyacentes es tan importante como hacer predicciones precisas.
  • Eficiencia: La regresión lineal demuestra un rendimiento impresionante con recursos computacionales limitados, especialmente al trabajar con conjuntos de datos pequeños. Esta eficiencia la convierte en una opción ideal para análisis rápidos o en entornos donde el poder computacional está limitado, sin sacrificar la calidad de los resultados.
  • Versatilidad: A pesar de su aparente simplicidad, la regresión lineal posee una notable versatilidad. Se puede extender para manejar múltiples características de entrada a través de la regresión lineal múltiple, lo que permite análisis más complejos. Además, puede transformarse para modelar relaciones no lineales mediante técnicas como la regresión polinómica, ampliando su aplicabilidad a una gama más amplia de escenarios del mundo real.

Si bien la regresión lineal es poderosa en su simplicidad, es importante tener en cuenta que asume una relación lineal entre las variables y puede no capturar patrones no lineales complejos en los datos. En tales casos, es posible que se necesiten técnicas de regresión más avanzadas o modelos de aprendizaje automático más complejos.

La línea en la regresión lineal está definida por una ecuación lineal, que forma la base de las predicciones del modelo:

y = β₀ + β₁x₁ + β₂x₂ + ... + βₙxₙ + ε

Esta ecuación representa cómo el modelo calcula sus predicciones y se desglosa de la siguiente manera:

  • y es el valor predicho (variable objetivo)
  • β₀ es la intersección con el eje y (término de sesgo), que representa el valor predicho cuando todas las características son cero
  • β₁, β₂, ..., βₙ son los coeficientes (pesos) que determinan el impacto de cada característica en la predicción
  • x₁, x₂, ..., xₙ son las características de entrada (variables independientes)
  • ε es el término de error, que representa la diferencia entre los valores predichos y los reales

Comprender esta ecuación es crucial, ya que forma la base de la regresión lineal y ayuda a interpretar el comportamiento y los resultados del modelo.

4.1.1 Regresión Lineal

En la regresión lineal, el objetivo principal es determinar los coeficientes (pesos) óptimos que minimicen la discrepancia entre los valores predichos y los valores reales. Este proceso es crucial para crear un modelo que represente con precisión la relación entre las características de entrada y la variable objetivo.

Para lograr este objetivo, la regresión lineal generalmente emplea una técnica llamada "minimización del error cuadrático medio (MSE)". El MSE es una medida de la diferencia promedio al cuadrado entre los valores predichos y los valores reales. Aquí tienes una explicación más detallada de este proceso:

  1. Predicción: El modelo hace predicciones basadas en los coeficientes actuales.
  2. Cálculo del error: Para cada punto de datos, se calcula la diferencia entre el valor predicho y el valor real. Esta diferencia se denomina error o residuo.
  3. Elevar al cuadrado: Cada error se eleva al cuadrado. Este paso tiene dos propósitos:
    • Asegura que todos los errores sean positivos, evitando que los errores negativos cancelen los positivos.
    • Penaliza más fuertemente los errores grandes, fomentando que el modelo minimice los valores atípicos.
  4. Cálculo del promedio: Se calcula el promedio de todos estos errores cuadrados, lo que da como resultado el MSE.
  5. Optimización: El modelo ajusta sus coeficientes para minimizar este MSE, generalmente utilizando técnicas como el descenso de gradiente.

Al ajustar iterativamente los coeficientes para minimizar el MSE, el modelo de regresión lineal mejora gradualmente sus predicciones, encontrando finalmente la línea que mejor se ajusta a los datos. Este proceso garantiza que las predicciones del modelo sean lo más cercanas posible a los valores reales en todo el conjunto de datos.

a. Regresión Lineal Simple

En la regresión lineal simple, el modelo se enfoca en la relación entre una sola característica de entrada (variable independiente) y una variable objetivo (variable dependiente). Este enfoque sencillo permite un análisis directo de cómo los cambios en la característica de entrada afectan directamente a la variable objetivo.

La simplicidad de este método lo convierte en un excelente punto de partida para comprender el análisis de regresión y proporciona una base para técnicas de regresión más complejas.

La ecuación para la regresión lineal simple puede expresarse como:

y = β₀ + β₁x + ε

Donde:

  • y es la variable objetivo (variable dependiente)
  • x es la característica de entrada (variable independiente)
  • β₀ es la intersección con el eje y (el valor de y cuando x es 0)
  • β₁ es la pendiente (el cambio en y por un cambio unitario en x)
  • ε es el término de error (representa la variabilidad no explicada por la relación lineal)

Ejemplo: Regresión Lineal Simple con Scikit-learn

import numpy as np
import matplotlib.pyplot as plt
from sklearn.linear_model import LinearRegression
from sklearn.metrics import mean_squared_error, r2_score
from sklearn.model_selection import train_test_split

# Generate sample data (Hours studied vs. Exam score)
np.random.seed(42)
X = np.random.rand(100, 1) * 10  # 100 random values between 0 and 10
y = 2 * X + 1 + np.random.randn(100, 1) * 2  # Linear relationship with some noise

# Split the data into training and testing sets
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

# Initialize and train the linear regression model
model = LinearRegression()
model.fit(X_train, y_train)

# Make predictions on the test set
y_pred = model.predict(X_test)

# Calculate performance metrics
mse = mean_squared_error(y_test, y_pred)
r2 = r2_score(y_test, y_pred)

# Predict for new values
X_new = np.array([[6], [7], [8]])
y_new_pred = model.predict(X_new)

# Plotting the data and the regression line
plt.figure(figsize=(10, 6))
plt.scatter(X_train, y_train, color='blue', label='Training data')
plt.scatter(X_test, y_test, color='green', label='Testing data')
plt.plot(X, model.predict(X), color='red', label='Regression line')
plt.xlabel("Hours Studied")
plt.ylabel("Exam Score")
plt.title("Linear Regression: Hours Studied vs. Exam Score")
plt.legend()
plt.grid(True)
plt.show()

# Print results
print(f"Model coefficients: {model.coef_[0][0]:.2f}")
print(f"Model intercept: {model.intercept_[0]:.2f}")
print(f"Mean squared error: {mse:.2f}")
print(f"R-squared score: {r2:.2f}")
print(f"Predicted exam scores for new values (6, 7, 8 hours):")
for hours, score in zip(X_new, y_new_pred):
    print(f"  {hours[0]} hours: {score[0]:.2f}")

Explicación del Desglose del Código:

  1. Importación de Bibliotecas:
    • Importamos numpy para operaciones numéricas, matplotlib para graficar y varias funciones de sklearn para tareas de machine learning.
  2. Generación de Datos:
    • En lugar de usar un conjunto de datos pequeño predefinido, generamos un conjunto de datos más realista con 100 muestras.
    • Usamos las funciones aleatorias de numpy para crear horas de estudio (X) entre 0 y 10, y calificaciones de exámenes (y) con una relación lineal más algo de ruido aleatorio.
  3. División de Datos:
    • Dividimos los datos en conjuntos de entrenamiento (80%) y prueba (20%) usando train_test_split.
    • Esto nos permite evaluar el rendimiento del modelo con datos no vistos previamente.
  4. Entrenamiento del Modelo:
    • Creamos un modelo de Regresión Lineal (LinearRegression) y lo ajustamos con los datos de entrenamiento.
  5. Evaluación del Modelo:
    • Hacemos predicciones sobre el conjunto de prueba y calculamos dos métricas comunes de rendimiento:
      • Error Cuadrático Medio (MSE): Mide la diferencia cuadrada promedio entre los valores predichos y los valores reales.
      • Coeficiente de Determinación (R²): Indica la proporción de la varianza en la variable dependiente que es predecible a partir de la variable independiente.
  6. Nuevas Predicciones:
    • Predecimos las calificaciones de exámenes para nuevos valores (6, 7 y 8 horas de estudio).
  7. Visualización:
    • Creamos un gráfico más informativo que muestra:
      • Puntos de datos de entrenamiento (azul)
      • Puntos de datos de prueba (verde)
      • La línea de regresión (roja)
    • El gráfico incluye un título, leyenda y cuadrícula para mayor legibilidad.
  8. Resultados:
    • Imprimimos los coeficientes del modelo (pendiente) y la intersección, que definen la línea de regresión.
    • Mostramos el MSE y el coeficiente R² para cuantificar el rendimiento del modelo.
    • Finalmente, mostramos las calificaciones predichas para los nuevos valores.

Este ejemplo de código ofrece una visión más completa del proceso de regresión lineal, incluyendo la generación de datos, evaluación del modelo e interpretación de resultados. Demuestra las mejores prácticas como la división de datos y el uso de múltiples métricas de evaluación, que son cruciales en aplicaciones reales de machine learning.

b. Regresión Lineal Múltiple

La regresión lineal múltiple es una técnica avanzada que extiende el concepto de regresión lineal simple para incluir dos o más características de entrada (variables independientes). Este método permite un análisis más completo de las relaciones complejas en los datos.

Aquí tienes una visión más profunda de la regresión lineal múltiple:

  1. Estructura del Modelo: En la regresión lineal múltiple, el modelo intenta establecer una relación lineal entre varias variables independientes y una única variable dependiente (objetivo). La forma general de la ecuación es:

    y = β₀ + β₁x₁ + β₂x₂ + ... + βₙxₙ + ε

    Donde y es la variable objetivo, x₁, x₂, ..., xₙ son las características de entrada, β₀ es la intersección, β₁, β₂, ..., βₙ son los coeficientes para cada característica y ε es el término de error.

  2. Interacción de Características: A diferencia de la regresión lineal simple, la regresión lineal múltiple puede capturar cómo diferentes características interactúan para influir en la variable objetivo. Esto permite una comprensión más matizada de los datos.
  3. Interpretación de Coeficientes: Cada coeficiente (β) representa el cambio en la variable objetivo por un cambio de una unidad en la característica correspondiente, suponiendo que todas las demás características permanezcan constantes. Esto permite una evaluación individual del impacto de cada característica.
  4. Complejidad Aumentada: Aunque ofrece más poder explicativo, la regresión lineal múltiple también introduce una mayor complejidad. Problemas como la multicolinealidad (alta correlación entre características) deben gestionarse cuidadosamente.
  5. Aplicaciones: Esta técnica se utiliza ampliamente en diversos campos como la economía, las finanzas y las ciencias sociales, donde múltiples factores a menudo influyen en un resultado.

Al incorporar múltiples características, este modelo proporciona un enfoque más completo para comprender y predecir relaciones complejas en los datos, lo que lo convierte en una herramienta poderosa en el ámbito del aprendizaje supervisado.

Ejemplo: Regresión Lineal Múltiple con Scikit-learn

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from sklearn.linear_model import LinearRegression
from sklearn.model_selection import train_test_split
from sklearn.metrics import mean_squared_error, r2_score

# Sample data (Features: hours studied, number of practice tests, Target: exam score)
data = {
    'Hours_Studied': [1, 2, 3, 4, 5, 6, 7, 8, 9, 10],
    'Practice_Tests': [1, 2, 2, 3, 3, 4, 4, 5, 5, 6],
    'Exam_Score': [50, 60, 65, 70, 75, 80, 85, 90, 92, 95]
}
df = pd.DataFrame(data)

# Features (X) and target (y)
X = df[['Hours_Studied', 'Practice_Tests']]
y = df['Exam_Score']

# Split the data into training and testing sets
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

# Initialize and train the linear regression model
model = LinearRegression()
model.fit(X_train, y_train)

# Make predictions on the test set
y_pred = model.predict(X_test)

# Calculate performance metrics
mse = mean_squared_error(y_test, y_pred)
r2 = r2_score(y_test, y_pred)

# Print model coefficients and intercept
print("Model Coefficients:")
print(f"Hours Studied: {model.coef_[0]:.2f}")
print(f"Practice Tests: {model.coef_[1]:.2f}")
print(f"Intercept: {model.intercept_:.2f}")

# Print performance metrics
print(f"\nMean Squared Error: {mse:.2f}")
print(f"R-squared Score: {r2:.2f}")

# Predict exam scores for new data
X_new = np.array([[6, 2], [7, 3], [8, 3]])
y_new_pred = model.predict(X_new)

print("\nPredicted exam scores for new values:")
for i, (hours, tests) in enumerate(X_new):
    print(f"Hours Studied: {hours}, Practice Tests: {tests}, Predicted Score: {y_new_pred[i]:.2f}")

# Visualize the results
fig = plt.figure(figsize=(12, 5))

# Plot for Hours Studied
ax1 = fig.add_subplot(121, projection='3d')
ax1.scatter(X['Hours_Studied'], X['Practice_Tests'], y, c='b', marker='o')
ax1.set_xlabel('Hours Studied')
ax1.set_ylabel('Practice Tests')
ax1.set_zlabel('Exam Score')
ax1.set_title('3D Scatter Plot of Data')

# Create a mesh grid for the prediction surface
xx, yy = np.meshgrid(np.linspace(X['Hours_Studied'].min(), X['Hours_Studied'].max(), 10),
                     np.linspace(X['Practice_Tests'].min(), X['Practice_Tests'].max(), 10))
Z = model.predict(np.c_[xx.ravel(), yy.ravel()]).reshape(xx.shape)

# Plot the prediction surface
ax1.plot_surface(xx, yy, Z, alpha=0.5)

# Plot residuals
ax2 = fig.add_subplot(122)
ax2.scatter(y_pred, y_test - y_pred, c='r', marker='o')
ax2.set_xlabel('Predicted Values')
ax2.set_ylabel('Residuals')
ax2.set_title('Residual Plot')
ax2.axhline(y=0, color='k', linestyle='--')

plt.tight_layout()
plt.show()

Explicación del Desglose del Código:

  1. Importación de Bibliotecas:
    • Importamos numpy para operaciones numéricas, pandas para la manipulación de datos, matplotlib para graficar y varias funciones de sklearn para tareas de machine learning.
  2. Preparación de Datos:
    • Creamos un conjunto de datos más grande con 10 muestras, que incluyen horas de estudio, número de pruebas de práctica y calificaciones de exámenes.
    • Los datos se almacenan en un DataFrame de pandas para facilitar su manipulación.
  3. División de Datos:
    • Dividimos los datos en características (X) y la variable objetivo (y).
    • Los datos se dividen aún más en conjuntos de entrenamiento (80%) y prueba (20%) utilizando train_test_split.
  4. Entrenamiento del Modelo:
    • Creamos un modelo de Regresión Lineal (LinearRegression) y lo ajustamos con los datos de entrenamiento.
  5. Evaluación del Modelo:
    • Realizamos predicciones sobre el conjunto de prueba y calculamos dos métricas comunes de rendimiento:
    • Error Cuadrático Medio (MSE): Mide la diferencia cuadrada promedio entre los valores predichos y los valores reales.
    • Coeficiente de Determinación (R²): Indica la proporción de la varianza en la variable dependiente que es predecible a partir de las variables independientes.
  6. Interpretación del Modelo:
    • Imprimimos los coeficientes para cada característica y la intersección, lo que ayuda a interpretar el comportamiento del modelo.
  7. Nuevas Predicciones:
    • Predecimos las calificaciones de los exámenes para nuevos valores (combinaciones de horas de estudio y pruebas de práctica).
  8. Visualización:
    • Creamos dos gráficos para visualizar los resultados:
      • Un gráfico de dispersión 3D que muestra la relación entre horas de estudio, pruebas de práctica y calificaciones de exámenes, junto con la superficie de predicción.
      • Un gráfico de residuos para verificar si hay patrones en los errores del modelo.

Este ejemplo proporciona una visión más completa del proceso de regresión lineal múltiple, que incluye la preparación de datos, evaluación del modelo, interpretación y visualización. Demuestra mejores prácticas como la división de datos, el uso de múltiples métricas de evaluación y la visualización de resultados, que son cruciales en aplicaciones de machine learning en el mundo real.

4.1.2 Regresión Polinómica

La regresión polinómica es una extensión avanzada de la regresión lineal que nos permite modelar relaciones complejas y no lineales entre las características de entrada y la variable objetivo. Esto se logra incorporando términos polinómicos en la ecuación de regresión, lo que permite una representación más flexible y matizada de los datos.

En esencia, la regresión polinómica transforma las características originales elevándolas a diferentes potencias, creando nuevas características que capturan patrones no lineales. Por ejemplo, una relación cuadrática se puede modelar como:

y = β₀ + β₁x + β₂x² + ε

Donde:

  • y es la variable objetivo
  • x es la característica de entrada
  • β₀ es la intersección
  • β₁ y β₂ son los coeficientes
  • ε es el término de error

Esta ecuación permite relaciones curvas entre x e y, a diferencia de la línea recta de la regresión lineal simple.

Es importante notar que, a pesar de su nombre, la regresión polinómica sigue utilizando un modelo lineal en su núcleo. El aspecto 'polinómico' proviene de la transformación aplicada a las características de entrada. Al agregar estas características transformadas (por ejemplo, x², x³, etc.), creamos un modelo que puede ajustar patrones no lineales en los datos.

La belleza de este enfoque radica en su capacidad para capturar relaciones complejas mientras conserva la simplicidad y la interpretabilidad de la regresión lineal. El modelo sigue siendo lineal en sus parámetros (los coeficientes β), lo que significa que aún podemos usar mínimos cuadrados ordinarios para la estimación y beneficiarnos de las propiedades estadísticas de los modelos lineales.

Sin embargo, es crucial usar la regresión polinómica con precaución. Aunque puede capturar patrones no lineales, usar un polinomio de grado demasiado alto puede llevar a sobreajuste, donde el modelo funciona bien con los datos de entrenamiento, pero mal con datos nuevos no vistos. Por lo tanto, seleccionar el grado adecuado del polinomio es una consideración clave en esta técnica.

Aplicación de la Regresión Polinómica con Scikit-learn

Scikit-learn ofrece una herramienta poderosa llamada PolynomialFeatures que simplifica el proceso de incorporar términos polinómicos en nuestras características de entrada. Esta clase automatiza la creación de características polinómicas de mayor grado, lo que nos permite transformar sin esfuerzo nuestro modelo de regresión lineal en uno polinómico.

Al utilizar PolynomialFeatures, podemos explorar y capturar relaciones no lineales en nuestros datos sin tener que calcular manualmente términos polinómicos complejos. Esta funcionalidad resulta particularmente útil cuando trabajamos con conjuntos de datos donde la relación entre las variables no es estrictamente lineal, lo que nos permite modelar patrones más intrincados y, potencialmente, mejorar nuestra precisión predictiva.

Ejemplo: Regresión Polinómica con Scikit-learn

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from sklearn.preprocessing import PolynomialFeatures
from sklearn.linear_model import LinearRegression
from sklearn.model_selection import train_test_split
from sklearn.metrics import mean_squared_error, r2_score

# Generate sample data (Hours studied vs. Exam score with a non-linear relationship)
np.random.seed(42)
X = np.random.rand(100, 1) * 10
y = 3 * X**2 + 2 * X + 5 + np.random.randn(100, 1) * 5

# Split the data into training and testing sets
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

# Create polynomial features (degree 2)
poly = PolynomialFeatures(degree=2)
X_train_poly = poly.fit_transform(X_train)
X_test_poly = poly.transform(X_test)

# Train the polynomial regression model
model = LinearRegression()
model.fit(X_train_poly, y_train)

# Make predictions on the test set
y_pred = model.predict(X_test_poly)

# Calculate performance metrics
mse = mean_squared_error(y_test, y_pred)
r2 = r2_score(y_test, y_pred)

# Print model coefficients and performance metrics
print("Model Coefficients:")
for i, coef in enumerate(model.coef_[0]):
    print(f"Degree {i}: {coef:.4f}")
print(f"Intercept: {model.intercept_[0]:.4f}")
print(f"\nMean Squared Error: {mse:.4f}")
print(f"R-squared Score: {r2:.4f}")

# Predict for new values
X_new = np.array([[6], [7], [8]])
X_new_poly = poly.transform(X_new)
y_new_pred = model.predict(X_new_poly)

print("\nPredicted exam scores for new values:")
for hours, score in zip(X_new, y_new_pred):
    print(f"Hours Studied: {hours[0]:.1f}, Predicted Score: {score[0]:.2f}")

# Plot the data and the polynomial regression curve
plt.figure(figsize=(12, 6))

# Scatter plot of original data
plt.scatter(X, y, color='blue', alpha=0.5, label='Original data')

# Polynomial regression curve
X_plot = np.linspace(0, 10, 100).reshape(-1, 1)
X_plot_poly = poly.transform(X_plot)
y_plot = model.predict(X_plot_poly)
plt.plot(X_plot, y_plot, color='red', label='Polynomial regression curve')

# Scatter plot of test data
plt.scatter(X_test, y_test, color='green', alpha=0.7, label='Test data')

# Scatter plot of predictions on test data
plt.scatter(X_test, y_pred, color='orange', alpha=0.7, label='Predictions')

plt.xlabel("Hours Studied")
plt.ylabel("Exam Score")
plt.title("Polynomial Regression: Hours Studied vs. Exam Score")
plt.legend()
plt.grid(True, alpha=0.3)
plt.show()

# Residual plot
plt.figure(figsize=(10, 6))
residuals = y_test - y_pred
plt.scatter(y_pred, residuals, color='purple', alpha=0.7)
plt.xlabel("Predicted Values")
plt.ylabel("Residuals")
plt.title("Residual Plot")
plt.axhline(y=0, color='r', linestyle='--')
plt.grid(True, alpha=0.3)
plt.show()

Explicación del Desglose del Código:

  1. Importación de Bibliotecas:
    • Importamos numpy para operaciones numéricas, pandas para manipulación de datos, matplotlib para graficar y varias funciones de sklearn para tareas de machine learning.
  2. Generación de Datos:
    • Creamos un conjunto de datos sintéticos con 100 muestras, representando horas de estudio (X) y calificaciones de exámenes (y).
    • La relación entre X e y es no lineal, siguiendo una función cuadrática con algo de ruido añadido.
  3. División de Datos:
    • Dividimos los datos en conjuntos de entrenamiento (80%) y prueba (20%) utilizando train_test_split.
    • Esto nos permite evaluar el rendimiento del modelo con datos no vistos previamente.
  4. Ingeniería de Características:
    • Usamos PolynomialFeatures para crear términos polinómicos de hasta grado 2.
    • Esto transforma nuestras características de entrada para incluir términos x², lo que permite que el modelo capture relaciones no lineales.
  5. Entrenamiento del Modelo:
    • Creamos un modelo de Regresión Lineal (LinearRegression) y lo ajustamos con los datos transformados polinómicamente del conjunto de entrenamiento.
  6. Evaluación del Modelo:
    • Realizamos predicciones sobre el conjunto de prueba y calculamos dos métricas comunes de rendimiento:
      • Error Cuadrático Medio (MSE): Mide la diferencia cuadrada promedio entre los valores predichos y los valores reales.
      • Coeficiente de Determinación (R²): Indica la proporción de la varianza en la variable dependiente que es predecible a partir de las variables independientes.
  7. Interpretación del Modelo:
    • Imprimimos los coeficientes para cada término polinómico y la intersección, lo que ayuda a interpretar el comportamiento del modelo.
  8. Nuevas Predicciones:
    • Predecimos calificaciones de exámenes para nuevos valores de horas de estudio (6, 7 y 8 horas).
  9. Visualización:
    • Creamos dos gráficos para visualizar los resultados:
      • Un gráfico de dispersión que muestra los datos originales, los datos de prueba, las predicciones y la curva de regresión polinómica.
      • Un gráfico de residuos para verificar si hay patrones en los errores del modelo.

Este ejemplo proporciona una visión más completa del proceso de regresión polinómica, que incluye la generación de datos, división, evaluación del modelo, interpretación y visualización. Demuestra mejores prácticas como el uso de conjuntos de entrenamiento y prueba por separado, la evaluación con múltiples métricas y la visualización tanto del ajuste del modelo como de los residuos.

Estas prácticas son cruciales en aplicaciones de machine learning en el mundo real para garantizar la fiabilidad del modelo y obtener información sobre su rendimiento.

En conclusión, la regresión lineal y la polinómica son técnicas fundamentales en el aprendizaje supervisado para modelar relaciones entre las características de entrada y las variables objetivo continuas. La regresión lineal es útil cuando la relación es aproximadamente lineal, mientras que la regresión polinómica nos permite capturar relaciones no lineales transformando las características. Estas técnicas forman la base para métodos de regresión más avanzados y son fundamentales para resolver una amplia gama de tareas de modelado predictivo.

4.1 Regresión Lineal y Polinómica

El aprendizaje supervisado se destaca como una de las ramas más prominentes y ampliamente aplicadas dentro del vasto campo del aprendizaje automático. Este enfoque implica entrenar algoritmos en conjuntos de datos etiquetados, donde cada ejemplo de entrada se empareja meticulosamente con su etiqueta de salida correspondiente.

El objetivo principal del aprendizaje supervisado es permitir que el modelo discierna y comprenda las complejas relaciones entre las características de entrada y las variables objetivo. De este modo, el modelo se vuelve capaz de realizar predicciones precisas para nuevos datos que no ha visto antes.

El ámbito del aprendizaje supervisado abarca dos categorías principales, cada una de las cuales se adapta a tipos específicos de tareas de predicción:

  • Regresión: Esta categoría se ocupa de variables objetivo continuas, lo que permite realizar predicciones numéricas precisas. Algunos ejemplos incluyen la predicción de precios de casas en función de diversas características, la estimación de cambios de temperatura a lo largo del tiempo o la predicción de precios futuros de acciones de una empresa basándose en datos históricos y en indicadores del mercado.
  • Clasificación: A diferencia de la regresión, la clasificación se enfoca en variables objetivo categóricas. Implica asignar datos de entrada a clases o categorías predefinidas. Las aplicaciones comunes incluyen determinar si un correo electrónico es spam o legítimo, diagnosticar enfermedades basándose en los resultados de pruebas médicas, o identificar la especie de una planta basándose en sus características físicas.

Este capítulo explora las técnicas de aprendizaje supervisado más importantes y ampliamente utilizadas. Comenzamos examinando los fundamentos de la regresión lineal y polinómica, que sirven como base para comprender modelos de regresión más complejos.

Posteriormente, nos adentramos en el ámbito de los algoritmos de clasificación, donde elucidaremos métodos clave como la regresión logística, árboles de decisión y máquinas de soporte vectorial (SVM). Cada una de estas técnicas ofrece fortalezas únicas y se adapta a diferentes tipos de problemas de clasificación, proporcionando un conjunto de herramientas completas para abordar una amplia gama de desafíos del aprendizaje automático en el mundo real.

La regresión lineal es la forma más simple y fundamental de análisis de regresión en el aprendizaje automático. Esta técnica modela la relación entre una o más características de entrada (variables independientes) y una variable objetivo continua (variable dependiente) ajustando una línea recta a través de los puntos de datos. El objetivo principal de la regresión lineal es encontrar la línea que mejor se ajusta, minimizando el error de predicción general.

En su forma más simple, la regresión lineal asume una relación lineal entre las variables de entrada y salida. Esto significa que los cambios en las variables de entrada resultan en cambios proporcionales en la variable de salida. El modelo aprende a partir de datos etiquetados de entrenamiento para determinar los parámetros óptimos (pendiente e intercepto) de la línea, que luego pueden usarse para hacer predicciones sobre datos nuevos y no vistos.

Las principales características de la regresión lineal incluyen:

  • Simplicidad: La regresión lineal ofrece un enfoque sencillo y fácil de implementar, lo que la convierte en un excelente punto de partida para muchos problemas de regresión. Su naturaleza simple permite que incluso los principiantes en aprendizaje automático comprendan rápidamente sus conceptos y los apliquen de manera efectiva.
  • Interpretabilidad: Una de las principales fortalezas de la regresión lineal radica en su alto grado de interpretabilidad. Los coeficientes del modelo representan directamente el impacto de cada característica sobre la variable objetivo, lo que permite obtener información clara sobre las relaciones entre las variables. Esta transparencia es particularmente valiosa en campos donde comprender los factores subyacentes es tan importante como hacer predicciones precisas.
  • Eficiencia: La regresión lineal demuestra un rendimiento impresionante con recursos computacionales limitados, especialmente al trabajar con conjuntos de datos pequeños. Esta eficiencia la convierte en una opción ideal para análisis rápidos o en entornos donde el poder computacional está limitado, sin sacrificar la calidad de los resultados.
  • Versatilidad: A pesar de su aparente simplicidad, la regresión lineal posee una notable versatilidad. Se puede extender para manejar múltiples características de entrada a través de la regresión lineal múltiple, lo que permite análisis más complejos. Además, puede transformarse para modelar relaciones no lineales mediante técnicas como la regresión polinómica, ampliando su aplicabilidad a una gama más amplia de escenarios del mundo real.

Si bien la regresión lineal es poderosa en su simplicidad, es importante tener en cuenta que asume una relación lineal entre las variables y puede no capturar patrones no lineales complejos en los datos. En tales casos, es posible que se necesiten técnicas de regresión más avanzadas o modelos de aprendizaje automático más complejos.

La línea en la regresión lineal está definida por una ecuación lineal, que forma la base de las predicciones del modelo:

y = β₀ + β₁x₁ + β₂x₂ + ... + βₙxₙ + ε

Esta ecuación representa cómo el modelo calcula sus predicciones y se desglosa de la siguiente manera:

  • y es el valor predicho (variable objetivo)
  • β₀ es la intersección con el eje y (término de sesgo), que representa el valor predicho cuando todas las características son cero
  • β₁, β₂, ..., βₙ son los coeficientes (pesos) que determinan el impacto de cada característica en la predicción
  • x₁, x₂, ..., xₙ son las características de entrada (variables independientes)
  • ε es el término de error, que representa la diferencia entre los valores predichos y los reales

Comprender esta ecuación es crucial, ya que forma la base de la regresión lineal y ayuda a interpretar el comportamiento y los resultados del modelo.

4.1.1 Regresión Lineal

En la regresión lineal, el objetivo principal es determinar los coeficientes (pesos) óptimos que minimicen la discrepancia entre los valores predichos y los valores reales. Este proceso es crucial para crear un modelo que represente con precisión la relación entre las características de entrada y la variable objetivo.

Para lograr este objetivo, la regresión lineal generalmente emplea una técnica llamada "minimización del error cuadrático medio (MSE)". El MSE es una medida de la diferencia promedio al cuadrado entre los valores predichos y los valores reales. Aquí tienes una explicación más detallada de este proceso:

  1. Predicción: El modelo hace predicciones basadas en los coeficientes actuales.
  2. Cálculo del error: Para cada punto de datos, se calcula la diferencia entre el valor predicho y el valor real. Esta diferencia se denomina error o residuo.
  3. Elevar al cuadrado: Cada error se eleva al cuadrado. Este paso tiene dos propósitos:
    • Asegura que todos los errores sean positivos, evitando que los errores negativos cancelen los positivos.
    • Penaliza más fuertemente los errores grandes, fomentando que el modelo minimice los valores atípicos.
  4. Cálculo del promedio: Se calcula el promedio de todos estos errores cuadrados, lo que da como resultado el MSE.
  5. Optimización: El modelo ajusta sus coeficientes para minimizar este MSE, generalmente utilizando técnicas como el descenso de gradiente.

Al ajustar iterativamente los coeficientes para minimizar el MSE, el modelo de regresión lineal mejora gradualmente sus predicciones, encontrando finalmente la línea que mejor se ajusta a los datos. Este proceso garantiza que las predicciones del modelo sean lo más cercanas posible a los valores reales en todo el conjunto de datos.

a. Regresión Lineal Simple

En la regresión lineal simple, el modelo se enfoca en la relación entre una sola característica de entrada (variable independiente) y una variable objetivo (variable dependiente). Este enfoque sencillo permite un análisis directo de cómo los cambios en la característica de entrada afectan directamente a la variable objetivo.

La simplicidad de este método lo convierte en un excelente punto de partida para comprender el análisis de regresión y proporciona una base para técnicas de regresión más complejas.

La ecuación para la regresión lineal simple puede expresarse como:

y = β₀ + β₁x + ε

Donde:

  • y es la variable objetivo (variable dependiente)
  • x es la característica de entrada (variable independiente)
  • β₀ es la intersección con el eje y (el valor de y cuando x es 0)
  • β₁ es la pendiente (el cambio en y por un cambio unitario en x)
  • ε es el término de error (representa la variabilidad no explicada por la relación lineal)

Ejemplo: Regresión Lineal Simple con Scikit-learn

import numpy as np
import matplotlib.pyplot as plt
from sklearn.linear_model import LinearRegression
from sklearn.metrics import mean_squared_error, r2_score
from sklearn.model_selection import train_test_split

# Generate sample data (Hours studied vs. Exam score)
np.random.seed(42)
X = np.random.rand(100, 1) * 10  # 100 random values between 0 and 10
y = 2 * X + 1 + np.random.randn(100, 1) * 2  # Linear relationship with some noise

# Split the data into training and testing sets
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

# Initialize and train the linear regression model
model = LinearRegression()
model.fit(X_train, y_train)

# Make predictions on the test set
y_pred = model.predict(X_test)

# Calculate performance metrics
mse = mean_squared_error(y_test, y_pred)
r2 = r2_score(y_test, y_pred)

# Predict for new values
X_new = np.array([[6], [7], [8]])
y_new_pred = model.predict(X_new)

# Plotting the data and the regression line
plt.figure(figsize=(10, 6))
plt.scatter(X_train, y_train, color='blue', label='Training data')
plt.scatter(X_test, y_test, color='green', label='Testing data')
plt.plot(X, model.predict(X), color='red', label='Regression line')
plt.xlabel("Hours Studied")
plt.ylabel("Exam Score")
plt.title("Linear Regression: Hours Studied vs. Exam Score")
plt.legend()
plt.grid(True)
plt.show()

# Print results
print(f"Model coefficients: {model.coef_[0][0]:.2f}")
print(f"Model intercept: {model.intercept_[0]:.2f}")
print(f"Mean squared error: {mse:.2f}")
print(f"R-squared score: {r2:.2f}")
print(f"Predicted exam scores for new values (6, 7, 8 hours):")
for hours, score in zip(X_new, y_new_pred):
    print(f"  {hours[0]} hours: {score[0]:.2f}")

Explicación del Desglose del Código:

  1. Importación de Bibliotecas:
    • Importamos numpy para operaciones numéricas, matplotlib para graficar y varias funciones de sklearn para tareas de machine learning.
  2. Generación de Datos:
    • En lugar de usar un conjunto de datos pequeño predefinido, generamos un conjunto de datos más realista con 100 muestras.
    • Usamos las funciones aleatorias de numpy para crear horas de estudio (X) entre 0 y 10, y calificaciones de exámenes (y) con una relación lineal más algo de ruido aleatorio.
  3. División de Datos:
    • Dividimos los datos en conjuntos de entrenamiento (80%) y prueba (20%) usando train_test_split.
    • Esto nos permite evaluar el rendimiento del modelo con datos no vistos previamente.
  4. Entrenamiento del Modelo:
    • Creamos un modelo de Regresión Lineal (LinearRegression) y lo ajustamos con los datos de entrenamiento.
  5. Evaluación del Modelo:
    • Hacemos predicciones sobre el conjunto de prueba y calculamos dos métricas comunes de rendimiento:
      • Error Cuadrático Medio (MSE): Mide la diferencia cuadrada promedio entre los valores predichos y los valores reales.
      • Coeficiente de Determinación (R²): Indica la proporción de la varianza en la variable dependiente que es predecible a partir de la variable independiente.
  6. Nuevas Predicciones:
    • Predecimos las calificaciones de exámenes para nuevos valores (6, 7 y 8 horas de estudio).
  7. Visualización:
    • Creamos un gráfico más informativo que muestra:
      • Puntos de datos de entrenamiento (azul)
      • Puntos de datos de prueba (verde)
      • La línea de regresión (roja)
    • El gráfico incluye un título, leyenda y cuadrícula para mayor legibilidad.
  8. Resultados:
    • Imprimimos los coeficientes del modelo (pendiente) y la intersección, que definen la línea de regresión.
    • Mostramos el MSE y el coeficiente R² para cuantificar el rendimiento del modelo.
    • Finalmente, mostramos las calificaciones predichas para los nuevos valores.

Este ejemplo de código ofrece una visión más completa del proceso de regresión lineal, incluyendo la generación de datos, evaluación del modelo e interpretación de resultados. Demuestra las mejores prácticas como la división de datos y el uso de múltiples métricas de evaluación, que son cruciales en aplicaciones reales de machine learning.

b. Regresión Lineal Múltiple

La regresión lineal múltiple es una técnica avanzada que extiende el concepto de regresión lineal simple para incluir dos o más características de entrada (variables independientes). Este método permite un análisis más completo de las relaciones complejas en los datos.

Aquí tienes una visión más profunda de la regresión lineal múltiple:

  1. Estructura del Modelo: En la regresión lineal múltiple, el modelo intenta establecer una relación lineal entre varias variables independientes y una única variable dependiente (objetivo). La forma general de la ecuación es:

    y = β₀ + β₁x₁ + β₂x₂ + ... + βₙxₙ + ε

    Donde y es la variable objetivo, x₁, x₂, ..., xₙ son las características de entrada, β₀ es la intersección, β₁, β₂, ..., βₙ son los coeficientes para cada característica y ε es el término de error.

  2. Interacción de Características: A diferencia de la regresión lineal simple, la regresión lineal múltiple puede capturar cómo diferentes características interactúan para influir en la variable objetivo. Esto permite una comprensión más matizada de los datos.
  3. Interpretación de Coeficientes: Cada coeficiente (β) representa el cambio en la variable objetivo por un cambio de una unidad en la característica correspondiente, suponiendo que todas las demás características permanezcan constantes. Esto permite una evaluación individual del impacto de cada característica.
  4. Complejidad Aumentada: Aunque ofrece más poder explicativo, la regresión lineal múltiple también introduce una mayor complejidad. Problemas como la multicolinealidad (alta correlación entre características) deben gestionarse cuidadosamente.
  5. Aplicaciones: Esta técnica se utiliza ampliamente en diversos campos como la economía, las finanzas y las ciencias sociales, donde múltiples factores a menudo influyen en un resultado.

Al incorporar múltiples características, este modelo proporciona un enfoque más completo para comprender y predecir relaciones complejas en los datos, lo que lo convierte en una herramienta poderosa en el ámbito del aprendizaje supervisado.

Ejemplo: Regresión Lineal Múltiple con Scikit-learn

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from sklearn.linear_model import LinearRegression
from sklearn.model_selection import train_test_split
from sklearn.metrics import mean_squared_error, r2_score

# Sample data (Features: hours studied, number of practice tests, Target: exam score)
data = {
    'Hours_Studied': [1, 2, 3, 4, 5, 6, 7, 8, 9, 10],
    'Practice_Tests': [1, 2, 2, 3, 3, 4, 4, 5, 5, 6],
    'Exam_Score': [50, 60, 65, 70, 75, 80, 85, 90, 92, 95]
}
df = pd.DataFrame(data)

# Features (X) and target (y)
X = df[['Hours_Studied', 'Practice_Tests']]
y = df['Exam_Score']

# Split the data into training and testing sets
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

# Initialize and train the linear regression model
model = LinearRegression()
model.fit(X_train, y_train)

# Make predictions on the test set
y_pred = model.predict(X_test)

# Calculate performance metrics
mse = mean_squared_error(y_test, y_pred)
r2 = r2_score(y_test, y_pred)

# Print model coefficients and intercept
print("Model Coefficients:")
print(f"Hours Studied: {model.coef_[0]:.2f}")
print(f"Practice Tests: {model.coef_[1]:.2f}")
print(f"Intercept: {model.intercept_:.2f}")

# Print performance metrics
print(f"\nMean Squared Error: {mse:.2f}")
print(f"R-squared Score: {r2:.2f}")

# Predict exam scores for new data
X_new = np.array([[6, 2], [7, 3], [8, 3]])
y_new_pred = model.predict(X_new)

print("\nPredicted exam scores for new values:")
for i, (hours, tests) in enumerate(X_new):
    print(f"Hours Studied: {hours}, Practice Tests: {tests}, Predicted Score: {y_new_pred[i]:.2f}")

# Visualize the results
fig = plt.figure(figsize=(12, 5))

# Plot for Hours Studied
ax1 = fig.add_subplot(121, projection='3d')
ax1.scatter(X['Hours_Studied'], X['Practice_Tests'], y, c='b', marker='o')
ax1.set_xlabel('Hours Studied')
ax1.set_ylabel('Practice Tests')
ax1.set_zlabel('Exam Score')
ax1.set_title('3D Scatter Plot of Data')

# Create a mesh grid for the prediction surface
xx, yy = np.meshgrid(np.linspace(X['Hours_Studied'].min(), X['Hours_Studied'].max(), 10),
                     np.linspace(X['Practice_Tests'].min(), X['Practice_Tests'].max(), 10))
Z = model.predict(np.c_[xx.ravel(), yy.ravel()]).reshape(xx.shape)

# Plot the prediction surface
ax1.plot_surface(xx, yy, Z, alpha=0.5)

# Plot residuals
ax2 = fig.add_subplot(122)
ax2.scatter(y_pred, y_test - y_pred, c='r', marker='o')
ax2.set_xlabel('Predicted Values')
ax2.set_ylabel('Residuals')
ax2.set_title('Residual Plot')
ax2.axhline(y=0, color='k', linestyle='--')

plt.tight_layout()
plt.show()

Explicación del Desglose del Código:

  1. Importación de Bibliotecas:
    • Importamos numpy para operaciones numéricas, pandas para la manipulación de datos, matplotlib para graficar y varias funciones de sklearn para tareas de machine learning.
  2. Preparación de Datos:
    • Creamos un conjunto de datos más grande con 10 muestras, que incluyen horas de estudio, número de pruebas de práctica y calificaciones de exámenes.
    • Los datos se almacenan en un DataFrame de pandas para facilitar su manipulación.
  3. División de Datos:
    • Dividimos los datos en características (X) y la variable objetivo (y).
    • Los datos se dividen aún más en conjuntos de entrenamiento (80%) y prueba (20%) utilizando train_test_split.
  4. Entrenamiento del Modelo:
    • Creamos un modelo de Regresión Lineal (LinearRegression) y lo ajustamos con los datos de entrenamiento.
  5. Evaluación del Modelo:
    • Realizamos predicciones sobre el conjunto de prueba y calculamos dos métricas comunes de rendimiento:
    • Error Cuadrático Medio (MSE): Mide la diferencia cuadrada promedio entre los valores predichos y los valores reales.
    • Coeficiente de Determinación (R²): Indica la proporción de la varianza en la variable dependiente que es predecible a partir de las variables independientes.
  6. Interpretación del Modelo:
    • Imprimimos los coeficientes para cada característica y la intersección, lo que ayuda a interpretar el comportamiento del modelo.
  7. Nuevas Predicciones:
    • Predecimos las calificaciones de los exámenes para nuevos valores (combinaciones de horas de estudio y pruebas de práctica).
  8. Visualización:
    • Creamos dos gráficos para visualizar los resultados:
      • Un gráfico de dispersión 3D que muestra la relación entre horas de estudio, pruebas de práctica y calificaciones de exámenes, junto con la superficie de predicción.
      • Un gráfico de residuos para verificar si hay patrones en los errores del modelo.

Este ejemplo proporciona una visión más completa del proceso de regresión lineal múltiple, que incluye la preparación de datos, evaluación del modelo, interpretación y visualización. Demuestra mejores prácticas como la división de datos, el uso de múltiples métricas de evaluación y la visualización de resultados, que son cruciales en aplicaciones de machine learning en el mundo real.

4.1.2 Regresión Polinómica

La regresión polinómica es una extensión avanzada de la regresión lineal que nos permite modelar relaciones complejas y no lineales entre las características de entrada y la variable objetivo. Esto se logra incorporando términos polinómicos en la ecuación de regresión, lo que permite una representación más flexible y matizada de los datos.

En esencia, la regresión polinómica transforma las características originales elevándolas a diferentes potencias, creando nuevas características que capturan patrones no lineales. Por ejemplo, una relación cuadrática se puede modelar como:

y = β₀ + β₁x + β₂x² + ε

Donde:

  • y es la variable objetivo
  • x es la característica de entrada
  • β₀ es la intersección
  • β₁ y β₂ son los coeficientes
  • ε es el término de error

Esta ecuación permite relaciones curvas entre x e y, a diferencia de la línea recta de la regresión lineal simple.

Es importante notar que, a pesar de su nombre, la regresión polinómica sigue utilizando un modelo lineal en su núcleo. El aspecto 'polinómico' proviene de la transformación aplicada a las características de entrada. Al agregar estas características transformadas (por ejemplo, x², x³, etc.), creamos un modelo que puede ajustar patrones no lineales en los datos.

La belleza de este enfoque radica en su capacidad para capturar relaciones complejas mientras conserva la simplicidad y la interpretabilidad de la regresión lineal. El modelo sigue siendo lineal en sus parámetros (los coeficientes β), lo que significa que aún podemos usar mínimos cuadrados ordinarios para la estimación y beneficiarnos de las propiedades estadísticas de los modelos lineales.

Sin embargo, es crucial usar la regresión polinómica con precaución. Aunque puede capturar patrones no lineales, usar un polinomio de grado demasiado alto puede llevar a sobreajuste, donde el modelo funciona bien con los datos de entrenamiento, pero mal con datos nuevos no vistos. Por lo tanto, seleccionar el grado adecuado del polinomio es una consideración clave en esta técnica.

Aplicación de la Regresión Polinómica con Scikit-learn

Scikit-learn ofrece una herramienta poderosa llamada PolynomialFeatures que simplifica el proceso de incorporar términos polinómicos en nuestras características de entrada. Esta clase automatiza la creación de características polinómicas de mayor grado, lo que nos permite transformar sin esfuerzo nuestro modelo de regresión lineal en uno polinómico.

Al utilizar PolynomialFeatures, podemos explorar y capturar relaciones no lineales en nuestros datos sin tener que calcular manualmente términos polinómicos complejos. Esta funcionalidad resulta particularmente útil cuando trabajamos con conjuntos de datos donde la relación entre las variables no es estrictamente lineal, lo que nos permite modelar patrones más intrincados y, potencialmente, mejorar nuestra precisión predictiva.

Ejemplo: Regresión Polinómica con Scikit-learn

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from sklearn.preprocessing import PolynomialFeatures
from sklearn.linear_model import LinearRegression
from sklearn.model_selection import train_test_split
from sklearn.metrics import mean_squared_error, r2_score

# Generate sample data (Hours studied vs. Exam score with a non-linear relationship)
np.random.seed(42)
X = np.random.rand(100, 1) * 10
y = 3 * X**2 + 2 * X + 5 + np.random.randn(100, 1) * 5

# Split the data into training and testing sets
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

# Create polynomial features (degree 2)
poly = PolynomialFeatures(degree=2)
X_train_poly = poly.fit_transform(X_train)
X_test_poly = poly.transform(X_test)

# Train the polynomial regression model
model = LinearRegression()
model.fit(X_train_poly, y_train)

# Make predictions on the test set
y_pred = model.predict(X_test_poly)

# Calculate performance metrics
mse = mean_squared_error(y_test, y_pred)
r2 = r2_score(y_test, y_pred)

# Print model coefficients and performance metrics
print("Model Coefficients:")
for i, coef in enumerate(model.coef_[0]):
    print(f"Degree {i}: {coef:.4f}")
print(f"Intercept: {model.intercept_[0]:.4f}")
print(f"\nMean Squared Error: {mse:.4f}")
print(f"R-squared Score: {r2:.4f}")

# Predict for new values
X_new = np.array([[6], [7], [8]])
X_new_poly = poly.transform(X_new)
y_new_pred = model.predict(X_new_poly)

print("\nPredicted exam scores for new values:")
for hours, score in zip(X_new, y_new_pred):
    print(f"Hours Studied: {hours[0]:.1f}, Predicted Score: {score[0]:.2f}")

# Plot the data and the polynomial regression curve
plt.figure(figsize=(12, 6))

# Scatter plot of original data
plt.scatter(X, y, color='blue', alpha=0.5, label='Original data')

# Polynomial regression curve
X_plot = np.linspace(0, 10, 100).reshape(-1, 1)
X_plot_poly = poly.transform(X_plot)
y_plot = model.predict(X_plot_poly)
plt.plot(X_plot, y_plot, color='red', label='Polynomial regression curve')

# Scatter plot of test data
plt.scatter(X_test, y_test, color='green', alpha=0.7, label='Test data')

# Scatter plot of predictions on test data
plt.scatter(X_test, y_pred, color='orange', alpha=0.7, label='Predictions')

plt.xlabel("Hours Studied")
plt.ylabel("Exam Score")
plt.title("Polynomial Regression: Hours Studied vs. Exam Score")
plt.legend()
plt.grid(True, alpha=0.3)
plt.show()

# Residual plot
plt.figure(figsize=(10, 6))
residuals = y_test - y_pred
plt.scatter(y_pred, residuals, color='purple', alpha=0.7)
plt.xlabel("Predicted Values")
plt.ylabel("Residuals")
plt.title("Residual Plot")
plt.axhline(y=0, color='r', linestyle='--')
plt.grid(True, alpha=0.3)
plt.show()

Explicación del Desglose del Código:

  1. Importación de Bibliotecas:
    • Importamos numpy para operaciones numéricas, pandas para manipulación de datos, matplotlib para graficar y varias funciones de sklearn para tareas de machine learning.
  2. Generación de Datos:
    • Creamos un conjunto de datos sintéticos con 100 muestras, representando horas de estudio (X) y calificaciones de exámenes (y).
    • La relación entre X e y es no lineal, siguiendo una función cuadrática con algo de ruido añadido.
  3. División de Datos:
    • Dividimos los datos en conjuntos de entrenamiento (80%) y prueba (20%) utilizando train_test_split.
    • Esto nos permite evaluar el rendimiento del modelo con datos no vistos previamente.
  4. Ingeniería de Características:
    • Usamos PolynomialFeatures para crear términos polinómicos de hasta grado 2.
    • Esto transforma nuestras características de entrada para incluir términos x², lo que permite que el modelo capture relaciones no lineales.
  5. Entrenamiento del Modelo:
    • Creamos un modelo de Regresión Lineal (LinearRegression) y lo ajustamos con los datos transformados polinómicamente del conjunto de entrenamiento.
  6. Evaluación del Modelo:
    • Realizamos predicciones sobre el conjunto de prueba y calculamos dos métricas comunes de rendimiento:
      • Error Cuadrático Medio (MSE): Mide la diferencia cuadrada promedio entre los valores predichos y los valores reales.
      • Coeficiente de Determinación (R²): Indica la proporción de la varianza en la variable dependiente que es predecible a partir de las variables independientes.
  7. Interpretación del Modelo:
    • Imprimimos los coeficientes para cada término polinómico y la intersección, lo que ayuda a interpretar el comportamiento del modelo.
  8. Nuevas Predicciones:
    • Predecimos calificaciones de exámenes para nuevos valores de horas de estudio (6, 7 y 8 horas).
  9. Visualización:
    • Creamos dos gráficos para visualizar los resultados:
      • Un gráfico de dispersión que muestra los datos originales, los datos de prueba, las predicciones y la curva de regresión polinómica.
      • Un gráfico de residuos para verificar si hay patrones en los errores del modelo.

Este ejemplo proporciona una visión más completa del proceso de regresión polinómica, que incluye la generación de datos, división, evaluación del modelo, interpretación y visualización. Demuestra mejores prácticas como el uso de conjuntos de entrenamiento y prueba por separado, la evaluación con múltiples métricas y la visualización tanto del ajuste del modelo como de los residuos.

Estas prácticas son cruciales en aplicaciones de machine learning en el mundo real para garantizar la fiabilidad del modelo y obtener información sobre su rendimiento.

En conclusión, la regresión lineal y la polinómica son técnicas fundamentales en el aprendizaje supervisado para modelar relaciones entre las características de entrada y las variables objetivo continuas. La regresión lineal es útil cuando la relación es aproximadamente lineal, mientras que la regresión polinómica nos permite capturar relaciones no lineales transformando las características. Estas técnicas forman la base para métodos de regresión más avanzados y son fundamentales para resolver una amplia gama de tareas de modelado predictivo.