Microsegment.ru
  • Главная страница
  • О проекте
  • Портфолио
  • Блог

Рекомендация тарифов клиентам «Мегалайн» на основе их классификации

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

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

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

Оглавление

  • 1  Изучение файла
  • 2  Разделение данных на выборки
  • 3  Исследование моделей
    • 3.1  Дерево решений
    • 3.2  Случайный лес
    • 3.3  Логистическая регрессия
    • 3.4  Выводы из построенных моделей
  • 4  Проверка модели на тестовой выборке
    • 4.1  Проверка на тестовых данных лидера показателя качества — модели случайного леса
    • 4.2  Результаты проверки моделей на тестовых данных
  • 5  Проверка модели на адекватность
    • 5.1  Проверка
    • 5.2  Вывод
  • 6  Чек-лист готовности проекта

Изучение файла¶

In [1]:
# Импорт библиотек и их компонентов
import pandas as pd
# Модель классификатора Дерево решений
from sklearn.tree import DecisionTreeClassifier
# Модель классификатора Случайный лес
from sklearn.ensemble import RandomForestClassifier
# Модель классификатора Логистическая регрессия
from sklearn.linear_model import LogisticRegression
# Разделение датафрейма на выборки
from sklearn.model_selection import train_test_split
# Оценка модели
from sklearn.metrics import accuracy_score
# Модель "идиотка" для проверки адекватности
from sklearn.dummy import DummyClassifier
In [2]:
# Загрузка данных в датафрейм
try:
    data = pd.read_csv('/datasets/users_behavior.csv') 
except:
    data = pd.read_csv('datasets/users_behavior.csv')
    
In [3]:
data.info()
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 3214 entries, 0 to 3213
Data columns (total 5 columns):
 #   Column    Non-Null Count  Dtype  
---  ------    --------------  -----  
 0   calls     3214 non-null   float64
 1   minutes   3214 non-null   float64
 2   messages  3214 non-null   float64
 3   mb_used   3214 non-null   float64
 4   is_ultra  3214 non-null   int64  
dtypes: float64(4), int64(1)
memory usage: 125.7 KB

Датафрейм содержит 3214 объектов и 5 признаков. Пропусков в данных нет.

In [4]:
data.describe() 
Out[4]:
calls minutes messages mb_used is_ultra
count 3214.000000 3214.000000 3214.000000 3214.000000 3214.000000
mean 63.038892 438.208787 38.281269 17207.673836 0.306472
std 33.236368 234.569872 36.148326 7570.968246 0.461100
min 0.000000 0.000000 0.000000 0.000000 0.000000
25% 40.000000 274.575000 9.000000 12491.902500 0.000000
50% 62.000000 430.600000 30.000000 16943.235000 0.000000
75% 82.000000 571.927500 57.000000 21424.700000 1.000000
max 244.000000 1632.060000 224.000000 49745.730000 1.000000

Все показатели в допустимых пределах.

In [5]:
data.head()
Out[5]:
calls minutes messages mb_used is_ultra
0 40.0 311.90 83.0 19915.42 0
1 85.0 516.75 56.0 22696.96 0
2 77.0 467.66 86.0 21060.45 0
3 106.0 745.53 81.0 8437.39 1
4 66.0 418.74 1.0 14502.75 0

Искомый параметр is_ultra с указанием тарифа (1 — «Ультра», 0 — «Смарт») является категориальным, причём, бинарным. В связи с этим, в рамках данного проекта будет решаться задача классификации.

Разделение данных на выборки¶

Данные будут разбиты на выборку с исследуемыми параметрами и выборку с соответствующими параметрам целями. Далее из полученных выборок будут получены подвыборки тренировочных, валидационных и тестовых данных.

In [14]:
# Разделение датафрейма 
# на обучающую и целевую выборки
features = data.drop('is_ultra', axis=1)
target = data['is_ultra'] 

# Разделение обучающей и целевой выборки
# на тренировочные и тестовые
features_train, features_test, target_train, target_test = train_test_split(
    features, 
    target, 
    test_size=.20,
    random_state=12345
) 

# Разделение тренировочных выборок
# на тренировочные и валидационные
features_train, features_valid, target_train, target_valid = train_test_split(
    features_train, 
    target_train, 
    test_size=.25,
    random_state=12345
) 

Исследование моделей¶

Будет исследовано 3 возможных решения задачи классификации: дерево решений, случайный лес и логистическая регрессии.

Дерево решений¶

In [7]:
# Дерево решений
best_model = None
#best_n_ = 0
best_depth = 0
best_result = 0
for depth in range(1, 7):
    model = DecisionTreeClassifier(
        random_state=12345,
        max_depth=depth
    ) 
    model.fit(features_train, target_train) 
    predictions = model.predict(features_valid) 
    result = accuracy_score(target_valid, predictions) 
    if result > best_result:
        best_model = model
        best_depth = depth
        best_result = result

print('Модель "Дерево решений"\n') 
print('Лучшая модель  :', best_model, '\n')
print('Лучшая глубина :', best_depth, '\n') 
print('Лучшая точность:', best_result) 
Модель "Дерево решений"

Лучшая модель  : DecisionTreeClassifier(max_depth=3, random_state=12345) 

Лучшая глубина : 3 

Лучшая точность: 0.7943615257048093

Случайный лес¶

In [8]:
# Случайный лес
best_model = None
best_est = 0
best_depth = 0
best_result = 0
for depth in range(1, 7):
    for est in range(1, 70):
        model = RandomForestClassifier(
            random_state=12345,
            n_estimators=est, 
            max_depth=depth
        ) 
        model.fit(features_train, target_train) 
        predictions = model.predict(features_valid) 
        result = accuracy_score(target_valid, predictions) 
        if result > best_result:
            best_model = model
            best_est = est
            best_depth = depth
            best_result = result

print('Модель "Случайный лес"\n') 
print('Лучшая модель      :', best_model, '\n')
print('Лучшая глубина     :', best_depth, '\n') 
print('Количество деревьев:', best_est, '\n') 
print('Лучшая точность    :', best_result) 
Модель "Случайный лес"

Лучшая модель      : RandomForestClassifier(max_depth=5, n_estimators=51, random_state=12345) 

Лучшая глубина     : 5 

Количество деревьев: 51 

Лучшая точность    : 0.8175787728026535

Логистическая регрессия¶

In [24]:
# Логистическая регрессия
best_model = None
best_iter = 0
best_result = 0
for i in range(100, 800):
    model = LogisticRegression(
        random_state=12345,
        solver='lbfgs', 
        max_iter=i
    ) 
    model.fit(features_train, target_train) 
    predictions = model.predict(features_valid) 
    result = accuracy_score(target_valid, predictions) 
    if result > best_result:
        best_model = model
        best_iter = i
        best_result = result

print('Модель "Логистическая регрессия"\n') 
print('Лучшая модель      :', best_model, '\n')
print('Количество итераций:', best_iter, '\n') 
print('Лучшая точность    :', best_result) 
Модель "Логистическая регрессия"

Лучшая модель      : LogisticRegression(random_state=12345) 

Количество итераций: 100 

Лучшая точность    : 0.7262830482115086

Выводы из построенных моделей¶

Наилучший результат показателя качества модели в 0.8176 у модели случайного леса из 51 дерева, каждое с глубиной 5.

Проверка модели на тестовой выборке¶

Проверка на тестовых данных лидера показателя качества — модели случайного леса¶

In [10]:
# Случайный лес
model = RandomForestClassifier(
    random_state=12345,
    n_estimators=51, 
    max_depth=5
) 

model.fit(features_train, target_train) 
predictions = model.predict(features_test) 
result = accuracy_score(target_test, predictions) 

print('Модель         :', model, '\n') 
print('Лучшая точность:', result) 
Модель         : RandomForestClassifier(max_depth=5, n_estimators=51, random_state=12345) 

Лучшая точность: 0.7972636815920398

Значение показателя качества модели случайного леса на тестовых данных оказался всего 0.7973, что ниже аналогичного значения модели дерева решений на валидационных данных. Для подтверждения правильности выбора модели требуется проверить на тестовых данных оставшиеся две модели.

Результаты проверки моделей на тестовых данных¶

По результатам проверки моделей на тестовых данных по показателю качества моделей лидирует модель случайного леса. На валидационных данных она показала результат 0.8176, а на тестовых результат 0.7973.

Полученные результаты выше требуемого заказчиком порогового значения 0.75. Следовательно, модель случайного леса, состоящего из 51 дерева по 5 уровней каждое, можно рекомендовать в качестве решения для автоматизации подбора тарифа у мобильного оператора.

Проверка модели на адекватность¶

Проверка¶

Проверка модели на адекватность будет производится с помощью «модели-мидиотки» DummyClassifier со стратегией most_frequent.

In [13]:
# Проверка модели на адекватность
model = DummyClassifier(strategy='most_frequent')
model.fit(features_train, target_train)
model.score(features_test, target_test) 
Out[13]:
0.7002487562189055

Оценка качества 0.7002 модели «идиотки» ниже оценки качества 0.7973, полученной с помощью модели случайного леса с оптимальным параметрами на тестовых данных.

Вывод¶

Модель случайного леса с 51 деревом по 5 уровней успешно прошла проверку на адекватность.

Чек-лист готовности проекта¶

  • [x] Jupyter Notebook открыт
  • [x] Весь код исполняется без ошибок
  • [x] Ячейки с кодом расположены в порядке исполнения
  • [x] Выполнено задание 1: данные загружены и изучены
  • [x] Выполнено задание 2: данные разбиты на три выборки
  • [x] Выполнено задание 3: проведено исследование моделей
    • [x] Рассмотрено больше одной модели
    • [x] Рассмотрено хотя бы 3 значения гиперпараметров для какой-нибудь модели
    • [x] Написаны выводы по результатам исследования
  • [x] Выполнено задание 3: Проведено тестирование
  • [x] Удалось достичь accuracy не меньше 0.75

Политика конфиденциальности

Продолжая использовать данный сайт вы подтверждаете свое согласие с условиями его политики конфиденциальности. Подробнее…




Администрация и владельцы данного информационного ресурса не несут ответственности за возможные последствия, связанные с использованием информации, размещенной на нем.


Все права защищены. При копировании материалов сайта обязательно указывать ссылку на © Microsegment.ru (2020-2025)