Skip to content

Рекомендация тарифов

Оператор мобильной связи «Мегалайн» выяснил: многие клиенты пользуются архивными тарифами. Они хотят построить систему, способную проанализировать поведение клиентов и предложить пользователям новый тариф: «Смарт» или «Ультра».

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

Постройте модель с максимально большим значением 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))