Saltar al contenido

Archivos de categoría Machine Learning

Introducción a la Regresión Logística

¿Que es regresión logística?

La regresión logística es una técnica estadística de machine learning para clasificar los registros de un conjunto de datos, basandose en los valores de los campos de entrada. En regresión logística, usaremos una o mas variables independientes para predecir un resultado, al cual llamaremos variable dependiente. La regresión logística es análoga a la regresión lineal pero intenta predecir un campo objetivo categórico o discreto en lugar de uno numérico.
En la regresión lineal, se intenta predecir variables de valor continuo (precio de una casa, presión sanguínea o consumo de gasolina). En regresión logística se predicen variables binarias (Si/No, Verdadero/Falso, Suceso o No suceso, embarazada o no). En la regresión logística las variables dependientes deben ser continuas, por lo que, si son categóricas hay que transformarlas en algún valor continuo. La regresión logística puede ser usada tanto para clasificación binaria como para multiclase, pero para simplificar, nos centraremos en la clasificación binaria.

¿Qué tipo de problemas pueden ser resueltos?

  • Predecir la probabilidad de que una persona tenga un ataque al corazón en un periodo especificado de tiempo, basado en nuestro conocimiento de la edad de la persona, sexo, e indice de masa corporal.
  • Predecir la probabilidad de mortalidad en un paciente herido, o predecir si un paciente tiene una enfermedad, como la diabetes, basado en las características observadas de ese paciente, como el peso, la altura, la presión sanguínea, y el resultado de varios test de sangre, etc.
  • En un contexto de marketing, podemos usarlo para predecir la probabilidad de un cliente de estar pagando o cancelando una suscripción.
  • También podemos usar regresión logística para predecir la probabilidad de fallo de un proceso, sistema o producto.
  • Podemos precedir la probabilidad del propietario de dejar de pagar la hipoteca.

En todos estos ejemplos no solo predecimos la clase de cada caso, tambien medimos la probabilidad de que un caso pertenezca a una clase específica.

¿Y en qué situaciones la usaremos?

Hay cuatro situaciones en las que la regresión logística es una buena candidata:

  • Primero, cuando el campo objetivo en los datos es categórico, o especificamente binario como son 0/1, si/no, positivo/negativo, etc.
  • Segundo, si se necesita la probabilidad de la predicción, por ejemplo, si se quiere conocer cual es la probabilidad de que un cliente compre un producto. La regresión logística devuelve una probabilidad entre 0 y 1 para una muestra dada.
  • Tercero, si los datos son linealmente separables. La frontera de decisión de una regresión logística es un línea o un plano o un hiperplano. Un clasificador clasificará todos los puntos en el lado de la línea de decisión al que pertenecen. Y los demás en el otro lado al que pertenece la otra clase. Por ejemplo, si tenemos dos características (y no se está aplicando un proceso polinómico), podremos obtener una inecuación como θ0 + θ1×1 + θ2×2 > 0, lo cuál es un medio plano facilmente dibujable. Usando regresión logística, podemos lograr un límite de decisión complejo usando procesos polinómicos.
  • Cuarto, si se necesita comprender el impacto de una característica. Se puede seleccionar las mejores características basadas en el significado estadístico
    de los coeficientes o parametros del modelo de regresión logística. Esto es, despues de encontrar los parametros óptimos, una característica X con el peso θ1 cercano a 0, tiene un efecto mas pequeño en la predicción, que características con amplios valores absolutos de θ1. Esto nos permite comprender el impacto de una variable independiente sobre una dependiente mientras controlamos otras variables independientes.

Ir al artículo anterior de la serie: Construyendo árboles de decisión

Ir al artículo siguiente de la serie:

0 Seguir leyendo →

Construyendo árboles de decisión

Construyendo árboles de decisión

Vamos a ver como se están construyendo los árboles de decisión: se crean utilizando el particionamiento recursivo para clasificar los datos. El algoritmo elige la característica más predictiva en la que se deben dividir los datos. Lo que es importante en la elaboración de un árbol de decisiones es determinar qué atributo es el mejor, o más predictivo, para dividir los datos en función de la característica. La «predictibilidad» se basa en la disminución de la «impureza» de los nodos. Un nodo en el árbol se considera «puro» si, en el 100% de los casos, los nodos caen en una categoría específica del campo objetivo. De hecho, el método utiliza el particionamiento recursivo para dividir los registros en segmentos minimizando la «impureza» en cada paso. La «Impureza» de los nodos se calcula mediante la «Entropía» de los datos en el nodo.
VER EJEMPLO EN PYTHON

¿qué es «Entropía»?

La entropía es la cantidad de desorden de la información, o la cantidad de aleatoriedad en los datos. La entropía en un nodo depende de la cantidad de datos aleatorios que se encuentran en ese nodo y se debe calcular para cada nodo. En los árboles de decisión, buscamos a los árboles que tengan la entropía más pequeña en sus nodos. La entropía se utiliza para calcular la homogeneidad de las muestras en ese nodo. Si las muestras son completamente homogéneas la entropía es cero y si las muestras son divididas equitativamente tiene una entropía de uno.

Es posible calcular la entropía de un nodo utilizando la tabla de frecuencias del atributo a través de la fórmula de Entropía: Entropia(S) = \sum_{i=1}^{n}{-p_i \cdot log_2(p_i)}, donde p_i es la proporción o ratio de una categoría. Con esta fórmula podemos probar diferentes atributos para encontrar el que tiene la mejor «predictibilidad», menor entropía. Para ello deberíamos ir por todos los atributos y calcular la «Entropía» después de la división y, a continuación, elegir el mejor atributo.

Pero ¿qué atributo resulta en más nodos puros? ¿en qué árbol tenemos menos entropía después de la división en lugar de antes de la división? La respuesta es en el árbol con la mayor ganancia de información después de la división. Pero, ¿qué es la ganancia de información? La ganancia de información es la información que puede aumentar el nivel de certeza después de la división. Es la entropía de un árbol antes de la división menos la entropía ponderada después de la división por un atributo. Podemos pensar en la ganancia de la información y en la entropía como opuestos. Como la entropía, o la cantidad de aleatoriedad, disminuye, la ganancia de la información, o la cantidad de certeza, aumenta, y viceversa. Por lo tanto, la construcción de un árbol de decisión se trata de encontrar atributos que devuelvan la más alta ganancia de información.

Deberíamos repetir el proceso para cada rama,y probar cada uno de los otros atributos para alcanzar la mayor cantidaddes hojas puras.

Ir al artículo anterior de la serie: Introducción a los árboles de decisión

Ir al artículo siguiente de la serie:Introducción a la Regresión Logística

0 Seguir leyendo →

Introducción a los árboles de decisión

Introducción a los árboles de decisión

árbol de decisiónPara ver una introducción a los árboles de decisión, imagina que eres un investigador médico que compila datos para un estudio. Ya has recolectado datos sobre un conjunto de pacientes, los cuales sufrieron de la la misma enfermedad. Durante el curso de su tratamiento, cada paciente respondió a uno de los dos medicamentos; nosotros los llamaremos fármaco A y fármaco B. Tu trabajo consiste en construir un modelo para encontrar qué medicamento podría ser apropiado para un paciente futuro con la misma enfermedad. Los conjuntos de características de este dataset son edad, género, presión sanguinea y colesterol de nuestro grupo de pacientes, y el objetivo es el fármaco al que cada paciente respondió.

Es una muestra de clasificadores binarios, y se puede utilizar la parte de entrenamiento del dataset para construir un árbol de decisiones, y luego, usarlo para predecir la clase de un paciente desconocido … en esencia, para llegar a una decisión sobre qué medicamento se debería recetar a un nuevo paciente.

creación de un árbol de decisiones

Los árboles de decisión se crean dividiendo el conjunto entrenado en nodos distintos, donde un nodo contiene todo, o la mayoría, de una categoría de los datos. Así que, si queremos recetar un medicamento a un nuevo paciente, debemos tener en cuenta la situación del paciente. Empezamos con la Edad, el cual puede ser Joven, Mediana Edad o Mayor. Si el paciente es de mediana edad, entonces iremos por el fármaco B. Por otro lado, si el paciente es joven o mayor, necesitaremos más detalles para ayudarnos a decidir que medicamento recetar. Las variables de decisión adicionales pueden ser cosas tales como los niveles de colesterol, sexo o presión sanguínea. Por ejemplo, si el paciente es femenino, entonces recomendaremos el fármaco A, pero si el paciente es masculino, entonces iremos por el fármaco B. Como puedes ver, los árboles de decisión tratan sobre probar un atributo y ramificar los casos, basándose en el resultado de la prueba.

  • Cada nodo interno corresponde a una prueba.
  • Cada rama se corresponde con un resultado de la prueba.
  • Cada nodo de hoja asigna un paciente a una clase.

Se puede construir un árbol de decisiones teniendo en cuenta los atributos uno por uno. En primer lugar, elije un atributo de nuestro dataset. Calcula la importancia del atributo en la división de los datos. Más adelante explicaremos cómo calcular la importancia de un atributo, para ver si se trata de un atributo efectivo o no. A continuación, divide los datos en función del valor del mejor atributo. Luego, ve a cada rama y repitelo para el resto de los atributos. Después de construir este árbol, puede usarlo para predecir la clase de casos desconocidos o, en nuestro caso, el fármaco adecuado para un nuevo paciente basado en su caracterestica.

Ir al artículo anterior de la serie: Evaluación del modelo de clasificación

Ir al artículo siguiente de la serie: Construyendo árboles de decisión

0 Seguir leyendo →

Evaluación del modelo de clasificación

Evaluación del modelo de clasificación

Las métricas de evaluación del modelo de clasificación explican el rendimiento de un modelo. Para mostrar algunos modelos de evaluación para la clasificación, vamos a utilizar el supuesto de un conjunto de datos que muestra el ratio de abandono de clientes de una Empresa. Hemos entrenado al modelo,y ahora queremos calcular su precisión utilizando el set de pruebas. Pasamos el set de pruebas a nuestro modelo,y encontramos las etiquetas predichas. ¿Cómo de preciso es este modelo?

Básicamente, se comparan los valores reales del conjunto de pruebas con los valores pronosticados por el modelo, para calcular su precisión. Las métricas de evaluación del modelo de clasificación proporcionan un papel clave en el desarrollo de un modelo, ya que proporcionan pistas de las áreas que pueden mejorarse. Hay diferentes métricas de evaluación de modelos, pero vamos a evaluar las más usadas: índice de Jaccard, F1-score y Log Loss.

Índice de Jaccard

Es una de las medidas de precisión más simples, y también es conocido como el coeficiente de similaridad Jaccard. Para el cálculo de este índice se utiliza la teoría de conjuntos y se puede definir como la intersección de los conjuntos de valores predichos y reales dividido por unión de los dos conjuntos de datos. Si el conjunto completo de etiquetas predichas para una muestra coincide estrictamente con el conjunto verdadero de etiquetas, entonces la precisión del es 1.0, en el extremo contrario, si no coincide ningún valor, el índice es 0.0.

Matríz de confusión (F1-score)

La matriz de confusión muestra las predicciones correctas y exhaustivas, en comparación con las etiquetas reales. Cada fila de la matriz de confusión muestra las etiquetas Reales/Verdaderas del conjunto de pruebas, y las columnas muestran las etiquetas predichas por el clasificador. La matriz de confusión muestra la habilidad del modelo para predecir correctamente. En el caso específico de un clasificador binario podemos interpretar estos números como el recuento de positivos verdaderos (aciertos), positivos falsos (errores), negativos verdaderos (errores), y negativos falsos (aciertos). Basándonos en el conteo de cada sección, podemos calcular la precisión y la exhaustividad de cada una de las etiquetas. La precisión es una medida de la exactitud, a condición de que una etiqueta de clase se haya predicho correctamente.

Se define mediante:
Precision = \frac{Positivo\ verdadero}{(Positivo\ verdadero + Positivo\ Falso)}
Exhaustividad = \frac{Positivo\ verdadero}{(Positivo\ verdadero + Negativo\ Falso)}

Por lo tanto, podemos calcular la precisión y la exhaustividad de cada clase y con ello el F1-scores para cada etiqueta: El F1-score es el promedio armónico de la precisión y la exhaustividad, donde el F1-score alcanza su mejor valor en 1 (que representa la precisión y la exhaustividad perfecta) y su peor valor en 0. Se define utilizando la ecuación F1-score: F1\-score = 2 \cdot \frac{(Precision \cdot Exhaustividad)}{(Precision + Exhaustividad)}
Supongamos el siguiente ejemplo:
F1-score
Para el valor churn=0, Precision = \frac{24}{(24 + 9)} = \frac{24}{33} = 0.727 y Exhaustividad = \frac{24}{(24 + 1)} = \frac{24}{25} = 0.960 => F1\^-score = 2 \cdot \frac{(0.727 \cdot 0.960)}{(0.727 + 0.960)} = 2 \cdot \frac{0.698}{1.687} = 0.827
Para el valor churn=1, Precision = \frac{6}{(6 + 1)} = \frac{6}{7} = 0.857 y Exhaustividad = \frac{6}{(6 + 9)} = \frac{6}{15} = 0.400 => F1\^-score = 2 \cdot \frac{(0.857 \cdot 0.400)}{(0.857 + 0.400)} = 2 \cdot \frac{0.343}{1.257} = 0.546
Y finalmente la media ponderada es \frac{(0.827 \cdot 25) + (0.546 \cdot 15)}{25 + 15} = \frac{28.865}{40} = 0.722

Tenga en cuenta que tanto Jaccard como F1-score se pueden utilizar también para clasificadores multi-clase.

Log Loss

A veces, el resultado de un clasificador es la probabilidad de una etiqueta de clase, en lugar de la etiqueta. Por ejemplo, el resultado puede ser la probabilidad de abandono del cliente, es decir, si el resultado es 1, entonces el cliente abandonaría. Esta probabilidad es un valor entre 0 y 1. Log loss mide el rendimiento de un clasificador donde el resultado pronosticado es un valor de probabilidad entre 0 y 1.
Se puede calcular el Log loss para cada fila utilizando la ecuación de Log loss, que mide como de lejos está cada predicción con respecto a la etiqueta real. Luego calculamos el Log loss promedio en todas las filas del conjunto de pruebas:
LogLoss = -\frac{1}{n} \cdot \sum_{}^{}{(y \cdot \log{(y') + (1 - y) \cdot \log{(1 - y')}})}
Es evidente que los clasificadores más idóneos tienen valores progresivamente más pequeños de Log loss. Por lo tanto, el clasificador con menor Log loss tiene una mejor precisión.

Ir al artículo anterior de la serie: K-vecinos más próximos

Ir al artículo siguiente de la serie: Introducción a los árboles de decisión

0 Seguir leyendo →

K-vecinos más próximos en Python

Importación de los paquetes básicos

import itertools
import numpy as np
import matplotlib.pyplot as plt
from matplotlib.ticker import NullFormatter
import pandas as pd
import numpy as np
import matplotlib.ticker as ticker
from sklearn import preprocessing
%matplotlib inline

Importación de los datos

Imagina un proveedor de telecomunicaciones que ha segmentado la base de sus clientes por servicio, categorizando a los clientes en cuatro grupos. Si los datos demográficos se pueden usar para predecir la pertenencia de grupo del envío, la compañía podría personalizar las ofertas para los prospectos. Es un problema de clasificación. Este ejemplo hace foco en datos demográficos, sean region, edad, estado civil, para predecir patrones de uso. El campo objetivo (target), llamado custcat, tiene cuatro valores posibles que corresponden a los cuatro grupos de clientes: 1- Servicio Básico 2- E-Servicio 3- Servicio Plus 4- Servicio Total

Nuestro objetivo es construir un clasificador para predecir la clase de casos desconocidos. Utilizaremos un tipo específico de clasificación llamado K vecino más cercano.

!wget -O teleCust1000t.csv https://s3-api.us-geo.objectstorage.softlayer.net/cf-courses-data/CognitiveClass/ML0101ENv3/labs/teleCust1000t.csv
df = pd.read_csv('teleCust1000t.csv')
df.head()
region tenure age marital address income ed employ retire gender reside custcat
0 2 13 44 1 9 64.0 4 5 0.0 0 2 1
1 3 11 33 1 7 136.0 5 5 0.0 0 6 4
2 3 68 52 1 24 116.0 1 29 0.0 1 2 3
3 2 33 33 0 12 33.0 2 0 0.0 1 1 1
4 2 23 30 1 9 30.0 1 2 0.0 0 4 3

Veamos cuántos de cada clase están en nuestro set de datos

df['custcat'].value_counts()
3    281
1    266
4    236
2    217
Name: custcat, dtype: int64

Puedes explorar fácilmente tus datos utilizando técnicas de visualización:

df.hist(column='income', bins=50)

Definamos feature sets, X:

df.columns
Index(['region', 'tenure', 'age', 'marital', 'address', 'income', 'ed',
       'employ', 'retire', 'gender', 'reside', 'custcat'],
      dtype='object')

Para utilizar la librería scikit-learn, tenemos que convertir el data frame de Panda en un Numpy array:

X = df[['region', 'tenure','age', 'marital', 'address', 'income', 'ed', 'employ','retire', 'gender', 'reside']] .values  #.astype(float)
X[0:5]
array([[  2.,  13.,  44.,   1.,   9.,  64.,   4.,   5.,   0.,   0.,   2.],
       [  3.,  11.,  33.,   1.,   7., 136.,   5.,   5.,   0.,   0.,   6.],
       [  3.,  68.,  52.,   1.,  24., 116.,   1.,  29.,   0.,   1.,   2.],
       [  2.,  33.,  33.,   0.,  12.,  33.,   2.,   0.,   0.,   1.,   1.],
       [  2.,  23.,  30.,   1.,   9.,  30.,   1.,   2.,   0.,   0.,   4.]])

¿Cuáles son nuestras etiquetas?

y = df['custcat'].values
y[0:5]
array([1, 4, 3, 1, 3])

Normalizar los Datos

La estandarización de datos haciendo que la media sea 0 y la varianza uno es buena práctica, especialmente para algoritmos tales como KNN el cual se basa en distancia de casos:

X = preprocessing.StandardScaler().fit(X).transform(X.astype(float))
X[0:5]
array([[-0.02696767, -1.055125  ,  0.18450456,  1.0100505 , -0.25303431,
        -0.12650641,  1.0877526 , -0.5941226 , -0.22207644, -1.03459817,
        -0.23065004],
       [ 1.19883553, -1.14880563, -0.69181243,  1.0100505 , -0.4514148 ,
         0.54644972,  1.9062271 , -0.5941226 , -0.22207644, -1.03459817,
         2.55666158],
       [ 1.19883553,  1.52109247,  0.82182601,  1.0100505 ,  1.23481934,
         0.35951747, -1.36767088,  1.78752803, -0.22207644,  0.96655883,
        -0.23065004],
       [-0.02696767, -0.11831864, -0.69181243, -0.9900495 ,  0.04453642,
        -0.41625141, -0.54919639, -1.09029981, -0.22207644,  0.96655883,
        -0.92747794],
       [-0.02696767, -0.58672182, -0.93080797,  1.0100505 , -0.25303431,
        -0.44429125, -1.36767088, -0.89182893, -0.22207644, -1.03459817,
         1.16300577]])

Dividimos la muestra en los conjuntos de datos para el entrenamiento y para la prueba de exactitud

from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split( X, y, test_size=0.2, random_state=4)
print ('Set de Entrenamiento:', X_train.shape,  y_train.shape)
print ('Set de Prueba:', X_test.shape,  y_test.shape)
Set de Entrenamiento: (800, 11) (800,)
Set de Prueba: (200, 11) (200,)

Clasificación

importar librería del Clasificador que implementa k-vecinos más cercanos.

from sklearn.neighbors import KNeighborsClassifier

Para el entrenamiento vamos a comenzar con el algoritmo con k=4 por ahora:

k = 4
#Entrenar el Modelo y Predecir  
neigh = KNeighborsClassifier(n_neighbors = k).fit(X_train,y_train)
neigh
KNeighborsClassifier(algorithm='auto', leaf_size=30, metric='minkowski',
           metric_params=None, n_jobs=None, n_neighbors=4, p=2,
           weights='uniform')

Usamos el modelo para predecir el set de prueba:

yhat = neigh.predict(X_test)
yhat[0:5]
array([1, 1, 3, 2, 4])

Para evaluar la certeza usamos la función classification accuracy score que computa la certeza del subconjunto. Esta función es igual a la función jaccard_similarity_score. Básicamente, calcula cómo se relacionan las etiquetas actuales con las etiquetas predichas dentro del set de pruebas.

from sklearn import metrics
print("Entrenar el set de Certeza: ", metrics.accuracy_score(y_train, neigh.predict(X_train)))
print("Probar el set de Certeza: ", metrics.accuracy_score(y_test, yhat))
Entrenar el set de Certeza:  0.5475
Probar el set de Certeza:  0.32

Para un K=6 tenemos los siguientes resultados

k = 6
neigh6 = KNeighborsClassifier(n_neighbors = k).fit(X_train,y_train)
yhat6 = neigh6.predict(X_test)
print("Certeza del Set de Entrenamiento: ", metrics.accuracy_score(y_train, neigh6.predict(X_train)))
print("Certeza del Set de Prueba: ", metrics.accuracy_score(y_test, yhat6))
Certeza del Set de Entrenamiento:  0.51625
Certeza del Set de Prueba:  0.31

Cálculo del mejor k

Elegimos k =1, lo utilizamos como parte del entrenamiento para modelar, y calculamos la certeza de la predicción utilizando todas las muestras del set de pruebas. Repetir este proceso, aumentando el k, y viendo luego, cual es el mejor k para el modelo.

Ks = 10
mean_acc = np.zeros((Ks-1))
std_acc = np.zeros((Ks-1))
ConfustionMx = [];
for n in range(1,Ks):
    #Entrenar el Modelo y Predecir  
    neigh = KNeighborsClassifier(n_neighbors = n).fit(X_train,y_train)
    yhat=neigh.predict(X_test)
    mean_acc[n-1] = metrics.accuracy_score(y_test, yhat)
    std_acc[n-1]=np.std(yhat==y_test)/np.sqrt(yhat.shape[0])
mean_acc
array([0.3  , 0.29 , 0.315, 0.32 , 0.315, 0.31 , 0.335, 0.325, 0.34 ])

Dibujo de la certeza del modelo para diferentes números de vecinos

plt.plot(range(1,Ks),mean_acc,'g')
plt.fill_between(range(1,Ks),mean_acc - 1 * std_acc,mean_acc + 1 * std_acc, alpha=0.10)
plt.legend(('Certeza ', '+/- 3xstd'))
plt.ylabel('Certeza ')
plt.xlabel('Número de Vecinos (K)')
plt.tight_layout()
plt.show()

print( "La mejor aproximación de certeza fue con ", mean_acc.max(), "con k=", mean_acc.argmax()+1) 
La mejor aproximación de certeza fue con  0.34 con k= 9
0 Seguir leyendo →

K-vecinos más próximos

K-vecinos más próximos

Para comprender el algorítmo de clasificación K-vecinos más próximos, imagine que un proveedor de telecomunicaciones ha segmentado su base de clientes según el patrón de uso de servicios, categorizando a los clientes en cuatro grupos. Si los datos demográficos se pueden utilizar para predecir la pertenencia a un grupo, la empresa puede personalizar ofertas para clientes potenciales. Se trata de un problema de clasificación. Es decir, dado el conjunto de datos, con las etiquetas predefinidas, tenemos que construir un modelo que se utilizará para predecir la clase de un caso nuevo o desconocido. El ejemplo se centra en el uso de datos demográficos, como la región, la edad y el estado civil, para predecir patrones de uso. El campo objetivo, tiene cuatro valores posibles que corresponden a los cuatro grupos de clientes: Servicio básico, servicio electrónico, servicio adicional y servicio total. Nuestro objetivo es construir un clasificador usando datos de clientes conocidos para predecir el grupo de un nuevo cliente.

Vamos a utilizar el criterio de clasificación llamado «vecino más próximo». Para simplificar vamos a utilizar sólo dos campos como predictores, la Edad y el Salario, y luego pintar a los clientes en función de estos datos. Si ahora tenemos un nuevo cliente con una edad y salario conocido. ¿Cómo podemos encontrar la clase de este cliente? ¿Podemos encontrar uno de los casos más próximos y asignar la misma etiqueta de clase a nuestro nuevo cliente? ¿Podemos también decir que la clase de nuestro nuevo cliente es probablemente el mismo que el vecino más próximo? Sí, podemos. Pero ¿Hasta qué punto podemos confiar en nuestro juicio, que se basa en el el primer vecino más próximo? Podría ser un mal juicio, especialmente si el primer vecino más próximo es muy específico o un valor atípico, ¿correcto? Por esto, en lugar de elegir al primer vecino más próximo, ¿qué tal si elegimos a los cinco vecinos más próximos, y vemos que tipo es el más frecuente para definir la clase de nuestro nuevo cliente? ¿Esto no tiene más sentido? De hecho, sí.

Este ejemplo pone de relieve la intuición detrás del algoritmo del vecino más próximo.

Definición

El algoritmo del k-vecinos más próximos es un algoritmo de clasificación que toma un montón de puntos marcados y los utiliza para aprender a etiquetar otros puntos. Este algoritmo clasifica los casos basados en su similitud con otros casos. En los vecinos más próximos, los puntos de datos que están cerca entre sí se dicen que son «vecinos». El algoritmo se basa en este paradigma: Casos similares con las mismas etiquetas de clase están cerca el uno al otro.
Por lo tanto, la distancia entre dos casos es una medida de su disimilitud. Existen diferentes maneras de calcular la similitud, la distancia o la disimilitud de dos puntos de datos. El más común es la distancia de Euclidia.

Funcionamiento (VER EJEMPLO EN PYTHON)

En un problema de clasificación, el algoritmo del vecino más próximo funciona de la siguiente forma:

  • Elegir un valor para K.
  • Calcular la distancia desde el nuevo caso (exclusión de cada uno de los casos del conjunto de datos).
  • Buscar las «k» observaciones en los datos de entrenamiento que son «más próximos» al punto de datos desconocido.
  • Predecir la respuesta del punto de datos desconocido utilizando el valor de respuesta más popular de los vecinos más próximos.

Hay dos partes en este algoritmo que pueden ser un poco confusas: Cómo seleccionar la K correcta y cómo calcular la similaridad entre los casos.

Calculo de similitud

Se puede utilizar la distancia Minkowski para calcular la distancia entre datos, que es en efecto, la distancia Euclidia: Dis(x_1, x_2) = \sqrt{\sum_{i=0}^{n}{(x_{1i} - x_{2i})^2}} Si tenemos más de una característica podemos seguir utilizando la misma fórmula, pero ahora lo usamos en un espacio bidimensional. También podemos usar la misma matriz de distancia para los vectores multidimensionales. Por supuesto, tenemos que normalizar nuestro conjunto de características para obtener la medida de disimilitud precisa. También hay otras medidas de disimilitud que pueden ser utilizadas para este propósito, pero, tal como se menciona, es altamente dependiente del tipo de datos y también el dominio que la clasificación está hecho por él.

Cálculo de K en el k-vecinos más próximos

En el algoritmo de K-vecinos más próximos, K es el número de vecinos más próximos a examinar. Se supone que debe ser especificado por el usuario.
¿Qué ocurre si elegimos un valor muy bajo de K, digamos, k= 1? Esto sería una mala predicción, ya que un caso específico puede hacer que el modelo falle. Podemos decir que hemos capturado el ruido en los datos, o elegimos uno de los puntos que era una anomalía en los datos. Un valor bajo de K causa también un modelo muy complejo, lo que podría resultar en un exceso de ajuste del modelo. Esto significa que el proceso de predicción no se generaliza lo suficiente como para ser utilizado para casos fuera de la muestra. Los datos de fuera de la muestra son datos que están fuera del conjunto de datos utilizado para entrenar el modelo. En otras palabras, no se puede confiar en que sea utilizado para la predicción de muestras desconocidas. Es importante recordar que el exceso de ajuste es malo, ya que queremos un modelo general que funcione para cualquier dato, no sólo los datos utilizados para el entrenamiento.
Ahora, en el lado opuesto del espectro, si elegimos un valor muy alto de K, tal como K=20, entonces el modelo se vuelve demasiado generalizado. Así que, ¿cómo podemos encontrar el mejor valor para K? La solución general es reservar una parte de los datos para probar la precisión del modelo. Una vez que se ha hecho, se elige k =1, y luego se usa la parte de entrenamiento para modelaje, y calcula la precisión de la predicción utilizando todos los ejemplos en el conjunto de pruebas. Se repite este proceso, incrementando el k, y se ve cuál de los k es el mejor para su modelo.

El análisis del vecinos más próximo también se puede utilizar para calcular valores para un objetivo continuo. En esta situación, se utiliza el valor de objetivo promedio o promedio de los vecinos más próximos para obtener el valor predicho para el nuevo caso. Por ejemplo, suponga que está prediciendo el precio de un inicio basado en su conjunto de características, tales como el número de habitaciones, las imágenes cuadradas, el año en que fue construido, etc. Puede encontrar fácilmente las tres casas vecinas más cercanas, por supuesto, no sólo en base a la distancia, si no también basado en todos los atributos, y luego predice el precio de la casa, como el promedio de los vecinos.

Ir al artículo anterior de la serie: Introducción a la clasificación

Ir al artículo siguiente de la serie: Evaluación del modelo de clasificación

0 Seguir leyendo →

Introducción a la clasificación

Introducción a la clasificación

Para realizar esta introducción a la clasificación tenemos que conocer que en Machine Learning, la clasificación es un enfoque de aprendizaje supervisado, que puede ser pensado como un medio de categorización o «clasificación» de algunos elementos desconocidos en un conjunto discreto de «clases».
La clasificación intenta aprender la relación entre un conjunto de variables características y una variable objetivo. El atributo objetivo en clasificación es una variable categórica con valores discretos.

¿Cómo funcionan las clasificaciones y los clasificadores?

Dado un conjunto de datos de entrenamiento, junto con las etiquetas objetivo, la clasificación determina la etiqueta de clase para un caso de prueba no etiquetado. Veamos un ejemplo: Veamos como clasificar la predicción de incumplimiento de pago de un préstamo. Supongamos que un banco está preocupado por el incumplimiento de pago de sus préstamos. Si se puede usar datos previos de préstamos no pagados para predecir qué clientes podrían tener problemas pagando sus préstamos, estos clientes de «riesgo» pueden no obtener un prestamos o se les puede ofrecer productos alternativos. El objetivo es utilizar los datos de incumplimiento de préstamo existentes de los clientes (edad, ingresos, educación, etc.) para construir un clasificador, pasar a un nuevo cliente por el modelo y luego etiquetarlo como «no pagador» o «pagador».

Así es como un clasificador predice un caso de prueba sin etiquetas. Hay que tener en cuenta que en este ejemplo específico era de un clasificador binario con dos valores. También podemos crear modelos de clasificadores multi-clases. Por ejemplo, si hemos recopilado datos acerca de un conjunto de pacientes, los cuales sufrieron todos de la misma enfermedad. Durante su tratamiento, cada paciente respondió a uno de tres medicamentos. Puede utilizar este conjuunto de datos etiquetado, con un algoritmo de clasificación, para contruir un modelo de clasificación. De esta manera puedes usarlo para averiguar qué medicamento podría ser apropiado para un futuro paciente con la misma enfermedad. Como puede ver, se trata de una muestra de clasificación multi-clases.

La clasificación tiene también diferentes casos de uso empresarial, por ejemplo:

  • Para predecir la categoría a la que pertenece un cliente
  • Para la detección del ratio de abandono,donde predecimos si un cliente cambia a otro proveedor o marca; o para predecir si un cliente responde o no a una campaña publicitaria en particular.
  • Para el filtrado de correos electrónico, reconocimiento de voz, reconocimiento de escritura a mano, identificación bio-métrica, clasificación de documentos, y mucho más.

Aquí tenemos algunos tipos de algoritmos de clasificación en machine learning.

  • Árboles de decisión
  • Naïve Bayes
  • Análisis Linear Discriminante
  • K-nearest neighbor
  • Regresión logística
  • Neural Networks
  • Support Vector Machines.

Ir al artículo anterior de la serie: Regresión no lineal

Ir al artículo siguiente de la serie: K-vecinos más próximos

0 Seguir leyendo →

Regresión no lineal en Pyton

Importación de los paquetes básicos

import numpy as np              # paquete básico para calculos científicos
import matplotlib.pyplot as plt # para crear graficos
%matplotlib inline              # muestra los graficos en la linea de comandos de Python

Creación de diferentes conjuntos de datos

Función cúbica (y = a x^{3} + b x^{2} + c x + d)

x = np.arange(-5.0, 5.0, 0.1)
##Puede ajustar la pendiente y la intersección para verificar los cambios del gráfico
y = 1*(x**3) + 1*(x**2) + 1*x + 3
y_noise = 20 * np.random.normal(size=x.size)
ydata = y + y_noise
plt.plot(x, ydata,  'bo')
plt.plot(x,y, 'r') 
plt.ylabel('Variable dependiente')
plt.xlabel('Variable indepdendiente')
plt.show()

Función cuadrática (y = x^{2})

x = np.arange(-5.0, 5.0, 0.1)
##Se puede ajustar la pendiente y la intersección para verificar los cambios en el gráfico
y = np.power(x,2)
y_noise = 2 * np.random.normal(size=x.size)
ydata = y + y_noise
plt.plot(x, ydata,  'bo')
plt.plot(x,y, 'r') 
plt.ylabel('Variable dependiente')
plt.xlabel('Variable indepdiendente')
plt.show()

Exponencial (y = a + b c^{x})

X = np.arange(-5.0, 5.0, 0.1)
##Se puede ajustar la pendiente y la intersección para verificar los cambios en el gráfico
Y= np.exp(X)
plt.plot(X,Y) 
plt.ylabel('Variable Dependiente')
plt.xlabel('Variable Independiente')
plt.show()

Logarítmica (y = \log(x))

X = np.arange(-5.0, 5.0, 0.1)
Y = np.log(X)
plt.plot(X,Y) 
plt.ylabel('Variable Dependiente')
plt.xlabel('Variable Independiente')
plt.show()

Sigmoidal/Logística (y = a + \dfrac{b}{1 + c^{(x - d)}})

X = np.arange(-5.0, 5.0, 0.1)
Y = 1-4/(1+np.power(3, X-2))
plt.plot(X,Y) 
plt.ylabel('Variable Dependiente')
plt.xlabel('Variable Independiente')
plt.show()

Ejemplo completo

Descarga del fichero de datos

import numpy as np
import pandas as pd
#downloading dataset
!wget -nv -O china_gdp.csv https://s3-api.us-geo.objectstorage.softlayer.net/cf-courses-data/CognitiveClass/ML0101ENv3/labs/china_gdp.csv
df = pd.read_csv("china_gdp.csv")
df.head(10)  # mostramos los primeros datos 
Year Value
0 1960 5.918412e+10
1 1961 4.955705e+10
2 1962 4.668518e+10
3 1963 5.009730e+10
4 1964 5.906225e+10
5 1965 6.970915e+10
6 1966 7.587943e+10
7 1967 7.205703e+10
8 1968 6.999350e+10
9 1969 7.871882e+10

Mostrado de los datos

plt.figure(figsize=(8,5))
x_data, y_data = (df["Year"].values, df["Value"].values)
plt.plot(x_data, y_data, 'ro')
plt.ylabel('GDP')
plt.xlabel('Year')
plt.show()

Eligiendo un modelo

A primera vista, determinamos que la función lógica podría ser una buena primera aproximación, ya que tiene la propiedad de comenzar con un crecimiento leve, aumentando en el medio y luego descendiendo nuevamente hacia el final; como vimos anteriormente y simplificando, la formula es y = \dfrac{1}{1 + e^{\beta_1(x - \beta_2)}} donde \beta_1 controla lo llano de la curva y \beta_2 lleva la curva sobre el eje x.

#define el modelo
def sigmoid(x, Beta_1, Beta_2):
     y = 1 / (1 + np.exp(-Beta_1*(x-Beta_2)))
     return y

#ejecutamos un primer modelo
beta_1 = 0.10
beta_2 = 1990.0

#función logística
Y_pred = sigmoid(x_data, beta_1 , beta_2)

#predicción de puntos
plt.plot(x_data, Y_pred*15000000000000.)
plt.plot(x_data, y_data, 'ro')


Nuestra tarea aquí es encontrar los mejores parámetros para nuestro modelo. Normalicemos primero nuestro x e y:

xdata =x_data/max(x_data)
ydata =y_data/max(y_data)

Para buscar los mejores parámetros podemos utilizar curve_fit la cual utiliza cuadrados mínimos no lineales para cuadrar con la función sigmoide. popt son nuestros parámetros optimizados.

from scipy.optimize import curve_fit
popt, pcov = curve_fit(sigmoid, xdata, ydata)
#imprimir los parámetros finales
print(" beta_1 = %f, beta_2 = %f" % (popt[0], popt[1]))

beta_1 = 690.447530, beta_2 = 0.997207

Dibujamos el modelo

x = np.linspace(1960, 2015, 55)
x = x/max(x)
plt.figure(figsize=(8,5))
y = sigmoid(x, *popt)
plt.plot(xdata, ydata, 'ro', label='data')
plt.plot(x,y, linewidth=3.0, label='fit')
plt.legend(loc='best')
plt.ylabel('GDP')
plt.xlabel('Year')
plt.show()

Vemos la exactitud de nuestro modelo

# divide los datos en entrenamiento y prueba
msk = np.random.rand(len(df)) < 0.8
train_x = xdata[msk]
test_x = xdata[~msk]
train_y = ydata[msk]
test_y = ydata[~msk]

# construye el modelo utilizando el set de entrenamiento
popt, pcov = curve_fit(sigmoid, train_x, train_y)

# predecir utilizando el set de prueba
y_hat = sigmoid(test_x, *popt)

# evaluation
print("Promedio de error absoluto: %.2f" % np.mean(np.absolute(y_hat - test_y)))
print("Suma residual de cuadrados (MSE): %.2f" % np.mean((y_hat - test_y) ** 2))
from sklearn.metrics import r2_score
print("R2-score: %.2f" % r2_score(y_hat , test_y) )

Promedio de error absoluto: 0.04
Suma residual de cuadrados (MSE): 0.00
R2-score: 0.97

0 Seguir leyendo →

Regresión no lineal

Regresión no lineal.

El gráfico mostrado corresponde al producto bruto interno (PBI) por año para un país. ¿Se puede predecir el PIB en función del tiempo? ¿Podemos usar una regresión lineal simple para modelarlo?Regresion no lineal
Si los datos muestran una tendencia curvada, entonces la regresión lineal no producirá un resultado muy preciso, simplemente porque la regresión lineal presume que los datos son lineales. Se parece a una función logística o exponencial. Por lo tanto, se necesita un método especial de cálculo cuando la regresión es no lineal.

Si asumimos que el modelo para este conjunto de datos son funciones exponenciales, como por ejemplo, y = \theta_0 + \theta_1 {\theta_2}^{x}, nuestro trabajo consiste en estimar los parámetros del modelo, es decir, \theta, y utilizar el modelo ajustado para predecir valores de la variable dependiente para casos desconocidos o futuros. De hecho, existen muchas regresiones diferentes que se pueden utilizar para adaptarse a cualquier aspecto del conjunto de datos.

graficas no linealesEn estos gráficos se pueden ver líneas de regresión cuadrática y cúbica, y se puede continuar hasta el grados infinitos. En esencia, podemos llamar a todos estos casos «regresión polinómica», donde la relación entre la variable independiente x y la variable dependiente y se modelan como un polinomio grado n en x. Con muchos los tipos de regresión para elegir, hay una buena probabilidad de que uno se ajuste bien a su conjunto de datos. Es importante elegir una regresión que se adapte mejor a los datos.

Método de cálculo

La regresión polinómica se ajusta a una línea curvada de sus datos. Un ejemplo simple de polinomial, con el grado 3, se muestra como y = \theta_0 + \theta_1 x + {\theta_2 x}^{2} + {\theta_3 x}^{3} donde \theta son parámetros a estimar que hacen que el modelo se ajuste perfectamente a los datos. A pesar de que la relación entre x y y es no lineal, y la regresión polinómica puede ajustarse a ellas, un modelo de regresión polinomial puede ser expresado como regresión lineal realizando cambios en las variables: Dada la ecuación polinómica de tercer grado, si definimos que x_1 = x y x_2 = x^{2} y x_3 = x^{3}, el modelo se convierte en una regresión lineal simple con nuevas variables y = \theta_0 + \theta_1 x_1 + \theta_2 x_2 + \theta_3 x_3.

Esta regresión polinómica se considera un caso especial de regresión lineal múltiple tradicional. Por lo tanto, puede utilizar el mismo mecanismo que la regresión lineal para resolver el problema y utilizar el modelo de mínimos cuadrados. Los mínimos cuadrados es un método para estimar los parámetros desconocidos en una modelo de regresión lineal, minimizando la suma de los cuadrados de las diferencias entre la variable dependiente observada en el conjunto de datos y las predicciones de la función lineal.

Características

Para decir que una regresión es no lineal, debe cumplir que:

  1. Existe una relación no lineal entre la variable dependiente y el conjunto de variables independientes.
  2. Su modelo debe ser una función no lineal de los parámetros \theta, no necesariamente las características x.ecuaciones no lineales

Cuando se trata de la ecuación no lineal, puede ser de forma de exponencial, logarítmica, logística, o muchos otros tipos. En todas estas ecuaciones, el cambio de y depende de los cambios en los parámetros \theta, no necesariamente en x solamente. En contraste con la regresión lineal, no podemos utilizar el método de «mínimos cuadrados» ordinarios para ajustar los datos.

¿Cómo se puede saber si un problema es lineal o no lineal de una manera fácil? Podemos averiguar visualmente si la relación es lineal o no lineal trazando gráficos bivariados de las variables de salida con cada variable de entrada. Además, se puede calcular el coeficiente de correlación entre variables independientes y dependientes, y si para todas las variables es 0.7 o superior hay una tendencia lineal, y, por lo tanto, no es apropiado ajustar una regresión no lineal. También podemos usar una regresión no lineal cuando no podemos modelar con precisión la relación con los parámetros lineales.
¿Cómo debo modelar mis datos, si se muestran no lineales en un diagrama de dispersión? para hacer frente a esto se tiene que usar una regresión polinómica y un modelo de regresión
no lineal, «transformando» sus datos.(VER EJEMPLO EN PYTHON)

Ir al artículo anterior de la serie: Evaluación del modelo de regresión

Ir al artículo siguiente de la serie: Introducción a la clasificación

0 Seguir leyendo →

Evaluación del modelo de regresión

Evaluación del modelo de regresión

El objetivo al realizar un modelo de regresión es predecir con precisión un caso desconocido. Con este fin, tenemos que realizar una evaluación del modelo de regresión después de crear el modelo. Para realizarlo podemos usar el entrenamiento y la prueba en el mismo conjunto de datos. También podemos realizar una división del conjunto de datos para entrenamiento y otro para prueba.

La primera solución consiste en seleccionar una parte de nuestro conjunto de datos para la realización de pruebas. Usamos todo el conjunto de datos para el entrenamiento, y construimos un modelo usando este conjunto de entrenamiento. Luego seleccionamos una pequeña porción del conjunto de datos, que se utiliza como valores reales del conjunto de pruebas. Pasamos este conjunto por nuestro modelo construido, pronosticando valores. Por último, comparamos los valores pronosticados por nuestro modelo con los valores reales.

Modelo Train/Test Split

Una forma de mejorar la precisión fuera de la muestra consiste en utilizar otro enfoque de evaluación denominado «Train/Test Split» (División entre entrenamiento y prueba). En este enfoque, seleccionamos una parte de nuestro conjunto de datos para entrenamiento y el resto se utiliza para probar. El modelo se basa en el conjunto de formación y luego se pasa para la predicción. Finalmente, los valores pronosticados para el conjunto de pruebas se comparan con los valores reales del conjunto de datos. Este modelo implica la división del conjunto de datos en conjuntos de formación y pruebas, respectivamente, que son mutuamente excluyentes. Esto proporcionará una evaluación más precisa sobre la precisión de fuera de la muestra, ya que la prueba del conjunto de datos NO forma parte del conjunto de datos que se ha utilizado para formar los datos.

Este modelo depende de los conjunto de datos en los que los datos fueron formados y probados. Así que aún tiene algunos problemas debido a esta dependencia. Otro modelo de evaluación, denominado «k-fold cross-validation», soluciona la mayoría de estos problemas. Este modelo se basa en hacer k-veces el modelo «Train/Test Split» y luego promediando la precisión. Supongamos que hemos tomado la decisión de realizar 4 pruebas de tipo «Train/Test Split», para cada una de ellas tomaremos 1/4 de todo el conjunto de datos como datos para las pruebas, y el resto para la formación del modelo. Se evalua la precisión para cada uno de los modelos y finalmente se calcula el promedio de precisón.

Evaluación del modelo

Hay diferentes métricas de la evaluación del modelo de regresión, pero la mayoría de ellos se basan en la similitud de los valores pronosticados y reales. Una de las métricas más simples para calcular la precisión de nuestro modelo
de regresión es el error calculado como la diferencia promedio entre los valores predichos y los reales para todas las filas.

En un sentido general, cuando se prueba con un conjunto de datos en el que se conoce el valor objetivo para cada dato puntual, es capaz de obtener un porcentaje de predicciones exactas para el modelo. Este enfoque de evaluación probablemte tendría una alta «precisión de formación» y una baja «precisión fuera de la muestra», ya que el modelo conoce todos los datos de prueba.
La precisión de la formación es el porcentaje de predicciones correctas que hace el modelo cuando se utiliza el conjunto de datos de prueba. Sin embargo, una alta precisión en la formación no es necesariamente algo bueno, ya que puede dar como resultado un sobreajuste de los datos, un modelo que puede estar mostrando ruido y producir un modelo no generalizado.
La precisión fuera de la muestra es el porcentaje de las predicciones correctas que el modelo realiza sobre datos que NO ha sido formado el modelo. Si hacemos «formación y prueba» en el mismo conjunto de datos probablemente el modelo tendrá una precisión baja fuera de la muestra.

Es importante que nuestros modelos tengan una precisión alta, fuera de la muestra, ya que deben hacer predicciones correctas sobre datos desconocidos.

Metricas de evaluación

Antes de poder definir las diferentes métricas utilizadas para evaluar la regresión, tenemos que definir lo que realmente es un error: el error de un modelo de regresión es la diferencia entre los datos puntuales y la línea de tendencia generada por el algoritmo.
Un error puede ser determinado de multiples maneras:

Formulas de eveluación

  • Error medio absoluto (MAE) es la media del valor absoluto de los errores. Es la medida más fácil de entender, ya que es sólo el error promedio.
  • Error cuadrático medio (MSE) es la media de los errores al cuadrado. Es más popular que el error medio absoluto porque el enfoque se orienta más hacia grandes errores. Esto se debe a que el término al cuadrado aumenta exponencialmente los errores más grandes en comparación con los más pequeños.
  • Raiz cuadrada del error cuadrático medio (RMSE) es la raíz cuadrada de la anterior medida. Esta es una de las métricas más populares de las métricas de evaluación porque es interpretable en las mismas unidades que el vector de respuesta (o unidades y) haciendo fácil de correlacionar con la información.
  • Error absoluto relativo (RAE), también conocido como la suma residual de cuadrado, donde la barra de y es un valor medio de y, toma el error absoluto total y la normaliza dividiendo por el error absoluto total del predictor simple.
  • Error cuadrático relativo (RSE) es muy similar a «Error absoluto relativo», pero se usa para calcular R-cuadrado. R-cuadrado no es un error, si no, una métrica popular para la precisión de su modelo. Representa como de cerca están los valores de los datos de la línea de regresión ajustada. Cuanto más alto sea el R-cuadrado, mejor encaja el modelo a los datos.

 

Cada una de estas métricas se puede utilizar para cuantificar la predicción. La elección de la métrica depende del tipo de modelo, el tipo de datos y el dominio del conocimiento.

Ir al artículo anterior de la serie: Regresión lineal múltiple

Ir al artículo siguiente de la serie: Regresión no lineal

0 Seguir leyendo →