Первые хакатоны всегда особенные. Это был мой первый хактон по Analytics Vidhya. Ранее я принимал участие в дататоне на HackerEarth, организованном Future Group. Я вошел в сотню лучших.
Хакатон McKinsey прошел онлайн 20 января. Это был 24-часовой хакатон, который начинался с 6 утра до 6 утра 21 января (чего я тогда не знал).
Постановка задачи
Цифровое подразделение банка сталкивается с проблемами конверсии лидов. Основная цель этого подразделения - увеличить привлечение клиентов через цифровые каналы. Подразделение было создано несколько лет назад, и в эти годы основной задачей подразделения было увеличение количества потенциальных клиентов, попадающих в воронку конверсии.
Они получают потенциальных клиентов через различные каналы, такие как поиск, медийная реклама, рассылки по электронной почте и через аффилированных партнеров. Как и ожидалось, они видят дифференциальное преобразование в зависимости от источников и качества этих лидов.
Теперь они хотят идентифицировать сегменты потенциальных клиентов с более высоким коэффициентом конверсии (приводят к покупке продукта), чтобы они могли специально нацеливать этих потенциальных клиентов через дополнительные каналы и ремаркетинг. Они предоставили частичный набор данных для наемных клиентов за последние 3 месяца. Они также фиксируют основные сведения о клиентах. Нам необходимо определить сегмент клиентов с высокой вероятностью конверсии в ближайшие 30 дней.
Мой подход
Я взял данные и посмотрел, есть ли недостающие значения. И был удивлен, увидев, что из 69713 значений в некоторых столбцах отсутствовало до 47437 значений. Но эти недостающие значения очень связаны. Мол, у вас не может быть City_Category
без City_code
, у вас не может быть Employer_Category
без Employer_Code
.
Gender 0 DOB 15 Lead_Creation_Date 0 City_Code 814 City_Category 814 Employer_Code 4018 Employer_Category1 4018 Employer_Category2 4298 Monthly_Income 0 Customer_Existing_Primary_Bank_Code 9391 Primary_Bank_Type 9391 Contacted 0 Source 0 Source_Category 0 Existing_EMI 51 Loan_Amount 27709 Loan_Period 27709 Interest_Rate 47437 EMI 47437 Var1 0
Итак, я решил отбросить значения, в которых отсутствовало более 20% данных, а удаляемые столбцы были EMI
, Interest_Rate
, Loan_Period
, Loan_Amount
. Вместо этого я создал двоичные функции, чтобы указать, есть ли у кандидата отсутствующие данные.
def add_binary_features(data): data['Missing_Loan_EMI'] = data.EMI.isnull() data['Missing_Loan_Amount'] = data.Loan_Amount.isnull() return data train = add_binary_features(train) test = add_binary_features(test)
Вменение отсутствующих данных
Я присвоил числовым данным среднее значение или медианное значение, а категоричность - моде. Затем я закодировал свои категориальные особенности с помощью sklearn’s
LabelEncoder
. Затем я вычислил возраст человека. При наблюдении было замечено, что Monthly_Income
, Existing_EMI
имеют некоторые выбросы. Итак, я заменю их на 150-кратный 75-й процентиль каждой функции.
Создание функций
Я удалил ID
. И создал фичу Actual_pay
.
> train['Actual_pay'] = train['Monthly_Income'] -train['Existing_EMI']
При построении распределений Monthly_Income было оставлено искаженным, поэтому я заменил его журналами, и все было в порядке. Итак, я перешел к части машинного обучения.
Строительство PipeLine
Разделение, обучение, оценка, прогноз
Я разделяю данные по правилу 80–20. Я пробовал и тестировал различные алгоритмы, такие как GradientBoosting, DecisionTree, RandomForest, обнаружил, что XGBoost (❤) работает лучше всего, и использовал вероятности для прогнозирования.
Результаты
Я представил с результатом 0,77 ..., что принесло мне 159 место в таблице лидеров. Не самое лучшее звание, но это оказалось для меня большим опытом обучения.
P.S: Теперь, когда я начал с глубокого обучения, я чувствую, что нейронные сети могли бы улучшить мои результаты. Не стесняйтесь давать свои ценные предложения.
Ваше здоровье!!