Clasificador de productos en inventario

Introducción

Este proyecto busca desarrollar un sistema de clasificación para un conjunto de productos de una organización. Los datos comprenden un archivo csv, con 198.917 artículos con 13 atributos tal como se muestra en la figura 1.
Figura 1.
Algunos atributos se pueden entender con su nombre sin embargo explicare los siguientes como aclaración:
  • SKU_number: Identificador unico del producto.
  • Order: Orden de pedido
  • SoldFlag: Atributo booleano si se ha vendido durante los 6 meses anteriores (1 = Verdad, 0 = Falso).
  • MarketingType = Tipo de segmento al que va dirigido el producto (D o S).
  • New_Release_Flag = Productos que podrían tener un nuevo lanzamiento (si New_Release_Flag >= 1).
El atributo «StrengthFactor», no tiene un significado claro para la organización, por lo cual se omite para este estudio. Asimismo, se omiten los factores: Order, SoldCount, ReleaseYear y FileType.
Al limpiar estos atributos de los datos iniciales se obtiene una tabla como se muestra en la figura 2:

Figura 2.
El objetivo de este sistema es predecir para cada ítem cual será el valor del atributo SoldFlag, esto implica que si el valor es 1 (verdadero), el ítem continuará en el inventario mientras que un valor de 0 (falso) descartará el ítem.
Los datos que se buscan predecir son 122.921 . De igual manera, los datos empleados para el entrenamiento son 75.996 . Los datos empleados para la construcción y entrenamiento de los sistemas son 26.127, de los cuales 2.613 datos se usará para validar (nivel de precisión) los sistemas de clasificación. El total de datos que pertenecen a la clase D son 97.971 de los cuales 35.119 son datos históricos y 62.852 son los ítem a predecir. El total de datos que pertenecen a la clase S son 100.949 de los cuales 40.877 son datos históricos y 60.072 son ítem para predecir.
A continuación se desarrollarán dos sistemas clasificadores. El primero es una Red Neuronal Artificial. El segundo, consiste en una Regresión Logística.

Creación y evaluación del clasificador

Red Neuronal Artificial

Para cada tipo de Elemento clasificado como D o S (ver atributo «MarketingType»), se entrenará y evaluará la precisión de los clasificadores.

Inicialmente importamos las librerías que se necesitan para el desarrollo de un clasificador MLP (Red Neuronal Artificial).
# -*- coding: utf-8 -*-
'''
Python 3.5.2
'''
import pandas as pd
from sklearn.neural_network import MLPClassifier
En este segundo paso iniciamos el clasificador que consiste en una red neuronal con 6 neuronas en una capa oculta, las 6 neuronas. Los datos usados para el entrenamiento son 90% de los datos históricos de los cuales se conoce el valor del atributo «SoldFlag» y el 10% restante lo usaremos para evaluar la precisión del clasificador. Esto se hace para la clase D y la clase S de los ítem.
Los datos que corresponde al 90% de los datos como se muestra:
  • X_train_D: son los datos históricos de clase D. 
  • Y_Train_D: son el valor del atributo «SoldFlag» para los datos X_train_D.
# Construcción y entrenamiento del clasificador Red Neuronal Artificial
clf_D = MLPClassifier(activation="tanh",solver="lbfgs",hidden_layer_sizes=(6, 1))
clf_D.fit(X_train_D[:31608],Y_train_D[:31608])
prediction_D_train = clf_D.predict(X_train_D[31608:])
El nivel de precisión de este clasificador se computa a continuación:
# Cálculo de precisón
accuracy = 0
for i in range(0, len(prediction_D_train)):
    if Y_train_D["SoldFlag"].ix[31608+i] == prediction_D_train["Prediction D"].ix[i]:
        accuracy += 1
print("Precision del MLP: ", accuracy/len(prediction_D_train)*100," %")
# Nivel de precisión
Precision del MLP: 72.03076046710339 %.
Ahora que se conoce el nivel de precisión del clasificador, procedemos a realizar la evaluación de nuestros datos objetivos que se presentan a continuación:
  • X_test_D: son los ítem clase D sin valor del atributo «SoldFlag» y presenta un total de 62.852 ítem para clasificar.
# Predicción de los ítem no históricos
prediction_D_test = clf_D.predict(X_test_D)
Esta predicción nos arroja que los 62.852 ítem presentan un valor de 0 (Falso) en el atributo objetivo y un nivel de precisión del clasificador del 72%. Lo que implica que estos ítem se deberían omitir del inventario. La figura 3 muestra  el resultado final de la tabla par la clase D:
Figura 3.
Los pasos anteriores se desarrollan de nuevo para la clase S de productos con los siguiente datos:
  • X_train_S: son los datos históricos de clase S.
  • Y_train_S: son el valor del atributo «SoldFlag» para los datos X_train_S.
  • X_test_S: son los ítem clase S sin valor del atributo «SoldFlag» y presentan un total de 60.069 ítem.
De igual forma que para la clase S, se construye la red neuronal artificial con 6 neuronas y una capa oculta, así:
# Construcción y entrenamiento del clasificador Red Neuronal Artificial
clf_S = MLPClassifier(activation="tanh",solver="lbfgs",hidden_layer_sizes=(6, 1))
clf_S.fit(X_train_S[:36790],Y_train_S[:36790])
Y se obtiene un nivel de precisión del 90.70% en la clasificación de los datos. Se nota que 4 referencias del inventario para este tipo de clasificador se podrían seguir manteniendo. La figura 4 muestra las referencias evaluadas como 1 en el atributo «SoldFlag».
Figura 4.
En general, esta Red Neuronal Artificial muestra un nivel de precisión PROMEDIO del 81% y considera que del total de las clases solamente se deben mantener 4 referencias de clase S.

Regresión logística.

Al igual que en el clasificador anterior importaremos las siguientes librería:
# -*- coding: utf-8 -*-
'''
Python 3.5.2
'''
from sklearn.neural_network import MLPClassifier
Emplearemos los mismos datos tanto para entrenamiento como para la evaluación del nivel de precisión e igualmente segregaremos los ítem de clase D y de clase S.
# Variable para llamar al RL
logistic_R = LogisticRegression()
Para la clase D entrenamos nuestro clasificador asi:
# Entrenamiento del clasificador RL
logistic_D_train = logistic_R.fit(X_train_D[:31608],Y_train_D[:31608])

Con el cual se obtiene un nivel de precisión del 72.97%. Finalmente, al realizar la predicción de los datos «X_test_D» se muestra que existen 1.869 datos valorados como 1, tal como muestra la figura 5:
Figura 5.
Para la clase S se realiza el mismo proceso y se encuentra un nivel de precisión del 90.55% y existe una valoración de 168 ítem con valor 0 (verdadero). ver figura 6:

Figura 6.

Conclusiones

  • Para ambos clasificadores en los elementos de clase D se muestra un nivel de precisión en promedio del 72.5% .
  • Para ambos clasificadores en los elementos de clase S se muestra un nivel de precisión promedio de 90.5% .
  • Para la clase D se observa que la proporción de datos útiles (usados para el entrenamiento y validación ) representan el 17.6% del total de datos, mientras que  para la clase S este valor de datos útiles es de 20.5%. Lo cual explica que en ambos clasificadores haya una variación de aproximadamente 20 puntos porcentuales en el nivel de precisión entre la clase S y la clase D.
  • De igual forma, la relación de datos para entrenar y la cantidad de datos para predecir para las clases D y S es respectivamente 0.56 y 0.68, lo cual explica que, para este caso, una relación de este tipo que este más cerca de 1 muestra un mejor desempeño de los clasificadores.


Comentarios

Mi foto
Mauricio Muñoz
Hola, soy Mauricio, ingeniero industrial me gustan las matemáticas, la producción eficiente y la inteligencia computacional. Con pasión por la mejora de los procesos de producción, el idioma Japonés y el desarrollo de energía limpia.