Модель машинного обучения для моделей клиентов / заказов электронной коммерции - PullRequest
0 голосов
/ 04 марта 2020

У меня есть следующий набор данных:

| customer | item | number_of_orders |
|    1     |  1   |         1        |
|    1     |  2   |         0        |
|    1     |  3   |         0        |
|    1     |  4   |         1        |
|    2     |  1   |         0        |
|    2     |  2   |         0        |
|    2     |  3   |         0        |
|    2     |  4   |         1        |
...

Я пытаюсь заключить, если пользователь X закажет элемент Y в качестве первого шага.

Это код, который у меня есть пока что

from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score

from sklearn.neighbors import KNeighborsClassifier

model = KNeighborsClassifier(n_neighbors=3)

X_train, X_test, Y_train, Y_test = train_test_split(X, Y, test_size=0.2, random_state=7)

model.fit(X_train, Y_train)
predictions = model.predict(X_test)
result = accuracy_score(Y_test, predictions)
result

Это дает очень высокую точность, но я подозреваю, что это связано с большим количеством нулей в наборе данных для number_of_orders.

Может кто-то предложить как улучшить эту модель ML?

У меня также есть информация о цене и количестве товара, а также средняя цена за товар, которую я тоже решил использовать.

Моя конечная цель - создать систему рекомендаций на основе этих данных для возврата список рекомендаций, основанных на других заказах.

Ответы [ 2 ]

1 голос
/ 04 марта 2020

Там может быть много нулей! Используйте небольшой фрагмент кода ниже, чтобы найти процент нулей в вашем наборе данных.

df_missing = df.isna()
df_num_missing = df_missing.sum()
print(df_num_missing / len(df))
print(df.isna().mean().round(4) * 100)

Я не знаю, каким будет ваш порог, но я бы предположил, что если 50% или больше равны нулю это будет довольно бесполезная особенность. Вы можете взять подмножество ненулевых записей.

df.drop(df[df['number_of_orders'] == 0].index,inplace=True)

Попробуйте и посмотрите, как вы ладите. Кроме того, попробуйте то, что предложили другие люди. Некоторые алгоритмы достаточно умны в работе с нулями, нулями и т. Д. c. Я считаю, что Случайный Лес (регрессия и классификация) достаточно устойчив, даже когда наборы данных в основном являются ненужными.

1 голос
/ 04 марта 2020

Во-первых, я бы предложил изменить ваш метод оценки на взвешенный балл F1 https://scikit-learn.org/stable/modules/generated/sklearn.metrics.f1_score.html - убедитесь, что выбрали «взвешенный» вариант для учета дисбаланса метки. Эта оценка отлично подходит для вашей проблемы.

Во-вторых, я бы попробовал некоторые другие модели, KNN - хорошее начало, но, возможно, он не сможет найти правильную границу решения, чтобы отделить вашу проблему. Возможно, попробуйте случайный лес и / или новый классификатор HistgradientBoostingclassifier (аналогичный подходу lightgbm).

Вы также можете попытаться перефразировать вашу проблему и решить ее как рекомендательную проблему, возможно, вы можете использовать некоторые методы матричной факторизации, это может показаться очень полезным, так как данные в формате, который вы опубликовали, часто бывают крайне скудными (множество нулей).

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