Рекомендация тарифов¶
Оператор мобильной связи «Мегалайн» выяснил: многие клиенты пользуются архивными тарифами. Они хотят построить систему, способную проанализировать поведение клиентов и предложить пользователям новый тариф: «Смарт» или «Ультра».
В вашем распоряжении данные о поведении клиентов, которые перешли на актуальные тарифы. Нужно построить модель для задачи классификации, которая выберет подходящий тариф. Предобработка данных была проведена ранее. Постройте модель с максимально большим значением accuracy. Чтобы сдать проект успешно, нужно довести долю правильных ответов по крайней мере до 0.75. Проверьте accuracy на тестовой выборке.
Изучение файла¶
# Импорт библиотек и их компонентов
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
# Загрузка данных в датафрейм
try:
data = pd.read_csv('/datasets/users_behavior.csv')
except:
data = pd.read_csv('datasets/users_behavior.csv')
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 признаков. Пропусков в данных нет.
data.describe()
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 |
Все показатели в допустимых пределах.
data.head()
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 — «Смарт») является категориальным, причём, бинарным. В связи с этим, в рамках данного проекта будет решаться задача классификации.
Разделение данных на выборки¶
Данные будут разбиты на выборку с исследуемыми параметрами и выборку с соответствующими параметрам целями. Далее из полученных выборок будут получены подвыборки тренировочных, валидационных и тестовых данных.
# Разделение датафрейма
# на обучающую и целевую выборки
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 возможных решения задачи классификации: дерево решений, случайный лес и логистическая регрессии.
Дерево решений¶
# Дерево решений
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
Случайный лес¶
# Случайный лес
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
Логистическая регрессия¶
# Логистическая регрессия
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.
Проверка модели на тестовой выборке¶
Проверка на тестовых данных лидера показателя качества — модели случайного леса¶
# Случайный лес
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
.
# Проверка модели на адекватность
model = DummyClassifier(strategy='most_frequent')
model.fit(features_train, target_train)
model.score(features_test, target_test)
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