Рекомендация тарифов
Оператор мобильной связи «Мегалайн» выяснил: многие клиенты пользуются архивными тарифами. Они хотят построить систему, способную проанализировать поведение клиентов и предложить пользователям новый тариф: «Смарт» или «Ультра».
В вашем распоряжении данные о поведении клиентов, которые уже перешли на эти тарифы. Нужно построить модель для задачи классификации, которая выберет подходящий тариф. Предобработка данных не понадобится.
Постройте модель с максимально большим значением accuracy. Чтобы сдать проект успешно, нужно довести долю правильных ответов по крайней мере до 0.75. Проверьте accuracy на тестовой выборке.
Описание данных
Каждый объект в наборе данных — это информация о поведении одного пользователя за месяц. Известно:
- сalls — количество звонков,
- minutes — суммарная длительность звонков в минутах,
- messages — количество sms-сообщений,
- mb_used — израсходованный интернет-трафик в Мб,
- is_ultra — каким тарифом пользовался в течение месяца («Ультра» — 1, «Смарт» — 0).
Шаг 1. Импорт библиотек и изучение файлов
# импортируем библиотеки
import pandas as pd
import numpy as np
from matplotlib import pyplot as plt
from sklearn.model_selection import train_test_split
from sklearn.tree import DecisionTreeClassifier
from sklearn.metrics import accuracy_score
from sklearn.ensemble import RandomForestClassifier
from sklearn.linear_model import LogisticRegression
from sklearn.dummy import DummyClassifier
# откроем файл и выведем информацию о нем
df = pd.read_csv("datasets/users_behavior.csv")
display(df.head().style.set_caption("Данные о поведении клиентов"))
df.info()
Шаг 2. Разделение данных на выборки
features = df.drop(["is_ultra"], axis=1)
target = df["is_ultra"]
# применим 2 раза train_test_split и разделим датафрейм в соотношении 60/20/20
# сначала выделим 20% исходной выборки в качестве тестовой
features_train_valid, features_test, target_train_valid, target_test = \
train_test_split(features, target, test_size=.2, random_state=12345)
# затем выделим 25% от оставшейся части выборки в качестве валидационной
features_train, features_valid, target_train, target_valid = \
train_test_split(features_train_valid, target_train_valid, test_size=.25, random_state=12345)
print("Размер обучающей выборки признаков: " + str(features_train.shape))
print("Размер обучающей выборки целевого признака: " + str(target_train.shape))
print("Размер валидационной выборки признаков: " + str(features_valid.shape))
print("Размер валидационной выборки целевого признака: " + str(target_valid.shape))
print("Размер тестовой выборки признаков: " + str(features_test.shape))
print("Размер тестовой выборки целевого признака: " + str(target_test.shape))
Можно видеть, что исходная выборка разделилась в нужной нам пропорции.
Шаг 3. Исследование моделей
Модель дерева решений
best_model_tree = None
best_accuracy_valid_tree = 0
for c in ["gini", "entropy"]:
for d in range(1, 13):
for s in range(2, 5):
for l in range(1, 12):
model_tree = DecisionTreeClassifier(criterion=c,
max_depth=d,
min_samples_split=s,
min_samples_leaf=l,
random_state=12345)
model_tree.fit(features_train, target_train)
predict_tree = model_tree.predict(features_valid)
accuracy_tree = accuracy_score(target_valid, predict_tree)
if accuracy_tree > best_accuracy_valid_tree:
best_accuracy_valid_tree = accuracy_tree
best_model_tree = model_tree
print("Доля правильных ответов лучшей модели на валидационной выборке \
\nДерево решений: " + str(best_accuracy_valid_tree))
print("Гиперпараметры лучшей модели: \n" + str(best_model_tree))
Модель случайного леса
best_model_forest = None
best_accuracy_valid_forest = 0
for n in range(1, 16, 2):
for c in ["gini", "entropy"]:
for d in range(1, 21):
for s in range(2, 12):
for l in range(1, 5):
model_forest = RandomForestClassifier(n_estimators=n,
criterion=c,
max_depth=d,
min_samples_split=s,
min_samples_leaf=l,
random_state=12345)
model_forest.fit(features_train, target_train)
predict_forest = model_forest.predict(features_valid)
accuracy_forest = accuracy_score(target_valid, predict_forest)
if accuracy_forest > best_accuracy_valid_forest:
best_accuracy_valid_forest = accuracy_forest
best_model_forest = model_forest
print("Доля правильных ответов лучшей модели на валидационной выборке \
\nСлучайный лес: " + str(best_accuracy_valid_forest))
print("Гиперпараметры лучшей модели: \n" + str(best_model_forest))
Модель логистической регрессии
best_model_regr = None
best_accuracy_valid_regr = 0
for s in ["newton-cg", "lbfgs", "liblinear", "sag", "saga"]:
for i in range(1, 101, 1):
model_regr = LogisticRegression(solver=s,
max_iter=i,
random_state=12345)
model_regr.fit(features_train, target_train)
predict_regr = model_regr.predict(features_valid)
accuracy_valid_regr = accuracy_score(target_valid, predict_regr)
if accuracy_valid_regr > best_accuracy_valid_regr:
best_accuracy_valid_regr = accuracy_valid_regr
best_model_regr = model_regr
print("Доля правильных ответов лучшей модели на валидационной выборке \
\nЛогистическая регрессия: " + str(best_accuracy_valid_regr))
print("Гиперпараметры лучшей модели: \n" + str(best_model_regr))