Ventas de Comestibles Kaggle
Ventas de Comestibles Kaggle
Ventas de Comestibles Kaggle
23 de enero de 2018
Esta obra está sujeta a una licencia de Reconocimiento-NoCommercial-
SinObraDerivada 3.0 España de Creative Commons
i
Abstract (in English, 250 words or less):
The goal of this final grade project is to earn a relevant score in the Kaggle’s
competition: Corporación Favorita Grocery Sales Forecasting through building
a state of the art predictive model aimed to forecast future sales.
Corporación Favorita has challenged the Kaggle community to build a model
that more accurately forecasts product sales. They currently rely on subjective
forecasting methods with very little data to back them up and very little
automation to execute plans. They’re excited to see how machine learning
could better ensure they please customers by having just enough of the right
products at the right time.
As it will be detailed below, in section “Description of the Input Data”, training
and testing data files are supplied in order to develop predictive supervised
algorithms as well as other data file to be able to put the aforementioned data in
context. The files provided are: train.csv, test.csv, simple_submission,
stores.csv, items.csv, transactions.csv, oil.csv and holidays_events.csv.
The work will be structured in 2 main parts:
a) Exploratory Data Analysis, which will include detailed study of sales
information: in general, by type of store, geolocation, sales by state, by city,
sales in time, sales correlation - price of oil, analysis of products and their
families, transactions, etc.
b) Predictive study for which I will use the state of the art algorithms in order to
obtain a relevant classification in the score table and to receive positive
comments as well.
ii
Índice
1 Introducción.................................................................................................... 6
1.1 Contexto y justificación del trabajo........................................................... 6
1.2 Objetivos del trabajo ................................................................................ 6
1.3 Enfoque y método seguido ...................................................................... 7
1.4 Planificación del trabajo ........................................................................... 7
1.5 Descripción de los demás capítulos de la memoria ................................. 9
2 Estado del Arte............................................................................................. 10
3 Competición Corporación Favorita............................................................... 11
3.1 Reglas más relevantes........................................................................... 11
3.2 Resultados obtenidos en la competición................................................ 11
3.3 Descripción de los Datos de Entrada ..................................................... 12
3.4 Descripción de los Datos de Salida ....................................................... 14
3.5 Evaluación.............................................................................................. 14
4 Análisis Exploratorio de Datos ..................................................................... 16
4.1 Estructura de los archivos de datos de entrada ..................................... 16
4.2 Archivo train.csv ..................................................................................... 16
4.3 Archivo transactions.csv ........................................................................ 17
4.4 Archivo holiday_events.csv .................................................................... 17
4.5 Archivo oil.csv ........................................................................................ 18
4.6 Archivo items.csv ................................................................................... 18
4.7 Archivo stores.csv .................................................................................. 19
4.8 Archivo holiday_events.csv .................................................................... 22
4.9 Archivo transactions.csv ........................................................................ 22
4.10 Archivo test.csv .................................................................................... 23
5 Estudio Predictivo ........................................................................................ 25
5.1 Algoritmo Light Gradient Boosting Machine ........................................... 25
5.2 Ajuste de parámetros LGBM .................................................................. 26
5.3 Descripción del programa ...................................................................... 27
6 Conclusiones................................................................................................ 36
7 Glosario ........................................................................................................ 38
8 Bibliografía ................................................................................................... 39
9 Anexos ......................................................................................................... 40
3
TFM Corporación Favorita Gabriel Kreplak
Lista de Figuras
Figura 1: Score Privado ..................................................................................... 12
Figura 2: Score Público ..................................................................................... 12
Figura 3: Estructura de los Datos de Entrada.................................................... 16
Figura 4: Precios de petróleo............................................................................. 18
Figura 5: Número de productos por cada categoría .......................................... 19
Figura 6 : Treemap de tiendas/ciudad ............................................................... 20
Figura 7: Segmentación de las tiendas ............................................................. 21
Figura 8: Clasificación de tiendas ...................................................................... 21
Figura 9: Distribución de transacciones por día ................................................ 23
Figura 10: Crecimiento del árbol por niveles. .................................................... 25
Figura 11: Crecimiento LGBM por hojas ........................................................... 25
Figura 12: Evolución de la métrica l2................................................................. 33
Lista de Tablas
Tabla 1. Planificación........................................................................................... 8
Tabla 2: train.csv, 125 millones de líneas x 6 columnas ................................... 17
Tabla 3: transactions.csv, 83.500 líneas x 3 columnas ..................................... 17
Tabla 4: holiday_events.csv, 350 líneas x 6 columnas...................................... 17
Tabla 5: oil.csv, 1.218 x 2 col ............................................................................ 18
Tabla 6: items.csv, 4.100 productos x 4 attr ...................................................... 18
Tabla 7: stores.csv, 54 tiendas x 5 atributos ..................................................... 20
Tabla 8: holiday_events.csv, 350 líneas x 6 columnas...................................... 22
Tabla 9: transactions.csv, 83.500 líneas x 3 columnas .................................... 22
Tabla 10: test.csv 3.370.464 líneas x 5 columnas ............................................. 24
Tabla 11: Estructura de X_train ......................................................................... 28
Tabla 12: Atributos dataset entrenamiento ........................................................ 30
Tabla 13: Estructura dataframe Y_train ............................................................. 30
Tabla 14: Estructura de Predictores de Validación............................................ 31
Tabla 15: Estructura de Etiquetas de Validación ............................................... 31
Tabla 16: Estructura de predictores de test ....................................................... 31
Tabla 17: Resumen de Ajustes.......................................................................... 34
Tabla 18: Importancia de los Atributos .............................................................. 34
4
TFM Corporación Favorita Gabriel Kreplak
Lista de Ecuaciones
Ecuación 1: NWRMSLE..................................................................................... 14
5
TFM Corporación Favorita Gabriel Kreplak
1 Introducción
1.1 Contexto y justificación del trabajo
6
TFM Corporación Favorita Gabriel Kreplak
7
TFM Corporación Favorita Gabriel Kreplak
Tabla 1. Planificación
8
TFM Corporación Favorita Gabriel Kreplak
A continuación se realiza una descripción muy somera del contenido del resto
de los capítulos de esta memoria:
• Estado del Arte: esbozo de las tecnologías actuales y referencias a
estudios realizados relacionados con el desarrollo de este trabajo final
de máster.
• Competición Corporación Favorita: exposición de las reglas de la
competición, características de los datos de entrada, evaluación y
demás detalles de las condiciones iniciales del trabajo.
• Análisis Exploratorio de Datos: Detalle y características de los distintos
archivos de datos de la competición.
• Estudio Predictivo: Despliegue del proceso de carga de datos,
depuración, ingeniería de atributos, técnica predictiva LGBM y
generación de los datos de salida.
• Conclusiones: Lecciones aprendidas, reflexión sobre la consecución de
los objetivos planteados inicialmente, análisis crítico del seguimiento de
la planificación y líneas de trabajo futuras.
• Glosario.
• Bibliografía.
9
TFM Corporación Favorita Gabriel Kreplak
10
TFM Corporación Favorita Gabriel Kreplak
• URL: https://www.kaggle.com/c/favorita-grocery-sales-forecasting/rules
• Fecha de Inicio: 19 de octubre de 2017
• Fecha final de entrega: 15 de enero de 2017
• Título de la Competición: Corporación Favorita Grocery Sales
Forecasting
• Patrocinador: Corporación Favorita C.A.
• Primer premio: $15.000
• Segundo premio: $10.000
• Tercer premio: $5.000
• Datos Externos: Permitidos si no pertenecen a Corporación Favorita ni
otra entidad en la misma línea de negocio. La fuente de datos externos
se ha de validar previamente con los organizadores de la competencia.
• Reglas generales: https://www.kaggle.com/c/favorita-grocery-sales-
forecasting/rules
11
TFM Corporación Favorita Gabriel Kreplak
En esta competición, hay que predecir las ventas de unidades por miles de
artículos vendidos en diferentes tiendas Favorita ubicadas en Ecuador. Los
datos de capacitación incluyen fechas, información de la tienda y del artículo,
ya sea que se promocione ese artículo, así como las ventas de la unidad. Los
archivos adicionales incluyen información complementaria que puede ser útil
para construir sus modelos.
Atendiendo a que se obtienen unos resultados bastante optimizados y debido a
restricciones materiales y de tiempo, este trabajo solo utilizará el archivo
train.csv para el aprendizaje automático del algoritmo de predicción,
descartándose el uso del resto de información complementaria que, no
obstante, se describe en el capítulo 4 Análisis Exploratorio de Datos.
Descripciones de archivos e información:
train.csv
• Datos de training, que incluyen unit_sales by date, store_nbr, y item_nbr
y un identificador id.
• El objetivo unit_sales que puede ser un entero (e.g., bolsa de patatas) o
número real (e.g., 1.5 kg de queso).
• Números negativos de unit_sales representan las devoluciones de un
producto.
12
TFM Corporación Favorita Gabriel Kreplak
13
TFM Corporación Favorita Gabriel Kreplak
3.5 Evaluación
Ecuación 1: NWRMSLE
donde para la fila i, ŷ es la venta de unidad predicha de un artículo e y es la i
de datos). Los artículos perecederos tienen un peso de 1.25 donde todos los
demás artículos tienen un peso de 1.00.
Esta métrica es adecuada para predecir valores en un amplio rango de órdenes
de magnitud. Evita penalizar las grandes diferencias en la predicción cuando
tanto el número predicho como el verdadero son grandes: predecir 5 cuando el
14
TFM Corporación Favorita Gabriel Kreplak
15
TFM Corporación Favorita Gabriel Kreplak
16
TFM Corporación Favorita Gabriel Kreplak
17
TFM Corporación Favorita Gabriel Kreplak
18
TFM Corporación Favorita Gabriel Kreplak
19
TFM Corporación Favorita Gabriel Kreplak
20
TFM Corporación Favorita Gabriel Kreplak
21
TFM Corporación Favorita Gabriel Kreplak
Este archivo contiene una línea por cada día festivo en Ecuador, que puede ser
nacional, estatal o local. Las ventas son muy sensibles a los días festivos,
produciéndose variaciones significativas.
22
TFM Corporación Favorita Gabriel Kreplak
23
TFM Corporación Favorita Gabriel Kreplak
24
TFM Corporación Favorita Gabriel Kreplak
5 Estudio Predictivo
5.1 Algoritmo Light Gradient Boosting Machine
25
TFM Corporación Favorita Gabriel Kreplak
LGBM escogerá para crecer la hoja con mayor delta loss, reduciendo el mismo
respecto a un modelo de árbol de crecimiento por niveles.
LGBM no es adecuado cuando el dataset es pequeño porque el crecimiento
por hojas conduce al sobre-entrenamiento. En ese caso conviene limitar la
profundidad del árbol mediante el parámetro max_depth.
Una ventaja importante del LGBM es la mayor rapidez de convergencia
respecto a árboles de crecimiento por nivel.
• Probar dart
• Reducir max_bin
• Reducir num_leaves
26
TFM Corporación Favorita Gabriel Kreplak
1. Lectura
2. Preparación Dataset
27
TFM Corporación Favorita Gabriel Kreplak
Fechas de
referencia
Este nuevo dataset consta, para cada una de las fechas de referencia y
cada uno de los 167.515 items/tienda de 40 columnas según se detalla a
continuación:
day_1_2017 unit_sales 0
28
TFM Corporación Favorita Gabriel Kreplak
29
TFM Corporación Favorita Gabriel Kreplak
Fechas de
referencia
30
TFM Corporación Favorita Gabriel Kreplak
d. Predictores de Test
31
TFM Corporación Favorita Gabriel Kreplak
a) Parámetros Básicos:
c) Parámetros de Métrica:
d) Parámetros de Entrada/Salida:
32
TFM Corporación Favorita Gabriel Kreplak
0.025 31/5/17
0.516
0.03 20/7/17
33
TFM Corporación Favorita Gabriel Kreplak
Una vez creado el modelo bst basado en los predictores X_train, se utiliza
generando 2 predicciones:
34
TFM Corporación Favorita Gabriel Kreplak
35
TFM Corporación Favorita Gabriel Kreplak
6 Conclusiones
Las conclusiones de este trabajo en general creo que son positivas y las
resumiré desde tres perspectivas diferentes.
Un primer punto de vista son las lecciones aprendidas del ajuste de un modelo
predictivo en la plataforma Kaggle:
Lección 1: Para obtener una calificación profesional es indispensable acometer
el problema con conocimientos del negocio.
Lección 2: Para el desarrollo de un modelo predictivo como el que se aplica en
este trabajo es fundamental contar con tiempo suficiente para:
36
TFM Corporación Favorita Gabriel Kreplak
Quiero finalmente agradecer a la tutora de este TFM, Dra. Laia Subirats Maté
su asesoramiento y sus ánimos, ayudándome a hacer posible este trabajo.
37
TFM Corporación Favorita Gabriel Kreplak
7 Glosario
CSV: comma separated values
DART: Dropouts meet multiple additive regression trees
EFB: Exclusive feature bundling
GBDT: Gradient boosting decision tree
GOSS: Gradient-based one-side sampling
GPU: Graphics processor unit
LGBM: Light gradient boosting machine
NWRMSLE: Normalized weighted root mean squared logarithmic error
pGBRT: Parallel boosted regression tree
XBOOST: Extreme gradient boosting
38
TFM Corporación Favorita Gabriel Kreplak
8 Bibliografía
Baquerizo Ramon, R. Y. (2017). Análisis del comportamiento del cliente y de la
demanda de productos en los principales supermercados de la ciudad de
Machala. (M. E. Universidad Técnica de Machala, Ed.)
Eduardo Fonseca, R. G. (2017). Acoustic Scene Classification by Fusing
LightGBM and VGG-net Multichannel Predictions. IEEE AASP Challenge on
Detection and Classification of Acoustic Scenes and Events .
Friedman, J. H. (2002). Stochastic gradient boosting. Journal Computational
Statistics & Data Analysis - Nonlinear methods and data mining , 34 (4), 367-
378.
Guolin Ke, Q. M.-Y. (2017). LightGBM: A Highly Efficient Gradient Boosting
Decision Tree. 31st Conference on Neural Information Processing Systems
(NIPS 2017), Long Beach, CA, USA.
Kaggle. (19 de Octubre de 2017). Corporación Favorita Grocery Sales
Forecasting. Obtenido de https://www.kaggle.com/c/favorita-grocery-sales-
forecasting
Lanfa Liu, M. J. (12 de Diciembre de 2017). Combining Partial Least Squares
and the Gradient-Boosting Method for Soil Property Retrieval Using Visible
Near-Infrared Shortwave Infrared Spectra. Remote Sensing .
Lee, C. (2017). LGBM Starter | Kaggle. Obtenido de Kaggle:
https://www.kaggle.com/ceshine/lgbm-starter
Microsoft. (Enero de 2018). Microsoft/LightGBM. Obtenido de GitHub:
https://github.com/Microsoft/LightGBM/blob/master/docs/Features.rst
Natalia Ponomareva, T. C. (31 de Octubre de 2017). Compact Multi-Class
Boosted Trees. Obtenido de https://arxiv.org/abs/1710.11547v1
Santamaria, E. J. (2014). Influencia de los Factores Culturales y Demográficos
en el Perfil del Consumidor de Marcas Propias en Ecuador. Revista Politécnica
, 34 (2).
Serrano, D. (2016 de Julio de 2016). Desarrollo Organizacional (modelos de
D.O.). Obtenido de Prezi: https://prezi.com/z8fw2x6zjauu/desarrollo-
organizacional-modelos-de-do/
Si Si Huan Zhang, S. S.-J. (s.f.). Output, Gradient Boosted Decision Trees for
High Dimensional Sparse.
39
TFM Corporación Favorita Gabriel Kreplak
9 Anexos
Se incluye a continuación el código de carga y preparación de datos.
a) lgbm_arrange.py
"""
This is an upgraded version of Ceshine's LGBM starter script.
"""
from datetime import date, timedelta
import time
import pandas as pd
import numpy as np
from sklearn.metrics import mean_squared_error
import lightgbm as lgb
camino = './input/' #google drive
camino = '/Users/gabrielkreplak/Documents/Gabi/UOC/Materiales/E4 Big Data y
Sistemas NoSQL/B2.342 Trabajo Final de Máster MIB-AD/Favorita/input/'
start_time = time.time()
df_train = pd.read_csv(
camino + 'train.csv', usecols=[1, 2, 3, 4, 5],
dtype={'onpromotion': bool},
converters={'unit_sales': lambda u: np.log1p(float(u)) if float(u) > 0
else 0},
parse_dates=["date"],
skiprows=range(1, 66458909) # 2016-01-01
)
items = pd.read_csv(
camino + "items.csv",
).set_index("item_nbr")
df_2017 = df_train.loc[df_train.date>=pd.datetime(2017,1,1)]
df_2016 = df_train.loc[df_train.date < pd.datetime(2017,1,1)] # GK
del df_train
df_test = pd.read_csv(
camino + "test.csv", usecols=[0, 1, 2, 3, 4],
dtype={'onpromotion': bool},
parse_dates=["date"] # , date_parser=parser
)
df_test = df_test.set_index(['store_nbr', 'item_nbr', 'date'])
promo_2017_train = df_2017.set_index(["store_nbr", "item_nbr",
"date"])[["onpromotion"]].unstack(level=-1).fillna(False)
promo_2017_train.columns = promo_2017_train.columns.get_level_values(1)
promo_2017_test = df_test[["onpromotion"]].unstack(level=-1).fillna(False)
promo_2017_test.columns = promo_2017_test.columns.get_level_values(1)
promo_2017_test =
promo_2017_test.reindex(promo_2017_train.index).fillna(False)
40
TFM Corporación Favorita Gabriel Kreplak
41
TFM Corporación Favorita Gabriel Kreplak
42
TFM Corporación Favorita Gabriel Kreplak
b) lgbm_predict.py
Se reproduce a continuación el código de aprendizaje del algoritmo LGBM, la
producción de las predicciones y la generación del archivo de salida.
"""
This is an upgraded version of Ceshine's LGBM starter script, simply adding
more
average features and weekly average features on it.
"""
from datetime import date, timedelta
import time
import pandas as pd
import numpy as np
from sklearn.metrics import mean_squared_error
import lightgbm as lgb
camino = './input/' #google drive
camino = '/Users/gabrielkreplak/Documents/Gabi/UOC/Materiales/E4 Big Data y
Sistemas NoSQL/B2.342 Trabajo Final de Máster MIB-AD/Favorita/input/'
start_time = time.time()
X_train = pd.read_csv(camino + 'temp/X_train.csv')
y_train = np.array(pd.read_csv(camino + 'temp/y_train.csv'))
X_val = pd.read_csv(camino + 'temp/X_val.csv')
y_val = np.array(pd.read_csv(camino + 'temp/y_val.csv'))
X_test = pd.read_csv(camino + 'temp/X_test.csv')
stores_items = pd.read_csv(camino + 'temp/stores_items.csv',
index_col=['store_nbr', 'item_nbr'])
test_ids = pd.read_csv(camino + "test.csv", usecols=[0, 1, 2, 3, 4],
dtype={'onpromotion': bool}, parse_dates=["date"] # , date_parser=parser
).set_index(['store_nbr', 'item_nbr', 'date'])
items = pd.read_csv( camino + 'items.csv' ).set_index("item_nbr")
items = items.reindex( stores_items.index.get_level_values(1) )
print("Training and predicting models...")
params = {
'num_leaves': 63,#
'objective': 'regression',#
'min_data_in_leaf': 300,#
# 'learning_rate': 0.1, #score 0.529, 'min_data_in_leaf': 300
# 'learning_rate': 0.06, #score 0.515, 'min_data_in_leaf': 300
# 'learning_rate': 0.05, #score 0.515, 'min_data_in_leaf': 300
# 'learning_rate': 0.025, #score 0.516, 'min_data_in_leaf': 300
# 'learning_rate': 0.01, #score 0.517, 'min_data_in_leaf': 300
'learning_rate': 0.03 ,#
'feature_fraction': 0.8,#
'bagging_fraction': 0.8,#
'bagging_freq': 2,
'metric': 'l2',#
43
TFM Corporación Favorita Gabriel Kreplak
'num_threads': 4,
'max_bin': 500,#
}
evals_result = {} # to record eval results for plotting
MAX_ROUNDS = 100
val_pred = []
test_pred = []
cate_vars = []#
for i in range(16):
print("=" * 50)
print("Step %d" % (i+1))
print("=" * 50)
dtrain = lgb.Dataset(
X_train, label=y_train[:, i],
categorical_feature=cate_vars,
weight=pd.concat([items["perishable"]] * 6) * 0.25 + 1)
dval = lgb.Dataset(
X_val, label=y_val[:, i], reference=dtrain,
weight=items["perishable"] * 0.25 + 1,
categorical_feature=cate_vars)
bst = lgb.train(
params, dtrain, num_boost_round=MAX_ROUNDS,
valid_sets=[dtrain, dval], early_stopping_rounds=50,
verbose_eval=100, evals_result=evals_result)
print("\n".join(("%s: %.2f" % x) for x in sorted(
zip(X_train.columns, bst.feature_importance("gain")),
key=lambda x: x[1], reverse=True)))
val_pred. append(bst.predict(X_val, num_iteration=bst.best_iteration or
MAX_ROUNDS))
test_pred.append(bst.predict(X_test, num_iteration=bst.best_iteration or
MAX_ROUNDS))
t = (time.time ( ) - start_time) / 60
print ( "Time %s min" % t )
ax = lgb.plot_metric ( evals_result , metric='l2', title='Metrics During
Training Step %d' % (i+1) )
ax = lgb.plot_importance ( bst , max_num_features=20, title='Feature
Importance Step %d' % (i+1) )
n_public = 5 # Number of days in public test set
weights = pd.concat ( [ items[ "perishable" ] ] ) * 0.25 + 1
print ( "Unweighted validation mse: " , mean_squared_error (y_val
, np.array ( val_pred ).transpose ( ) ) )
print ( "Full validation mse: " , mean_squared_error (y_val
, np.array ( val_pred ).transpose ( ) , sample_weight=weights ) )
print ( "'Public' validation mse: " , mean_squared_error (y_val[ : ,
:n_public ] , np.array ( val_pred ).transpose ( )[ : , :n_public ] ,
sample_weight=weights ) )
print ( "'Private' validation mse: " , mean_squared_error (y_val[ : ,
n_public: ] , np.array ( val_pred ).transpose ( )[ : , n_public: ] ,
sample_weight=weights ) )
44
TFM Corporación Favorita Gabriel Kreplak
print("Making submission...")
y_test = np.array(test_pred).transpose()
df_preds = pd.DataFrame( y_test, index=stores_items.index,
columns=pd.date_range("2017-08-16",
periods=16)).stack().to_frame("unit_sales")
df_preds.index.set_names(["store_nbr", "item_nbr", "date"], inplace=True)
submission = test_ids[['id']].join(df_preds, how="left").fillna(0)
submission["unit_sales"] = np.clip(np.expm1(submission["unit_sales"]), 0,
1000)
submission.to_csv(camino + 'out/lgb_ceshine.csv', float_format='%.4f',
index=None)
t = (time.time() - start_time)/60
print ("Total processing time %s min" % t)
45