Найти в Дзене
ЦифроПроф

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

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

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

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

1. import pandas as pd
from sklearn.tree import DecisionTreeRegressor
from sklearn.tree import DecisionTreeClassifier
from sklearn.ensemble import RandomForestClassifier

from sklearn.model_selection import train_test_split
from sklearn.metrics import mean_squared_error
from sklearn.ensemble import RandomForestRegressor
from sklearn.linear_model import LinearRegression
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import accuracy_score

df=pd.read_csv('/datasets/users_behavior.csv')
df.info()

2. df_train,df_valid=train_test_split(df, test_size=0.4, random_state=12345)
df_valid, df_test=train_test_split(df_valid, test_size = 0.5, random_state=12345)
df_train.info()

df_valid.info()

df_test.info()

features_train=df_train.drop(['is_ultra'], axis=1)
target_train=df_train['is_ultra']
features_valid=df_valid.drop(['is_ultra'], axis=1)
target_valid=df_valid['is_ultra']

3.1 model=DecisionTreeClassifier(random_state=12345, max_depth=None)
model.fit(features_train, target_train)

best_result = 0
best_depth = 0

for depth in range(1, 10):
model=DecisionTreeClassifier(random_state=12345, max_depth=depth)
model.fit(features_train, target_train)
predictions_valid=model.predict(features_valid)
result=accuracy_score(target_valid, predictions_valid)

if result>=best_result:
best_result=result
best_depth=depth

'Лучшая глубина', best_depth, 'Лучшая модель', best_result

3.2 best_result_forest=0
best_est=0
for est in range(1, 11):
model_forest= RandomForestClassifier(random_state=12345, n_estimators=est)
model_forest.fit(features_train, target_train)
result=model_forest.score(features_valid, target_valid)
if result>=best_result_forest:
best_result_forest=result
best_est=est

"Количество деревьев в лесу", best_est, 'Лучшая модель', best_result_forest

3.3 solvers = ['newton-cg', 'lbfgs', 'liblinear', 'sag', 'saga']

best_result=0
best_solver=None

for solver in solvers:
model_lr=LogisticRegression(random_state=12345, solver=solver, max_iter=1000)
model_lr.fit(features_train, target_train)
result=model_lr.score(features_valid, target_valid)
if result>=best_result:
best_result=result
best_solver=solver
print('Solver', best_solver, 'Лучшая модель', best_result)

Для выбранных моделей получились следующие результаты:

  1. Логистическая регрессия: лучший гиперпараметр - solver 'newton-cg' с результатом 0.7558320373250389
  2. Лес: оптимальное значение гиперпараметра 'Количество деревьев в лесу'= 10, с результатом 0.7853810264385692)
  3. Дерево решений: оптимальное значение гиперпараметра 'глубина'= 3 c результатом 0.7853810264385692)

Таким образом, дерево решений и лес показывают самую высокую точность. Протестируем их.

4.

test_features=df_test.drop(['is_ultra'], axis=1)
test_target=df_test['is_ultra']

model = DecisionTreeClassifier(max_depth=3, random_state=12345)
model.fit(features_train, target_train)
predictions_test = model.predict(test_features)
accuracy_score(test_target, predictions_test)

model_forest = RandomForestClassifier(n_estimators=10, random_state=12345)
model_forest.fit(features_train, target_train)
predictions_test1=model_forest.predict(test_features)
accuracy_score(test_target, predictions_test1)

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

df['is_ultra'].value_counts()

df['is_ultra'].value_counts(normalize=True)

df_test['is_ultra'].value_counts()

df_test['is_ultra'].value_counts(normalize=True)

Вывод: По итогу исследования моделей было выбрано 2 (лес и дерево решений), которые показали примерно одинаковый результат на тестовой выборке. Таким образом, модель предложит перейти на тариф абонентам, которым это действительно нужно, c вероятностью 78%.