Как я могу сегментировать клиентов на уровне детализации, используя Python и ML? - PullRequest
0 голосов
/ 05 ноября 2019

Предупреждение для новичка

Я изучал ML на python в течение последних нескольких месяцев и добился некоторых замечательных результатов. В настоящее время, однако, я застрял в проекте и нуждаюсь в руководстве кого-то с большим опытом (Google может принять вас только так далеко, как кажется ?).

Чего я пытаюсь достичь

У меня есть фиктивный набор данных, полный клиентов и их транзакций. Я хочу объединить их в более мелкие «племена» на основе их демографических данных, оценки расходов и поведения в магазинах. Например, одно «племенное» описание может быть чем-то таким гранулированным: (мужчины в возрасте 35 лет, которые в основном покупают музыкальные продукты в субботу днем ​​в первой половине каждого месяца и имеют высокие баллы расходов) Я хочу найти сладкоеместо между гранулярной сегментацией и общей сегментацией, например: сегментация по доходам и баллам расходов.

Что я пробовал

Во-первых, я выделил значение типа int, представляющее частоту каждого категориального вхождения в транзакциях каждого клиента. Например:

Client | Home  | Movies | Games 
    1      3        1       0

Это указывает на то, что Клиент 1 покупал предметы, связанные с Домой, 3 раза, предметы, связанные с Кино, 1 раз, и они никогда не покупали предметы в категории Игры.

Я сделал то же самое для Дней (т. Е. Воскресенья - субботы), номера недели (т. Е. 1-5 номера недели в любом конкретном месяце), часа (т. Е. Hour_one - hour_twenty_four).

Этот подход позволяет мне создать чистый вектор чисто числовых данных.

Это пример моих необработанных входных данных в формате JSON (до обработки):

[
    {
        "id": 1,
        "customer_id": 1,
        "age": 47,
        "gender": "Female",
        "first_name": "Lea",
        "last_name": "Calafato",
        "email": "lcalafato0@cafepress.com",
        "phone_number": "612-170-5956",
        "income_k": 24,
        "location": "Nottingham",
        "sign_up_date": "2/16/2019",
        "transactions": [
            {
                "customer_id": "1",
                "product_id": 42,
                "product_cat": "Home",
                "price": 106.92,
                "time": "8:15 PM",
                "date": "04/15/2019",
                "day": "Monday",
                "week_num": 3
            },
            {
                "customer_id": "1",
                "product_id": 30,
                "product_cat": "Movies",
                "price": 26.63,
                "time": "10:12 AM",
                "date": "09/17/2019",
                "day": "Tuesday",
                "week_num": 4
            }
        ],
        "number_of_purchases": 2,
        "last_purchase": "09/17/2019",
        "total_spent": 133.55
    }
]

Это мой кадр данных после обработки и стандартизации:

age                  750 non-null int64
income_k             750 non-null int64
spending_score       750 non-null int64
gender__Female       750 non-null uint8
gender__Male         750 non-null uint8
Home                 750 non-null float64
Movies               750 non-null float64
Games                750 non-null float64
Grocery              750 non-null float64
Music                750 non-null float64
Health               750 non-null float64
Beauty               750 non-null float64
Sports               750 non-null float64
Toys                 750 non-null float64
Garden               750 non-null float64
Computers            750 non-null float64
Clothing             750 non-null float64
Books                750 non-null float64
Outdoors             750 non-null float64
Industrial           750 non-null float64
Kids                 750 non-null float64
Tools                750 non-null float64
Automotive           750 non-null float64
Electronics          750 non-null float64
Jewelery             750 non-null float64
Baby                 750 non-null float64
Shoes                750 non-null float64
week_one             750 non-null float64
week_two             750 non-null float64
week_three           750 non-null float64
week_four            750 non-null float64
week_five            750 non-null float64
Sunday               750 non-null float64
Monday               750 non-null float64
Tuesday              750 non-null float64
Wednesday            750 non-null float64
Thursday             750 non-null float64
Friday               750 non-null float64
Saturday             750 non-null float64
hour_one             750 non-null float64
hour_two             750 non-null float64
hour_three           750 non-null float64
hour_four            750 non-null float64
hour_five            750 non-null float64
hour_six             750 non-null float64
hour_seven           750 non-null float64
hour_eight           750 non-null float64
hour_nine            750 non-null float64
hour_ten             750 non-null float64
hour_eleven          750 non-null float64
hour_twelve          750 non-null float64
hour_thirteen        750 non-null float64
hour_fourteen        750 non-null float64
hour_fithteen        750 non-null float64
hour_sixteen         750 non-null float64
hour_seventeen       750 non-null float64
hour_eighteen        750 non-null float64
hour_nineteen        750 non-null float64
hour_twenty          750 non-null float64
hour_twenty_one      750 non-null float64
hour_twenty_two      750 non-null float64
hour_twenty_three    750 non-null float64
hour_twenty_four     750 non-null float64*

Я проверил эти данные с помощью алгоритмов k-средних и DBSCAN, но безрезультатно. k-means дает мне 4 кластера, которые являются слишком общими для моих требований, а DBSCAN дает мне нулевые кластеры, при этом каждая точка данных рассматривается как шум.

Приношу свои извинения, если что-то неясно, пожалуйста, не стесняйтесь просить меня уточнить что-нибудь. Заранее спасибо.

Ответы [ 2 ]

0 голосов
/ 06 ноября 2019

K-means даст вам 4 кластера, если вы используете k = 4. Если вы хотите больше затрат, увеличьте k ...

Аналогично, DBSCAN должен был установить правильное значение для достижения желаемого эффекта.

0 голосов
/ 05 ноября 2019

Это может произойти, если ваши данные не масштабируются. Смотрите общий пример здесь над набором данных Iris:

import pandas as pd
import numpy as np
import seaborn
from sklearn.preprocessing import MinMaxScaler
from  sklearn.cluster import KMeans

iris = seaborn.load_dataset('iris')
scaling = MinMaxScaler(feature_range=(-1, 1)).fit(iris.iloc[:,:-1])
iris_scale = pd.DataFrame(scaling.transform(iris.iloc[:,:-1]),columns=iris.iloc[:,:-1].columns)
km = KMeans(n_clusters=3, random_state=1)
km.fit(iris_scale)
y_kmeans = pd.DataFrame({'cluster': km.predict(iris_scale), 'real':iris['species'], 'stam':1})
y_kmeans.pivot_table(index=['real'],columns=['cluster'], aggfunc='count')

Вот результат, который вы должны получить:

cluster        0     1     2
real                        
setosa       NaN  50.0   NaN
versicolor  47.0   NaN   3.0
virginica   14.0   NaN  36.0

Это означает, что k-означает кластеризовать все виды 'setosa'как кластер 1, даже не зная, что это был тот же вид. Убедитесь, что ваши данные масштабированы (нормализованы).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...