На основе тестового набора данных выполните следующее:

  1. Удалите наименее полезные признаки.
  2. Предскажите вероятности.
  3. Посчитайте метрику 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