El término Machine Learning ya forma parte de nuestro trabajo diario como analistas digitales. Aunque es algo que lleva ya varios años entre nosotros es en la actualidad donde ha empezado a coger la importancia que debía tener. Hoy en día, sin la ayuda de este tipo de algoritmos es realmente complicado obtener resultados objetivos. Básicamente se puede resumir como el conjunto de técnicas que permiten aprender de los datos de manera automatizada. Esto es esencial para entender y analizar la ingente cantidad de datos existentes en nuestras empresas.

A continuación voy a intentar resumir las principales tipologías dentro del Machine Learning aplicando en cada una de ellas un ejemplo tipo desarrollado en Python.

Para poder seguir cada uno de los ejemplos debes descargarte este fichero CSV, el cual contiene unas pocas líneas a modo de ejemplo sobre campañas, costes y ventas. Además, para poder ver el código de cada uno de los ejemplos tendrás que abrir el “acordeón” correspondiente a cada algoritmo ¡Recuérdalo! 😉 

Tipos de modelización

Dentro del ámbito del Machine Learning se pueden distinguir al menos dos tipologías básicas:

  • Supervisado. Entrada de datos etiquetados (input data) a través de los cuales se puede asignar determinados valores de salida (output data).
  • No supervisado. No existen datos etiquetados por lo que no se pueden asociar a valores de salida. Se necesita ordenar y estructurar los datos en base a alguna característica.

Cabe decir que, además de estos tipos, existe otro denominado Aprendizaje por refuerzo (Reinforcement Learning), el cual se basa en el estudio de los datos según prueba-error. Es un caso especial y por ello no lo voy a tratar en este artículo.

Principales algoritmos de Machine Learning

Principales algoritmos de Machine Learning

Modelos supervisados

 

Regression

Este modelo supervisado se usa habitualmente cuando se pretende predecir un valor numérico. Responde a preguntas del tipo: ¿cuántos productos venderemos el mes que viene?, ¿qué beneficios tendremos el próximo año?, etc. Este tipo de algoritmos intenta cuantificar un valor basándose en el comportamiento previo de los datos.

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

df = pd.read_csv('[añadir la ruta al fichero csv con los datos]')
x = np.reshape(np.array(df['Spend']), (-1, 1)) y = np.reshape(np.array(df['Purchases']), (-1, 1))
lm = LinearRegression() lm.fit(x, y) y_predicted = lm.predict(x)
plt.scatter(x, y, s=10) plt.xlabel('Spend') plt.ylabel('Purchases') plt.plot(x, y_predicted, color='r') plt.show()

 

rmse = mean_squared_error(y, y_predicted)
r2 = r2_score(y, y_predicted)
print('Slope:', lm.coef_)
print('Intercept:', lm.intercept_)
print('Root mean squared error: ', rmse)
print('R2 score: ', r2)
Ejemplo de Linear Regression de Machine Learning
Linear Regression Validación del modelo

En esta última imagen, correspondiente a la segunda parte del código desarrollado, se pueden observar varios valores cuyo significado corresponde a:

  • Slope. La fórmula en la que se basa el algoritmo Linear Regression es y = mx + b. En este caso, el Slope (inclinación de la línea) hace referencia a la letra m.
  • Intercept. Es el valor constante b. Tanto el slope como el intercept representan en este caso la relación lineal entre 2 variables.
  • Root Mean Squared error (RMSE). Representa la desviación estándar de los residuos o lo que es lo mismo cuánto varía cada dato con respecto a la línea de regresión. Como el resultado dependerá del valor de los datos, se puede utilizar la fórmula (rmse / avg(y)) * 100%) para aceptar o no el modelo generado. Se suele considerar < 10% como óptimo.
  • R2 error. Mide la relación existente entre el modelo generado y la variable dependiente. No hay un valor concreto a partir del cual se puede considerar como óptimo, sin embargo a partir de 60% (0,6) ya se empieza a entender como una correlación alta. Aunque esto dependerá de otros muchos factores y ámbitos de estudio.

Classification

Este algoritmo supervisado se centra en agrupar valores categóricos. Por ejemplo, ¿están nuestros clientes satisfechos?, ¿será devuelto el producto?, etc. Es decir, cuantifica la tipología de los datos. A distinción del anterior, donde el resultado es contínuo, los valores son discretos. Gracias a lo cual se puede realizar la segmentación buscada. En el siguiente ejemplo práctico se ha desarrollado un algoritmo KNN en el que además se ha precalculado la mejor aproximación y el número K óptimo. Este número representa la cantidad de vecinos a agrupar entorno a valores concretos.

Classification
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from matplotlib.colors import ListedColormap
from sklearn.neighbors import KNeighborsClassifier
from sklearn import preprocessing
from sklearn.model_selection import GridSearchCV
df = pd.read_csv('[añadir la ruta al fichero csv con los datos]') f1 = df['Spend'] f2 = df['Purchases'] features = list(zip(f1, f2)) le = preprocessing.LabelEncoder() label = le.fit_transform(df["SourceMedium"]) h = 100

cmap_light = ListedColormap(['#FFAAAA', '#AAFFAA', '#00AAFF']) cmap_bold = ListedColormap(['#FF0000', '#00FF00', '#3341FF'])
k_range = list(range(1, 100)) weight_options = ["uniform", "distance"] param_grid = dict(n_neighbors=k_range, weights=weight_options) knn = KNeighborsClassifier() knn = GridSearchCV(knn, param_grid, cv=10, scoring='accuracy') knn.fit(features, label)

model = KNeighborsClassifier(n_neighbors=knn.best_params_['n_neighbors'], weights=knn.best_params_['weights']) model.fit(features, label)x_min, x_max = f1.min() - 1, f1.max() + 1
y_min, y_max = f2.min() - 1, f2.max() + 1 xx, yy = np.meshgrid(np.arange(x_min, x_max, h), np.arange(y_min, y_max, h))
predicted = model.predict(np.c_[xx.ravel(), yy.ravel()])
predicted = predicted.reshape(xx.shape)
plt.figure() plt.pcolormesh(xx, yy, predicted, cmap=cmap_light)plt.scatter(f1, f2, c=label, cmap=cmap_bold) plt.xlim(xx.min(), xx.max()) plt.ylim(yy.min(), yy.max()) plt.title("KNN classification (k = %i)" % (knn.best_params_['n_neighbors'])) plt.show()
Ejemplo KNN Machine Learning

Además de todo esto, existen otros algoritmos como pueden ser los Árboles de decisión que pueden hacer uso de ambas técnicas: regresión y clasificación. De hecho, este tipo de implementación muchas veces se usa como complemento para validar otros modelos. 

Modelos no supervisados

 

Clustering

Aunque similar al anterior puesto que trata de clasificar los datos en grupos específicos, al tratarse de un algoritmo no supervisado, no precisa de información previamente etiquetada. Contesta a cuestiones tales como ¿segmentación de clientes en base a su gasto?, ¿agrupación de productos?, etc.

Clustering
from numpy import unique
from numpy import where
import pandas as pd
from sklearn.cluster import Birch
from matplotlib import pyplot

df = pd.read_csv('[añadir la ruta al fichero csv con los datos]')
f1 = df['Spend'].values f2 = df['Purchases'].values features = list(zip(f1, f2))
model = Birch(threshold=0.01, n_clusters=3) model.fit(features)
yhat = model.predict(features) clusters = unique(yhat) for cluster in clusters:     row_ix = where(yhat == cluster)     pyplot.scatter(f1[row_ix], f2[row_ix])
pyplot.show()
Ejemplo Clustering Machine Learning

Dimensionality reduction

Se centra en la reducción de variables con el objetivo de organizar los datos según patrones más simples en busca de las características esenciales. Como modelo no supervisado que es, se desconoce a priori cómo están etiquetados los datos.

PCA (Principal Component Analysis)
from sklearn.preprocessing import StandardScaler
import pandas as pd
import matplotlib.pyplot as plt
from sklearn.decomposition import PCA

df = pd.read_csv('[añadir la ruta al fichero csv con los datos]') 

features = ['Spend', 'Purchases'] 
x = df.loc[:, features].values y = df.loc[:, ['SourceMedium']].values 

x = StandardScaler().fit_transform(x)
pca = PCA(n_components=2)
principalComponents = pca.fit_transform(x)
principalDf = pd.DataFrame(data=principalComponents, columns=['principal component 1', 'principal component 2'])
finalDf = pd.concat([principalDf, df['SourceMedium']], axis = 1)

fig = plt.figure(figsize = (8,8))
ax = fig.add_subplot(1,1,1)
ax.set_xlabel('PC1', fontsize = 15)
ax.set_ylabel('PC2', fontsize = 15)
ax.set_title('PCA Analysis', fontsize = 20)
targets = ['facebookAds', 'googleAds', 'twitterAds']
colors = ['r', 'g', 'b']
for target, color in zip(targets, colors):     
    indicesToKeep = finalDf['SourceMedium'] == target     
   ax.scatter(finalDf.loc[indicesToKeep, 'principal component 1'], finalDf.loc[indicesToKeep, 'principal component 2'], c=color, s=50)
ax.legend(targets)
ax.grid()

plt.show()
print(pca.explained_variance_ratio_)
Ejemplo PCA Principal Component Analysis Machine Learning

¡Nos vemos en el siguiente artículo! Mientras, si quieres seguir disfrutando con otras lecturas similares en torno a la Analítica, Marketing Digital o Tecnología échale un vistazo al resto del Blog.

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *