Рекомендация тарифов мобильного оператора
  • AI Chat
  • Code
  • Report
  • Beta
    Spinner

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

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

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

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