¿Cómo funciona el algoritmo de regresión lineal en Machine Learning?
Recordemos que los algoritmos de Machine Learning Supervisados, aprenden por sí mismos y -en este caso- a obtener automáticamente esa “recta” que buscamos con la tendencia de predicción. Para hacerlo se mide el error con respecto a los puntos de entrada y el valor “Y” de salida real. El algoritmo deberá minimizar el coste de una función de error cuadrático y esos coeficientes corresponderán con la recta óptima. Hay diversos métodos para conseguir minimizar el coste. Lo más común es utilizar una versión vectorial y la llamada Ecuación Normal que nos dará un resultado directo.
NOTA: cuando hablo de “recta” es en el caso particular de regresión lineal simple. Si hubiera más variables, hay que generalizar el término. Hagamos un Ejercicio Práctico En este ejemplo cargaremos un archivo .csv de entrada obtenido por webscraping que contiene diversas URLs a artículos sobre Machine Learning de algunos sitios muy importantes como Techcrunch o KDnuggets y como características de entrada -las columnas- tendremos:
• Title: Titulo del Artículo • url: ruta al artículo • Word count: la cantidad de palabras del artículo, • # of Links: los enlaces externos que contiene, • # of comments: cantidad de comentarios, • # Images video: suma de imágenes (o videos), • Elapsed days: la cantidad de días transcurridos (al momento de crear el archivo) • # Shares: nuestra columna de salida que será la “cantidad de veces que se compartió el artículo”.
A partir de las características de un artículo de machine learning intentaremos predecir, cuantas veces será compartido en Redes Sociales.
Haremos una primer predicción de regresión lineal simple -con una sola variable predictora- para poder graficar en 2 dimensiones (ejes X e Y) y luego un ejemplo de regresión Lineal Múltiple, en la que utilizaremos 3 dimensiones (X,Y,Z) y predicciones.
NOTA: el archivo .csv contiene mitad de datos reales, y otra mitad los generé de manera aleatoria, por lo que las predicciones que obtendremos no serán reales. Intentaré en el futuro hacer webscrapping de los enlaces que me faltaban y reemplazar los resultados por valores reales. Requerimientos para hacer el Ejercicio Para realizar este ejercicio, crearemos una Jupyter notebook con código Python y la librería SkLearn muy utilizada en Data Science. Recomendamos utilizar la suite de Anaconda. Puedes leer este artículo donde muestro paso a paso como instalar el ambiente de desarrollo. Podrás descargar los archivos de entrada csv o visualizar la notebook online (al final del artículo los enlaces). Predecir cuántas veces será compartido un artículo de Machine Learning. Regresión lineal simple en Python (con 1 variable) Aqui vamos con nuestra notebook! Comencemos por importar las librerías que utilizaremos:
1 # Imports necesarios 2 import numpy as np 3 import pandas as pd 4 import seaborn as sb 5 import matplotlib.pyplot as plt 6 %matplotlib inline 7 from mpl_toolkits.mplot3d import Axes3D 8 from matplotlib import cm 9 plt.rcParams['figure.figsize'] = (16, 9) 10 plt.style.use('ggplot') 11 from sklearn import linear_model 12 from sklearn.metrics import mean_squared_error, r2_score Leemos el archivo csv y lo cargamos como un dataset de Pandas. Y vemos su tamaño 1 #cargamos los datos de entrada 2 data = pd.read_csv("./articulos_ml.csv") 3 #veamos cuantas dimensiones y registros contiene 4 data.shape Nos devuelve (161,8)
Veamos esas primeras filas 1 #son 161 registros con 8 columnas. Veamos los primeros registros 2 data.head()
Se ven algunos campos con valores NaN (nulos) por ejemplo algunas urls o en comentarios. Veamos algunas estadísticas básicas de nuestros datos de entrada: 1 # Ahora veamos algunas estadísticas de nuestros datos 2 data.describe()
Aqui vemos que la media de palabras en los artículos es de 1808. El artículo más corto tiene 250 palabras y el más extenso 8401. Intentaremos ver con nuestra relación lineal, si hay una correlación entre la cantidad de palabras del texto y la cantidad de Shares obtenidos. Hacemos una visualización en general de los datos de entrada: 1 # Visualizamos rápidamente las caraterísticas de entrada 2 data.drop(['Title','url', 'Elapsed days'],1).hist() 3 plt.show()
Vamos a filtrar los datos de cantidad de palabras para quedarnos con los registros con menos de 3500 palabras y también con los que tengan Cantidad de compartidos menos a 80.000. Lo gratificaremos pintando en azul los puntos con menos de 1808 palabras (la media) y en naranja los que tengan más.
filtered_data = data[(data['Word count'] <= 3500) & (data['# Shares'] <= 80000)]
colores=['orange','blue'] tamanios=[30,60]
f1 = filtered_data['Word count'].values f2 = filtered_data['# Shares'].values
asignar=[] for index, row in filtered_data.iterrows(): if(row['Word count']>1808): asignar.append(colores[0]) else: asignar.append(colores[1])
plt.scatter(f1, f2, c=asignar, s=tamanios[0]) plt.show()
