На основе тестового набора данных выполните следующее:
- Удалите наименее полезные признаки.
- Предскажите вероятности.
- Посчитайте метрику
roc_auc_ovo.
# импортируем библиотеки и объявляем константы
import pandas as pd
import numpy as np
from sklearn.tree import DecisionTreeClassifier
from sklearn.model_selection import cross_val_score
from sklearn.metrics import roc_auc_score
RANDOM_STATE = 42
# считываем данные из CSV-файла
df_full = pd.read_csv('railway_full.csv')
# создаём список численных признаков для создания нового
columns_grades_num = [
'Оценка комфортности места',
'Оценка качества уборки',
'Оценка качества обслуживания в пути'
]
# создаём список строковых признаков для создания нового
columns_grades_str = [
'Оценка комфортности покупки билета онлайн',
'Оценка качества питания',
'Оценка качества wifi',
'Оценка комфортности времени отправления/прибытия'
]
# создаём новые признаки, которые содержат число негативных оценок
df_full['bad_grade_num'] = df_full[columns_grades_num].isin([1, 2]).sum(axis=1)
df_full['bad_grades_str'] = df_full[columns_grades_str].isin(['плохо']).sum(axis=1)
# делим данные на входные и целевые
X = df_full.drop(['Общая оценка качества предоставленной услуги'], axis=1)
y = df_full['Общая оценка качества предоставленной услуги']
# подготавливаем данные заранее созданной функцией
X_train, X_test, y_train, y_test = prepare_data(X, y)
# инициализируем и обучаем модель дерева решений с лучшими гиперпараметрами
model = DecisionTreeClassifier(
max_depth=8,
min_samples_leaf=7,
min_samples_split=4,
random_state=RANDOM_STATE
).fit(X_train, y_train)
# считаем метрику при кросс-валидации
score = cross_val_score(
model,
X_train,
y_train,
scoring='roc_auc_ovo',
n_jobs=-1).mean()
# выводим метрику при кросс-валидации
print('На всех признаках', score)
# формируем таблицу важности признаков
feature_importances = pd.DataFrame(
{
'Feature': X_train.columns,
'Importance': model.feature_importances_
})
# создаём список признаков с важностью менее 0.02
features_to_drop = feature_importances[
feature_importances['Importance'] < 0.02
]['Feature'].to_list()
# удалите признаки с важностью меньше 0.02 из датасета
X_train_less_features = X_train.drop(features_to_drop, axis=1)
X_test_less_features = X_test.drop(features_to_drop, axis=1)
# инициализируем и обучаем модель дерева решений с лучшими гиперпараметрами
model = DecisionTreeClassifier(
max_depth=8,
min_samples_leaf=7,
min_samples_split=4,
random_state=RANDOM_STATE
).fit(X_train_less_features, y_train)
# считаем метрику при кросс-валидации
score = cross_val_score(
model,
X_train_less_features,
y_train,
scoring='roc_auc_ovo',
n_jobs=-1).mean()
# выводим метрику при кросс-валидации
print('На признаках с важностью более 0.02', score)
# предскажите вероятности на тестовых данных
prediction = model.predict_proba(X_test_less_features)
# посчитайте метрику roc_auc_ovo
score = roc_auc_score(y_test, prediction, multi_class='ovo')
# выводим метрику на экран
print('На тестовых данных', score)
Результат
На всех признаках 0.9088671152103602
На признаках с важностью более 0.02 0.9156590675738169
На тестовых данных 0.9161253941494981