Documentos de Académico
Documentos de Profesional
Documentos de Cultura
La primera y más crítica tarea que hay que realizar es encontrar cuáles son las entradas y las
salidas esperadas. Habría que responder a las siguientes cuestiones:
No todos los problemas se pueden resolver, solo podemos hacer ciertas hipótesis hasta que
tengamos un modelo funcionando:
Los datos disponibles contienen la información suficiente para aprender la relación entre las
entradas y las salidas.
Es fundamental tener presente que el Machine Learning solo puede ser usado para memorizar
pautas que están presentes en los datos de entrenamiento, por lo tanto solo podemos
reconocer lo que hemos visto antes. Cuando usamos Machine Learning estamos asumiendo que
el futuro se comportará como el pasado, lo que no siempre es cierto.
2. Recopilar datos
Nota: La tabla corresponde al famoso conjunto de datos del mercado inmobiliario de Boston, un
clásico conjunto de datos usado frecuentemente para desarrollar modelos simples de Machine
Learning. Cada fila representa un diferente vecindario de Boston y cada columna indica alguna
característica del vecindario (índice de criminalidad, edad media de los habitantes,…etc). La
1
última columna representa el precio medio de las viviendas del vecindario. Este es el objetivo,
el dato que será predicho teniendo en cuenta el otro.
a) Nº de registros suficiente?
b) ¿Campos nulos? Eliminarlos si hay
c) ¿Los datos son discretos, continuos…?
d) ¿Salida es binaria, una cantidad…?
e) ¿Están balanceados? Importante en clasificación
f) Seleccionar las variables relevantes
g) ¿Las variables siguen alguna distribución?
h) ¿Correlación entre las variables?
i) Limpiar datos
j) ¿Hay outliers? ¿Los eliminamos? ¿Son errores?
Esta medida debe estar directamente alineada con los objetivos de mayor nivel del negocio, y
también directamente relacionada con el tipo de problema al que nos enfrentamos:
En los siguientes apartados exploraremos en profundidad dichas métricas, cuáles son las más
adecuadas para abordar el problema considerado, y aprenderemos cómo implantarlas.
Una vez está claro el objetivo, se deberá decidir cómo medir el progreso en la persecución de
dicho objetivo. Los protocolos de evaluación más comunes son:
Este método consiste en mantener aparte una porción de los datos como conjunto de datos de
prueba.
En el proceso, se entrena el modelo con la fracción restante de datos, ajustando sus parámetros
con los datos de validación, y finalmente evaluando su rendimiento con el conjunto de datos de
prueba que hemos dejado aparte.
2
La razón de dividir los datos en tres partes es evitar las pérdidas de información. El principal
inconveniente de este método es que, si hay poco volumen de datos disponible, los conjuntos
de datos de validación y prueba contendrán tan pocos casos que el modelo no será efectivo.
K-Fold consiste en dividir los datos en K particiones del mismo tamaño. Para cada partición i, el
modelo es entrenado con las restantes K-1 particiones, y evaluado en la propia partición i.
Esta técnica es especialmente relevante cuando tenemos pocos datos disponibles y se precisa
evaluar el modelo de forma tan precisa como sea posible (es la aproximación estándar en las
competiciones Kaggle).
Consiste en aplicar la validación K-Fold varias veces, y “arrastrar” los datos cada vez antes de
dividirlos en K particiones. La puntuación final es la media de los puntos obtenidos en cada
iteración de la validación K-Fold.
Este método puede ser muy costoso desde el punto de vista computacional, ya que el número
de modelos de entrenamiento y validación será I x K, siendo el I el número de iteraciones y K el
número de particiones.
3
ya que la secuencia de los datos es una característica esencial y el arrastre podría
ocasionar una pérdida temporal.
c) Siempre deberemos buscar y eliminar posibles duplicados en nuestros datos. De otra
manera, podrían aparecer datos redundantes en los conjuntos de datos de
entrenamiento y prueba que causarían aprendizaje inexacto en nuestro modelo.
Antes de comenzar a entrenar modelos, deberíamos transformar nuestros datos de una manera
que puedan alimentar un modelo de Machine Learning. Las técnicas más comunes son:
Es muy común en los problemas del mudo real perder algunos valores de los datos de muestra.
Puede ser debido a errores en la recopilación de datos, espacios en blanco en encuestas,
medidas no aplicables,etc.
Los campos vacíos se representan típicamente con los indicadores “NaN” or “Null”. El problema
es que la mayoría de los algoritmos no pueden manejar esos valores faltantes, por lo que los
tenemos que tener en cuenta antes de alimentar nuestro modelos con datos. Una vez que están
identificados hay varias formas de tratar con ellos:
Eliminar las muestras o características con campos vacíos (corremos el riesgo de borrar
información relevante o demasiadas muestras)
Estimar los campos vacíos con algún estimador preinstalado, como “Imputer Class” de la
herramienta “Scikit Learn”. Primero ajustaremos nuestros datos, y después los transformaremos
para estimarlos. Una aproximación común es establecer los valores faltantes como el valor
medio del resto de las muestras.
4
obtendremos tres nuevas columnas, una para cada clase única. Después, si tenemos una
camiseta amarilla, será representado como amarillo = 1, verde = 0, rojo = 0. De esta
forma nos aseguramos de un buen rendimiento del algoritmo, ya que es mucho más
eficiente cuando trabaja con matrices “ligeras” (matrices poco densas, con muchos
valores “0”).
Como veremos más tarde, una de las principales razones del “overfitting” o sobre-ajuste, que es
un tipo de funcionamiento inadecuado de los modelos de Machine Learning, es la existencia de
redundancia en los datos. Esto hace que el modelo sea demasiado complejo con respecto a los
datos de entrenamiento facilitados, y por tanto incapaz de hacer generalizaciones correctas en
datos no procesados aún.
Una de las soluciones más comunes para evitar el overfitting es reducir la dimensionalidad de
los datos. Esto se realiza frecuentemente reduciendo el número de características de nuestro
conjunto de datos por medio de Principal Component Analysis (PCA), que es una clase de
algoritmo no supervisado de Machine Learning.
PCA identifica pautas en nuestro dato basado en las correlaciones entre características. Esta
correlación implica que hay redundancia en nuestros datos, en otras palabras , que hay parte de
los datos que se pueden explicar por relaciones con otras partes de los mismos.
5
Estos datos correlacionados no son necesarios para el aprendizaje correcto del modelo, y por
tanto pueden ser eliminados. Se pueden eliminar borrando directamente ciertas columnas
(características) o combinando un número de ellos y obteniendo nuevos datos que contengan
la mayoría de la información. Estudiaremos con más profundidad esta técnica en futuros
artículos.
Ahora, es razonable preguntar la siguiente cuestión: ¿Por qué no tener solo dos conjuntos de
datos, entrenamiento y pruebas?. De esta manera, el proceso será mucho más simple,
simplemente entrena el modelo con datos de entrenamiento y pruébalo con datos de prueba.
El último objetivo es que el modelo pueda generalizar bien con datos no procesados aún, en
otras palabras, predecir con exactitud resultados con datos nuevos, basados en sus parámetros
internos ajustados mientras el modelo fue entrenado y validado.
a) Proceso de aprendizaje
Podemos echar un vistazo más cercano a cómo se realiza el proceso de aprendizaje estudiando
uno de los algoritmos más simples: la regresión lineal.
Un ejemplo de regresión lineal: dados X e Y, calculamos una recta que minimice la distancia
entre los puntos de muestra y la recta ajustada, utilizando algunos métodos para estimar los
coeficientes (como mínimos cuadrados o gradiente decreciente). Después, utilizaremos la
ecuación de la recta obtenida para predecir el resultado utilizando datos nuevos.
Los valores disponibles para el entrenamiento son B0 y B1, que son los valores que afectan a la
posición del recta, ya que las otras variables son la entrada (x) y el resultado (y) (el residual no
se considera). Estos valores (B0 y B1) son los “pesos” de la función de predicción.
Estos pesos, y otros llamados sesgos, son los parámetros que se agruparán en matrices (W para
los pesos y B para los sesgos).
El proceso de entrenamiento implica inicializar algunos valores aleatorios para cada una de las
matrices de entrenamiento, y se trata de predecir la salida correspondiente a los valores de
entrada usando los valores aleatorios iniciales. Al principio el error será grande, pero a través de
la comparación de la predicción del modelo con los resultados correctos, el modelo es capaz de
ajustar los pesos y los sesgos hasta conseguir un buen modelo de predicción.
El proceso se repite iteración tras iteración, y en cada una de ellas la recta aleatoria inicial se va
acercando a la ideal y más exacta.
b) “Overfitting” y “Underfitting”
Uno de los problemas más importantes cuando trabajamos con el entrenamiento de modelos,
es el conflicto entre optimización y generalización.
Al principio del entrenamiento, estos dos aspectos están relacionados, cuanto menos desajuste
en datos de entrenamiento, menos desajuste en datos de prueba. Esto ocurre mientras el
7
modelo está infra-ajustado ó“underfitted”: todavía hay aprendizaje por realizar ya que aún no
ha sido modelado según todos los parámetros relevantes.
a) Obtener más datos es normalmente la mejor solución, un modelo entrenado con más
datos generalizará mejor de forma natural.
b) La regularización se realiza cuando lo anterior no es posible. Es el proceso de modular
la cantidad de información que el modelo puede almacenar o añadir restricciones con
la información que se permite mantener. Si el modelo solo memorizar un pequeño
número de pautas, la optimización hará que el enfoque se haga en las más relevantes,
mejorando la posibilidad de generalizar bien.
8
Para decidir cuál de ellos aplicar a nuestro modelo se recomienda tener presente la
siguiente información y tener en cuenta la naturaleza de nuestro problema
El objetivo en este paso del proceso es desarrollar un modelo de comparación que sirva de
referencia, sobre el que mediremos el rendimiento de un algoritmo mejor y más ajustado.
Hoy día las librerías de ciencia de datos realizan fragmentaciones aleatorias de datos, esta
aleatoriedad debe ser consistente a lo largo de todas las ejecuciones. La mayoría de generadores
de aleatoriedad permiten “poner la semilla” (seed) para este propósito. En Python usaremos el
método “random.seed” del “random package”.
Normalmente es útil comparar la mejora del modelo sobre un modelo de referencia simplificado
como KNN o Naive Bayes para datos categóricos, o el EWMA de un valor en datos de series
temporales. Estas referencias proporcionan conocimiento sobre el posible valor predictivo de
un conjunto de datos.
Los modelos a menudo requieren mucho menos tiempo y poder de computación para el
entrenamiento y predicción, haciendo de ellos un análisis cruzado útil para la viabilidad de una
respuesta. Ni KNN ni los modelos nativos de Naive Bayes son adecuados para capturar
interacciones complejas. Sin embargo, proporcionarán una estimación razonable del mínimo
nivel de capacidades predictivas de un modelo de comparación.
Uno de los métodos más comunes para encontrar un buen modelo es la validación cruzada . En
la validación cruzada, estableceremos:
9
Pasaremos nuestro conjunto de datos a nuestra función de puntuación de validación cruzada y
obtener el modelo que da la mejor puntuación. Éste será el que optimizaremos, ajustando sus
parámetros en consecuencia.
results = []
names = []
# Compare Algorithms
fig = pyplot.figure()
fig.suptitle('Algorithm Comparison')
ax = fig.add_subplot(111)
pyplot.boxplot(results)
ax.set_xticklabels(names)
10
pyplot.show()
Un algoritmo de Machine Learning tiene dos tipos de parámetros, el primer tipo son los
parámetros que se aprenden a través de la fase de aprendizaje, y el segundo tipo son los
hiperparámetros que transferimos al modelos de machine Learning.
Una vez identificado el modelo que usaremos, el siguiente paso es ajustar sus hiperparámetros
para obtener el mayor poder predictivo posible. La forma más común de encontrar la mejor
combinación de hiperparámetros se llama “Grid Search Cross Validation”.
# Build a scaler
scaler = StandardScaler().fit(X_train)
rescaledX = scaler.transform(X_train)
c_values = [0.1, 0.3, 0.5, 0.7, 0.9, 1.0, 1.3, 1.5, 1.7, 2.0]
kernel_values = ['linear', 'poly', 'rbf', 'sigmoid']
param_grid = dict(C=c_values, kernel=kernel_values)
model = SVC()
11
kfold = KFold(n_splits=num_folds, random_state=seed)
grid = GridSearchCV(estimator=model, param_grid=param_grid, scoring=scoring, cv=kfold)
grid_result = grid.fit(rescaledX, y_train)
8. Conclusión
Hemos cubierto muchos conceptos importantes a lo largo de este artículo. Aunque se han
revisado estos concepto a alto nivel, es necesario desarrollar una intuición adecuada sobre cómo
y cuándo aplicar los métodos explicados.
Exploraremos estos métodos en mayor profundidad según sean abordados en los artículos
siguientes, así como las implementaciones Python.
12