Рассмотрим три метода машинного обучения: классификация, регрессия и кластеризация, реализованные в библиотеке машинного обучения в Python в модуле scikit-learn. Для иллюстрации методов будем использовать простой набор данных, представляющий месячные продажи 45 розничных магазинов одежды. Они разделены на три группы : маленькие магазины (small), т.н. магазины у дома, средние (middle), как бы районные универмаги и крупные (big) - магазины в крупных торговых центрах.
В таблице приведены месячные продажи по следующим категориям : куртки (jacket), джинсы (jeans), трикотаж (tricot) и аксессуары (accsess).
'shop_size':['small','small','small','small','small','small','small','small','small','small','small','small','
'access': [519,497,479,464,502,547,465,505,444,498,548,486,487,439,585,578,543,515,575,
511,708,642,696,558,653,571,638,493,662,528,505,599,601,614,563,638,588,715,
632,655,768,499,736,678,725],
'tricot':
389,325,321,313,234,284,282,331,246,294,277,208,309,222,291,296,337,272,308,
293,306,301,257,294,255,368],
'jeans':
152,473,451,495,405,466,452,475,334,465,396,355,423,407,476,365,609,516,596,
567,583,664,452,639,587,615],
'jacket':
df.info()
<class 'pandas.core.frame.DataFrame'> RangeIndex: 45 entries, 0 to 44 Data columns (total 5 columns): # Column Non-Null Count Dtype --- ------ -------------- ----- 0 shop_size 45 non-null object 1 access 45 non-null int64 2 tricot 45 non-null int64 3 jeans 45 non-null int64 4 jacket 45 non-null int64 dtypes: int64(4), object(1) memory usage: 1.9+ KB
Выведем пять случайно выбранных строк
df.sample(5)
shop_size | access | tricot | jeans | jacket | |
---|---|---|---|---|---|
26 | middle | 638 | 331 | 475 | 162 |
40 | big | 768 | 301 | 664 | 211 |
33 | middle | 614 | 291 | 476 | 143 |
36 | big | 588 | 272 | 516 | 192 |
9 | small | 498 | 312 | 157 | 12 |
Выведем состав данных по типам магазинов
access | tricot | jeans | jacket | |
---|---|---|---|---|
shop_size | ||||
big | 10 | 10 | 10 | 10 |
middle | 15 | 15 | 15 | 15 |
small | 20 | 20 | 20 | 20 |
Выведем описательную статистику
access | tricot | jeans | jacket | |
---|---|---|---|---|
count | 45.000000 | 45.000000 | 45.000000 | 45.00000 |
mean | 574.488889 | 317.488889 | 338.200000 | 105.00000 |
std | 86.287738 | 49.779341 | 185.986632 | 76.14251 |
min | 439.000000 | 208.000000 | 113.000000 | 12.00000 |
25% | 502.000000 | 293.000000 | 151.000000 | 28.00000 |
50% | 563.000000 | 309.000000 | 365.000000 | 104.00000 |
75% | 638.000000 | 349.000000 | 475.000000 | 155.00000 |
max | 768.000000 | 441.000000 | 664.000000 | 258.00000 |
Следующим шагом является визуализация отношений между различными показателями в наших данных.
Классификация
KNN (5 neighbors) prediction accuracy = 94.4%
Регрессия
Второе приложение машинного обучения, которое мы продемонстрируем —
это регрессия.
Чтобы продемонстрировать регрессию, будем использовать решающие деревья.
Применим так сказать в учебных целях довольно неожиданное решение.
Для начала выделим из наших данных независимые переменные, пусть это будет
количество продаваемых аксессуаров, джинсов и трикотажа. А зависимой переменной
сделаем количество продаваемых курток. Разделим их на обучающую и
тестовую части.
Независимые переменные
ind_data = data[['access','tricot','jeans']]
Зависимая переменная
dep_data = data['jacket'] Доля для тестовой выборки
frac = 0.4
Разделяем данные
d_train, d_test, r_train, r_test \
= train_test_split(ind_data, dep_data, test_size=frac, random_state=23)
Импортируем метод решающих деревьев
from sklearn.tree import DecisionTreeRegressor
Строим дерево-регрессор
dtr = DecisionTreeRegressor()
Обучаем на обучающей части
dtr.fit(d_train, r_train)
Точность на тестовых данных
score = 100.0 * dtr.score(d_test, r_test)
print(f'DT regression accuracy = {score:5.1f}%')
DT regression accuracy = 90.9%
Кластеризация
Цель кластеризации - выявить в наборе данных такие группы, для которых наблюдения пределах одной
группы сходны между собой, но отличаются от наблюдений в других группах.
В случае кластеризации методом k-средних мы указываем требуемое количество
кластеров, k, и алгоритм будет приписывать каждое наблюдение только к одному
из этих k кластеров. Алгоритм оптимизирует группы путем минимизации
внутрикластерной вариации (также известной как инерция), чтобы сумма
внутрикластерных вариаций по всем k кластерам была наименьшей.
Мы будем использовать kmeans от Scikit-Learn
Мы создаем экземпляр класса KMeans и задаем количество выделяемых кластеров.
Затем мы вызываем метод fit и передаем ему в качестве аргумента данные:
from sklearn.cluster import KMeans
Строим модель делением на три кластера
k_means = KMeans(n_clusters=3, random_state=23)
k_means.fit(data)
Во время работы алгоритма каждой точке обучающих данных присваивается метка
кластера. Можно найти эти метки в атрибуте
print(k_means.cluster_centers_)
[[5.006 3.428 1.462 0.246 ]
[6.85 3.07368421 5.74210526 2.07105263]
[5.9016129 2.7483871 4.39354839 1.43387097]]
Выведем диаграмму с кластерами
from matplotlib import cm
x = data['jeans']
y = data['jacket']
xcc = k_means.cluster_centers_[:,2]
ycc = k_means.cluster_centers_[:,3]
fig, ax = plt.subplots(figsize=(8, 8))
for idx in np.unique(labels):
i = int(idx)
ax.scatter(x[labels == i], y[labels == i], label=f'{label_names[i]}',
s=100, alpha = .5, cmap=cm.coolwarm)
Выводим центры кластеров
ax.scatter(xcc, ycc, marker='*', label='Cluster Centers',
s=500, alpha=0.75, cmap=cm.coolwarm)
ax.set_xlabel('jeans', fontsize=16)
ax.set_ylabel('jacket', fontsize=16)
ax.legend(loc = 7, labelspacing=2)
ax.set_title("Shops Cluster Demonstration", fontsize=18)
sns.despine(offset=0, trim=True)
На этом примере закончим поверхностное знакомство с методами машинного обучения и возможностями их применения для прикладных задач в области розничной торговли,
в данном случае для анализа небольшой розничной сети магазинов одежды.
В следующих материалах каждый из этих методов будет рассмотрен подробнее.
Комментариев нет:
Отправить комментарий