Kaggle Inclass и отдельная ссылка для участия. Недавно на чеках появились QR коды. Пока еще не все с этим знакомы, но по информации из этого кода можно получить полное содержание чека. Это дает возможность вести расходы, учитывая каждый отдельный товар, включая расходы, сделанные наличными. Как следствие наличия полной информации, можно анализировать изменения характера расходов и инфляцию по собственной продуктовой корзине. Названия товаров не стандартизованы: у одного товара в разных магазинах существенно отличаются названия; отдельные слова могут сокращаться; названия могут содержать опечатки. В магазины постоянно добавляются новые товары. Это делает простое составление каталога всех товаров с категориями нереалистичным.
Данные публикуются впервые, а обученные на них модели используются в production. Задача, которую предлагается решить — это разбиение всех покупок чека по небольшому набору понятных человеку категорий.
import os
import pandas as pd
import numpy as np
PATH_TO_DATA = 'data'
RANDOM_STATE = 17
!ls $PATH_TO_DATA
train = pd.read_csv(os.path.join(PATH_TO_DATA, 'train.csv.gz'))
train_checks = pd.read_csv(os.path.join(PATH_TO_DATA, 'train_checks.csv.gz'))
print(train.shape, train_checks.shape)
print(train.columns.values)
print(train_checks.columns.values)
train.fillna('', inplace=True)
from sklearn.feature_extraction.text import CountVectorizer
vectorizer = CountVectorizer()
X = vectorizer.fit_transform(train.name)
for i, word in enumerate(vectorizer.vocabulary_):
print(word)
if i > 10:
break
X.shape
from sklearn.preprocessing import LabelEncoder
labeler = LabelEncoder()
y = labeler.fit_transform(train.category)
from sklearn.linear_model import LogisticRegression
from sklearn.model_selection import cross_val_score
from sklearn.model_selection import GroupShuffleSplit
gkf = list(GroupShuffleSplit(n_splits=5, random_state=RANDOM_STATE).split(X, y, train.check_id.values))
score = cross_val_score(LogisticRegression(random_state=RANDOM_STATE), X, y, scoring='neg_log_loss',
cv=gkf, n_jobs=-1)
"%.3f +- %.4f" % (-np.mean(score), np.std(score))
model = LogisticRegression(random_state=RANDOM_STATE)
model.fit(X, y)
test = pd.read_csv(os.path.join(PATH_TO_DATA, 'test.csv.gz'))
test_checks = pd.read_csv(os.path.join(PATH_TO_DATA, 'test_checks.csv.gz'))
X_test = vectorizer.transform(test.name)
p_test = model.predict_proba(X_test)
test = test[['id']]
for i, c in enumerate(labeler.classes_):
test[c] = list(map(lambda x: '%.3f' % x, p_test[:, i]))
test.to_csv('base_solution.csv.gz', compression='gzip', index = False, encoding='utf-8')
У такой посылки результат – 0.65081 в публичном рейтинге соревнования, бенчмарк "Стартер".