# импортируем необходимые нам библиотеки для работы с данными
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
import re
# импорт моделей
from sklearn.linear_model import LogisticRegression
from sklearn.tree import DecisionTreeClassifier
from sklearn.ensemble import RandomForestClassifier
from sklearn.dummy import DummyClassifier
# импорт метрик
from sklearn.metrics import f1_score, recall_score, precision_score, roc_curve
from sklearn.metrics import precision_recall_curve, accuracy_score, roc_auc_score
# импорт утилит
from sklearn.model_selection import train_test_split
from sklearn.model_selection import GridSearchCV
from sklearn.utils import shuffle
# импорт классов и пайплайнов
from sklearn.pipeline import Pipeline
from sklearn.preprocessing import StandardScaler, OneHotEncoder
from sklearn.compose import ColumnTransformer
from sklearn.impute import SimpleImputer
from sklearn import set_config
In C:\Users\1\anaconda3\envs\praktikum\lib\site-packages\matplotlib\mpl-data\stylelib\_classic_test.mplstyle:
The text.latex.preview rcparam was deprecated in Matplotlib 3.3 and will be removed two minor releases later.
In C:\Users\1\anaconda3\envs\praktikum\lib\site-packages\matplotlib\mpl-data\stylelib\_classic_test.mplstyle:
The mathtext.fallback_to_cm rcparam was deprecated in Matplotlib 3.3 and will be removed two minor releases later.
In C:\Users\1\anaconda3\envs\praktikum\lib\site-packages\matplotlib\mpl-data\stylelib\_classic_test.mplstyle: Support for setting the 'mathtext.fallback_to_cm' rcParam is deprecated since 3.3 and will be removed two minor releases later; use 'mathtext.fallback : 'cm' instead.
In C:\Users\1\anaconda3\envs\praktikum\lib\site-packages\matplotlib\mpl-data\stylelib\_classic_test.mplstyle:
The validate_bool_maybe_none function was deprecated in Matplotlib 3.3 and will be removed two minor releases later.
In C:\Users\1\anaconda3\envs\praktikum\lib\site-packages\matplotlib\mpl-data\stylelib\_classic_test.mplstyle:
The savefig.jpeg_quality rcparam was deprecated in Matplotlib 3.3 and will be removed two minor releases later.
In C:\Users\1\anaconda3\envs\praktikum\lib\site-packages\matplotlib\mpl-data\stylelib\_classic_test.mplstyle:
The keymap.all_axes rcparam was deprecated in Matplotlib 3.3 and will be removed two minor releases later.
In C:\Users\1\anaconda3\envs\praktikum\lib\site-packages\matplotlib\mpl-data\stylelib\_classic_test.mplstyle:
The animation.avconv_path rcparam was deprecated in Matplotlib 3.3 and will be removed two minor releases later.
In C:\Users\1\anaconda3\envs\praktikum\lib\site-packages\matplotlib\mpl-data\stylelib\_classic_test.mplstyle:
The animation.avconv_args rcparam was deprecated in Matplotlib 3.3 and will be removed two minor releases later.
# установим общие параметры для тетради
# оформление графиков
sns.set()
# вывод pipeline
set_config(display='diagram')
# читаем файл и сохраняем в переменные дальнейшей работы, в том числе изменений
# используем оператор обработки исключений, чтобы избежать ошибки, при открытии данных,
# расположенных по другому адресу
try:
df = pd.read_csv('/datasets/Churn.csv')
except:
df = pd.read_csv('datasets/Churn.csv')
try:
df_control = pd.read_csv('/datasets/Churn.csv')
except:
df_control = pd.read_csv('datasets/Churn.csv')
# проверим результат, а также ознакомимся с данными
# используем метод sample() для случайной выборки
# с параметром random_state=1, для сохранения результата
# при повторных запусках алгоритма
data_list = [df, df_control]
for data in data_list:
display(data.sample(5, random_state=1))
print('=' * 45)
=============================================
=============================================
# изучим данные более внимательно
df.info()
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 10000 entries, 0 to 9999
Data columns (total 14 columns):
# Column Non-Null Count Dtype
--- ------ -------------- -----
0 RowNumber 10000 non-null int64
1 CustomerId 10000 non-null int64
2 Surname 10000 non-null object
3 CreditScore 10000 non-null int64
4 Geography 10000 non-null object
5 Gender 10000 non-null object
6 Age 10000 non-null int64
7 Tenure 9091 non-null float64
8 Balance 10000 non-null float64
9 NumOfProducts 10000 non-null int64
10 HasCrCard 10000 non-null int64
11 IsActiveMember 10000 non-null int64
12 EstimatedSalary 10000 non-null float64
13 Exited 10000 non-null int64
dtypes: float64(3), int64(8), object(3)
memory usage: 1.1+ MB
for inx, name in enumerate(df.columns):
df.rename(
columns=
{df.columns[inx]:
'_'.join(re.findall('[A-Z][^A-Z]*',
df.columns[inx]))
.lower()}, inplace=True)
# проверим результат
df.columns
# изучим содержание датасета на предмет явных проблем
print('\033[1m' + 'Количество явных дубликатов: ' + '\033[0m', df.duplicated().sum())
print('=' * 45)
n=0
for column in df:
print('\033[1m' + f'Количество пропусков в столбце {df.columns[n]}:' + '\033[0m',
df[column].isna().sum())
print('=' * 45)
print()
n += 1
Количество явных дубликатов: 0
=============================================
Количество пропусков в столбце row_number: 0
=============================================
Количество пропусков в столбце customer_id: 0
=============================================
Количество пропусков в столбце surname: 0
=============================================
Количество пропусков в столбце credit_score: 0
=============================================
Количество пропусков в столбце geography: 0
=============================================
Количество пропусков в столбце gender: 0
=============================================
Количество пропусков в столбце age: 0
=============================================
Количество пропусков в столбце tenure: 909
=============================================
Количество пропусков в столбце balance: 0
=============================================
Количество пропусков в столбце num_of_products: 0
=============================================
Количество пропусков в столбце has_cr_card: 0
=============================================
Количество пропусков в столбце is_active_member: 0
=============================================
Количество пропусков в столбце estimated_salary: 0
=============================================
Количество пропусков в столбце exited: 0
=============================================
# изучим содержание датасета на предмет явных проблем
print('\033[1m' + 'Количество явных дубликатов без учета RowNumber и CustomerId: ' + '\033[0m', df.drop(
['row_number', 'customer_id'], axis=1).duplicated().sum())
print('=' * 45)
print(
'\033[1m' + 'Количество явных дубликатов исключительно по признакам Surname, Gender, Age: ' + '\033[0m',
df[['surname', 'gender', 'age']].duplicated().sum())
print('=' * 45)
Количество явных дубликатов без учета RowNumber и CustomerId: 0
=============================================
Количество явных дубликатов исключительно по признакам Surname, Gender, Age: 596
=============================================
dupe_filter = df[['surname', 'gender', 'age']].duplicated(keep=False)
df[dupe_filter].sort_values('surname').head(15)
df = df.drop(['row_number', 'customer_id', 'surname'], axis=1)
df.describe()
df.hist(bins=50, figsize=(20,15), color='r', edgecolor='black', linewidth=1)
plt.show()
# подготовим датасет
df_cleaned = df.copy()
def boxplot_slave(data, name, xlim = None, ylim = None):
'''
boxplot_slave принимает данные в параметр data и возвращает боксплот;
name используется для разметки и принимает название исследуемого признака.
xlim и ylim используются для масштабирования графика, ограничивая его оси
и принимают кортеж (tuple) из двух цифр (начало и конец ограничения)
'''
# выведем описание данных
print('\033[1m' + f'Описание признака {name}:' + '\033[0m')
print(data.describe())
print('=' * 45)
# построим боксплот
box = plt.boxplot(
x=data, vert=False,
patch_artist=True, notch=True
)
fig = plt.gcf()
fig.set_size_inches(15, 8)
if xlim is not None:
plt.xlim(xlim)
if ylim is not None:
plt.ylim(ylim)
plt.title(
f'Боксплот признака {name}',
fontsize=14
)
plt.show()
# выведем его минимальные и максимальные значения
Q1 = data.quantile(0.25)
Q3 = data.quantile(0.75)
IQR = Q3 - Q1
lower_fence = Q1 - (1.5 * IQR)
upper_fence = Q3 + (1.5 * IQR)
print('\033[1m' + f'Пороговые значения боксплота {name}:' + '\033[0m')
print('Нижняя граница значений:', lower_fence)
print('Верхняя граница значений:', upper_fence)
print()
print()
def loss_estimator(feature_name, data=df_cleaned, lower_fence = None, upper_fence = None):
'''
loss_estimator принимает в параметры:
feature_name - наименование признака;
data - наименование датасета, в котором производится обработка (df_cleaned по умолчанию);
lower_fence - нижний порог значения признака,
после которого все значения отбрасываются (None по умолчанию);
upper_fence - верхний порог значения признака,
после которого все значения отбрасываются (None по умолчанию),
после чего отфильтровывает переданный датасет (data), по указанным значениям,
возвращает его и статистику изменения значений.
'''
before = len(df_cleaned)
if lower_fence is not None:
data = data[data[feature_name] >= lower_fence]
elif upper_fence is not None:
data = data[data[feature_name] <= upper_fence]
else:
print('Выбросы не очищались')
after = len(data)
print(f'Исходное количество наблюдений {before}')
print(f'Количество наблюдений уменьшилось на {1-after/before:.2%} по сравнению с предыдущей версией df_cleaned.')
print(f'Количество наблюдений уменьшилось на {1-after/len(df):.2%} по сравнению с df.')
print(f'Итоговое количество наблюдений {after}')
return data
df_cleaned['exited'].value_counts()
part = df_cleaned['exited'].value_counts()[1] / df_cleaned['exited'].value_counts()[0]
print(f'Доля положительного целевого признака в выборке {part:.2%}')
Доля положительного целевого признака в выборке 25.58%
num_att = ['credit_score', 'age', 'tenure', 'balance', 'estimated_salary']
boxplot_slave(df_cleaned['credit_score'], df_cleaned['credit_score'].name)
Описание признака credit_score:
count 10000.000000
mean 650.528800
std 96.653299
min 350.000000
25% 584.000000
50% 652.000000
75% 718.000000
max 850.000000
Name: credit_score, dtype: float64
=============================================
Пороговые значения боксплота credit_score:
Нижняя граница значений: 383.0
Верхняя граница значений: 919.0
df[df['credit_score'] < 383.0]
df_cleaned = loss_estimator(feature_name = 'credit_score', lower_fence=383.0)
Исходное количество наблюдений 10000
Количество наблюдений уменьшилось на 0.15% по сравнению с предыдущей версией df_cleaned.
Количество наблюдений уменьшилось на 0.15% по сравнению с df.
Итоговое количество наблюдений 9985
# проверим результат
assert df_cleaned['credit_score'].min() == 383, 'Есть одинаковые пользователи в разных группах!'
plt.hist(df_cleaned['credit_score'], color ='r', edgecolor='black', linewidth=1, bins=50)
plt.title('Гистограмма credit_score', fontsize=14)
plt.show()
boxplot_slave(df_cleaned['age'], df_cleaned['age'].name)
Описание признака age:
count 9985.000000
mean 38.915173
std 10.487483
min 18.000000
25% 32.000000
50% 37.000000
75% 44.000000
max 92.000000
Name: age, dtype: float64
=============================================
Пороговые значения боксплота age:
Нижняя граница значений: 14.0
Верхняя граница значений: 62.0
df_cleaned = loss_estimator(feature_name = 'age', upper_fence = 62.0)
Исходное количество наблюдений 9985
Количество наблюдений уменьшилось на 3.45% по сравнению с предыдущей версией df_cleaned.
Количество наблюдений уменьшилось на 3.59% по сравнению с df.
Итоговое количество наблюдений 9641
# проверим результат
assert df_cleaned['age'].max() == 62.0, 'Есть одинаковые пользователи в разных группах!'
plt.hist(df_cleaned['tenure'], color ='r', edgecolor='black', linewidth=1, bins=11)
plt.title('Гистограмма tenure', fontsize=14)
plt.show()
df_cleaned['tenure'].describe()
df[['tenure', 'exited']].corr()
boxplot_slave(df_cleaned['balance'], df_cleaned['balance'].name)
Описание признака balance:
count 9641.000000
mean 76560.672538
std 62401.698405
min 0.000000
25% 0.000000
50% 97318.250000
75% 127660.460000
max 250898.090000
Name: balance, dtype: float64
=============================================
Пороговые значения боксплота balance:
Нижняя граница значений: -191490.69
Верхняя граница значений: 319151.15
df_cleaned[df_cleaned['balance'] < 97157.960000][['balance', 'exited']].corr()
df_cleaned[['balance', 'exited']].corr()
boxplot_slave(df_cleaned['estimated_salary'], df_cleaned['estimated_salary'].name)
Описание признака estimated_salary:
count 9641.000000
mean 100172.421223
std 57512.265414
min 11.580000
25% 51113.140000
50% 100324.010000
75% 149458.730000
max 199992.480000
Name: estimated_salary, dtype: float64
=============================================
Пороговые значения боксплота estimated_salary:
Нижняя граница значений: -96405.24500000001
Верхняя граница значений: 296977.115
cat_att = df_cleaned.columns.drop(num_att)[:-1]
cat_att
for feature in cat_att:
print('\033[1m' + f'Значения признака {df_cleaned[feature].name}:' + '\033[0m')
print(df_cleaned[feature].value_counts())
print('=' * 45)
print()
Значения признака geography:
France 4832
Germany 2425
Spain 2384
Name: geography, dtype: int64
=============================================
Значения признака gender:
Male 5265
Female 4376
Name: gender, dtype: int64
=============================================
Значения признака num_of_products:
1 4893
2 4436
3 253
4 59
Name: num_of_products, dtype: int64
=============================================
Значения признака has_cr_card:
1 6799
0 2842
Name: has_cr_card, dtype: int64
=============================================
Значения признака is_active_member:
1 4851
0 4790
Name: is_active_member, dtype: int64
=============================================
df_cleaned[['num_of_products', 'has_cr_card', 'exited']].corr()
# разделим датасет на признаки и целевой признак
# сформируем фильтры
features = df_cleaned.columns.drop('exited')
target = ['exited']
# подготовим массивы
X = df_cleaned[features]
y = np.ravel(df_cleaned[target])
# подготовим массивы на данных с выбросами
X_raw = df[features]
y_raw = np.ravel(df[target])
print(num_att)
print(cat_att)
['credit_score', 'age', 'tenure', 'balance', 'estimated_salary']
Index(['geography', 'gender', 'num_of_products', 'has_cr_card',
'is_active_member'],
dtype='object')
num_pipeline = Pipeline([
# для обработки пропусков
('imputer', SimpleImputer(strategy='mean')),
# для стандартизации
('std_caler', StandardScaler())
])
num_pipeline
full_pipeline = ColumnTransformer([
# встроим числовой пайплайн
('num', num_pipeline, num_att),
# для обработки категорий
('cat', OneHotEncoder(), cat_att)
])
full_pipeline
# lr_pipe
lr_pipeline = Pipeline([
('full', full_pipeline),
('lr', LogisticRegression(random_state=42))
])
# dtc_pipe
dtc_pipeline = Pipeline([
('full', full_pipeline),
('dtc', DecisionTreeClassifier(random_state=42) )
])
# rfc_pipe
rfc_pipeline = Pipeline([
('full', full_pipeline),
('rfc', RandomForestClassifier(random_state=42))
])
# сформируем лист пайплайнов
model_pipe_list = [lr_pipeline, dtc_pipeline, rfc_pipeline]
# подготовим тестовый набор без выбросов
X_train, X_test, y_train, y_test = train_test_split(
X, y, test_size=0.2, random_state=42
)
# подготовим обучающий и валидационный набор без выбросов
X_train, X_val, y_train, y_val = train_test_split(
X_train, y_train, test_size=0.25, random_state=42
)
# подготовим тестовый набор с выбросами
X_train_raw, X_test_raw, y_train_raw, y_test_raw = train_test_split(
X_raw, y_raw, test_size=0.2, random_state=42
)
# подготовим обучающий и валидационный набор с выбросами
X_train_raw, X_val_raw, y_train_raw, y_val_raw = train_test_split(
X_train_raw, y_train_raw, test_size=0.25, random_state=42
)
# подготовим объединенный набор без выбросов
X_train_max = pd.concat((X_train, X_val))
y_train_max = np.concatenate((y_train, y_val))
# подготовим объединенный набор с выбросами
X_train_max_raw = pd.concat((X_train_raw, X_val_raw))
y_train_max_raw = np.concatenate((y_train_raw, y_val_raw))
# определим функцию проверки
def ml_slave(mod, data_list, score_list, name_list=None, best_params = None):
'''
Функция принимает разные модели в параметры, чтобы вывести их accuracy и сравнить с целевым.
mod - вид модели;
data_list - список, содержащий датасеты для обучения модели [X, y, test];
score_list - список, собирающий оценки модели;
name_list - параметр для вывода названия модели вместе с оценкой (по умолчанию None),
'''
model = mod.fit(data_list[0], data_list[1])
predictions = model.predict(data_list[2])
result = f1_score(data_list[3], predictions)
if name_list is not None:
print(f'F1-score модели {name_list}: {result:.4}')
else:
print(f'F1-score модели: {result:.4}')
if best_params is not None:
best_params.append(model.best_params_)
print(f'Оценка достигнута при параметрах: {best_params[0]}')
score_list.append(result)
print('=' * 45)
print()
# сформируем списки для работы функций
# наборы
pipe_data_list = [X_train, y_train, X_val, y_val]
raw_pipe_data_list = [X_train_raw, y_train_raw, X_val_raw, y_val_raw]
# общий лист
total_data_list = [pipe_data_list, raw_pipe_data_list]
# оценки
pipe_score = []
raw_pipe_score = []
total_pipe_score = [pipe_score, raw_pipe_score]
# названия
model_names = ['LogisticRegression', 'DecisionTreeClassifier', 'RandomForestClassifier']
%%time
for i in range(0,2):
if i == 0:
print('\033[1m' + 'I. ПОКАЗАТЕЛИ ЧИСТЫХ МОДЕЛЕЙ ПО ОЧИЩЕННОЙ ДАТЕ БЕЗ ВЫБРОСОВ' + '\033[0m')
else:
print('\033[1m' + 'II. ПОКАЗАТЕЛИ ЧИСТЫХ МОДЕЛЕЙ ПО ГРЯЗНОЙ ДАТЕ С ВЫБРОСАМИ' + '\033[0m')
for inx, pipe in enumerate(model_pipe_list):
ml_slave(pipe, total_data_list[i], total_pipe_score[i], model_names[inx])
I. ПОКАЗАТЕЛИ ЧИСТЫХ МОДЕЛЕЙ ПО ОЧИЩЕННОЙ ДАТЕ БЕЗ ВЫБРОСОВ
F1-score модели LogisticRegression: 0.5643
=============================================
F1-score модели DecisionTreeClassifier: 0.5217
=============================================
F1-score модели RandomForestClassifier: 0.6034
=============================================
II. ПОКАЗАТЕЛИ ЧИСТЫХ МОДЕЛЕЙ ПО ГРЯЗНОЙ ДАТЕ С ВЫБРОСАМИ
F1-score модели LogisticRegression: 0.5171
=============================================
F1-score модели DecisionTreeClassifier: 0.5018
=============================================
F1-score модели RandomForestClassifier: 0.5862
=============================================
Wall time: 2.6 s
def downsample(features, target):
'''
downsample принимает наборы (features, target), после чего разделяет их на положительные и отрицательные,
уменьшает доминирующий признак, формирует новые наборы и возвращает измененные выборки.
'''
features_zeros = features[target == 0]
features_ones = features[target == 1]
target_zeros = target[target == 0]
target_ones = target[target == 1]
value = len(features_ones)
fraction = round((len(features_ones) / len(features_zeros)), 4)
features_downsampled = pd.concat(
[features_zeros.sample(frac=fraction, random_state=12345)] + [features_ones])
target_downsampled = np.concatenate(
(target_zeros[np.random.choice(
len(target_zeros), size=value)], target_ones)
)
features_downsampled, target_downsampled = shuffle(
features_downsampled, target_downsampled, random_state=12345)
return features_downsampled, target_downsampled
# подготовка списка данных для функции
features_downsampled, target_downsampled = downsample(
X_train, y_train
)
pure_downsampled_list = [features_downsampled, target_downsampled, X_val, y_val]
# подготовка списка данных для функции
features_downsampled_raw, target_downsampled_raw = downsample(
X_train_raw, y_train_raw
)
raw_downsampled_list = [features_downsampled_raw, target_downsampled_raw, X_val_raw, y_val_raw]
# сформируем списки для работы функций
# наборы
total_downsample_list = [pure_downsampled_list, raw_downsampled_list]
# подготовка списка для оценок
pure_downsample_score = []
raw_downsample_score = []
downasmpled_pipe_score = [pure_downsample_score, raw_downsample_score]
%%time
for i in range(0,2):
if i == 0:
print('\033[1m' + 'I. ПОКАЗАТЕЛИ ЧИСТЫХ МОДЕЛЕЙ ПО ОЧИЩЕННОЙ DOWNSAMPLED-ДАТЕ БЕЗ ВЫБРОСОВ' + '\033[0m')
else:
print('\033[1m' + 'II. ПОКАЗАТЕЛИ ЧИСТЫХ МОДЕЛЕЙ ПО ГРЯЗНОЙ DOWNSAMPLED-ДАТЕ С ВЫБРОСАМИ' + '\033[0m')
for inx, pipe in enumerate(model_pipe_list):
ml_slave(pipe, total_downsample_list[i], downasmpled_pipe_score[i], model_names[inx])
I. ПОКАЗАТЕЛИ ЧИСТЫХ МОДЕЛЕЙ ПО ОЧИЩЕННОЙ DOWNSAMPLED-ДАТЕ БЕЗ ВЫБРОСОВ
F1-score модели LogisticRegression: 0.5739
=============================================
F1-score модели DecisionTreeClassifier: 0.4771
=============================================
F1-score модели RandomForestClassifier: 0.5761
=============================================
II. ПОКАЗАТЕЛИ ЧИСТЫХ МОДЕЛЕЙ ПО ГРЯЗНОЙ DOWNSAMPLED-ДАТЕ С ВЫБРОСАМИ
F1-score модели LogisticRegression: 0.5628
=============================================
F1-score модели DecisionTreeClassifier: 0.4903
=============================================
F1-score модели RandomForestClassifier: 0.5865
=============================================
Wall time: 1.33 s
# определим функцию проверки
def ml_threshold_slave(mod, data_list, score_list, auc_roc_score, name_list = None, threshold_list = None):
'''
Функция принимает разные модели в параметры, чтобы вывести их accuracy и сравнить с целевым.
mod - вид модели;
data_list - список, содержащий датасеты для обучения модели [X, y, test];
score_list - список, куда будут сохранены оценки (f1);
auc_roc_score - список, куда будут сохранены оценки roc-кривой;
name_list - параметр для разметки, передающий название модели;
threshold_list - список, сохраняющий лучшее значение порога.
'''
# основная часть функции, оценка по разным порогам
mod.fit(data_list[0], data_list[1])
predictions = mod.predict_proba(data_list[2])
probabilities_one_valid = predictions[:, 1]
best_score = 0
best_threshold = 0
# цикл на перебор порога и вывод результатов на экран
if name_list is not None:
print('\033[1m' + f'Статистика модели {name_list}' + '\033[0m')
else:
print('\033[1m' + 'Статистика модели' + '\033[0m')
for threshold in np.arange(0, 0.95, 0.05):
predicted_valid = probabilities_one_valid > threshold
precision = precision_score(data_list[3], predicted_valid)
recall = recall_score(data_list[3], predicted_valid)
result = f1_score(data_list[3], predicted_valid)
print('Порог = {:.2f} | Точность = {:.3f}, Полнота = {:.3f} | F1-мера = {:.3f}'.format(
threshold, precision, recall, result))
if best_score < result:
best_score = result
best_threshold = threshold
# вывод оценок
print()
if name_list is not None:
print('\033[1m' + f'Оценки модели {name_list}' + '\033[0m')
else:
print('\033[1m' + 'Оценки модели' + '\033[0m')
print(f'F1: {best_score:.4}')
auc_roc = roc_auc_score(data_list[3], predictions[:, 1])
print('AUC:', auc_roc)
print('Лучшее значение порога:', round(best_threshold, 2))
print('=' * 45)
print()
print()
# дополнение списка оценок
score_list.append(round(best_score, 4))
auc_roc_score.append(auc_roc)
if threshold_list is not None:
threshold_list.append(round(best_threshold, 4))
# построим PR-кривую
precision, recall, thresholds = precision_recall_curve(
data_list[3], predictions[:, 1]
)
plt.figure(figsize=(10, 10))
plt.step(recall, precision, where='post')
plt.xlabel('Recall')
plt.ylabel('Precision')
plt.ylim([0.0, 1.05])
plt.xlim([0.0, 1.0])
plt.title('PR-кривая')
# построим ROC-кривую
fpr, tpr, thresholds = roc_curve(data_list[3], predictions[:, 1])
plt.figure(figsize=(10, 10))
plt.plot(fpr, tpr, linestyle='-')
plt.plot([0, 1], [0, 1], linestyle='--')
plt.xlim([0.0, 1.0])
plt.ylim([0.0, 1.0])
plt.xlabel('False Positive Rate')
plt.ylabel('True Positive Rate')
plt.title('ROC-кривая')
plt.show()
# подготовка списка для оценок f1
pure_threshold_score = []
raw_threshold_score = []
total_threshold_score = [pure_threshold_score, raw_threshold_score]
# подготовка списка для оценок ROC-кривых
pure_auc_roc = []
raw_auc_roc = []
total_auc_roc = [pure_auc_roc, raw_auc_roc]
%%time
for i in range(0,2):
if i == 0:
print('\033[1m' + 'I. ПОКАЗАТЕЛИ ЧИСТЫХ МОДЕЛЕЙ ПО ОЧИЩЕННОЙ THRESHOLDED-ДАТЕ БЕЗ ВЫБРОСОВ' + '\033[0m')
else:
print('\033[1m' + 'II. ПОКАЗАТЕЛИ ЧИСТЫХ МОДЕЛЕЙ ПО ГРЯЗНОЙ THRESHOLDED-ДАТЕ С ВЫБРОСАМИ' + '\033[0m')
for inx, pipe in enumerate(model_pipe_list):
ml_threshold_slave(
pipe, total_data_list[i],
total_threshold_score[i],
total_auc_roc[i],
model_names[inx]
)
I. ПОКАЗАТЕЛИ ЧИСТЫХ МОДЕЛЕЙ ПО ОЧИЩЕННОЙ THRESHOLDED-ДАТЕ БЕЗ ВЫБРОСОВ
Статистика модели LogisticRegression
Порог = 0.00 | Точность = 0.207, Полнота = 1.000 | F1-мера = 0.344
Порог = 0.05 | Точность = 0.268, Полнота = 0.938 | F1-мера = 0.417
Порог = 0.10 | Точность = 0.347, Полнота = 0.892 | F1-мера = 0.500
Порог = 0.15 | Точность = 0.413, Полнота = 0.823 | F1-мера = 0.550
Порог = 0.20 | Точность = 0.480, Полнота = 0.757 | F1-мера = 0.588
Порог = 0.25 | Точность = 0.530, Полнота = 0.690 | F1-мера = 0.599
Порог = 0.30 | Точность = 0.578, Полнота = 0.632 | F1-мера = 0.604
Порог = 0.35 | Точность = 0.636, Полнота = 0.598 | F1-мера = 0.616
Порог = 0.40 | Точность = 0.671, Полнота = 0.545 | F1-мера = 0.601
Порог = 0.45 | Точность = 0.698, Полнота = 0.515 | F1-мера = 0.593
Порог = 0.50 | Точность = 0.743, Полнота = 0.455 | F1-мера = 0.564
Порог = 0.55 | Точность = 0.776, Полнота = 0.407 | F1-мера = 0.534
Порог = 0.60 | Точность = 0.820, Полнота = 0.375 | F1-мера = 0.515
Порог = 0.65 | Точность = 0.870, Полнота = 0.335 | F1-мера = 0.484
Порог = 0.70 | Точность = 0.907, Полнота = 0.292 | F1-мера = 0.442
Порог = 0.75 | Точность = 0.929, Полнота = 0.230 | F1-мера = 0.369
Порог = 0.80 | Точность = 0.945, Полнота = 0.172 | F1-мера = 0.292
Порог = 0.85 | Точность = 0.961, Полнота = 0.122 | F1-мера = 0.217
Порог = 0.90 | Точность = 1.000, Полнота = 0.087 | F1-мера = 0.161
Оценки модели LogisticRegression
F1: 0.616
AUC: 0.8444731675392672
Лучшее значение порога: 0.35
=============================================
Статистика модели DecisionTreeClassifier
Порог = 0.00 | Точность = 0.519, Полнота = 0.525 | F1-мера = 0.522
Порог = 0.05 | Точность = 0.519, Полнота = 0.525 | F1-мера = 0.522
Порог = 0.10 | Точность = 0.519, Полнота = 0.525 | F1-мера = 0.522
Порог = 0.15 | Точность = 0.519, Полнота = 0.525 | F1-мера = 0.522
Порог = 0.20 | Точность = 0.519, Полнота = 0.525 | F1-мера = 0.522
Порог = 0.25 | Точность = 0.519, Полнота = 0.525 | F1-мера = 0.522
Порог = 0.30 | Точность = 0.519, Полнота = 0.525 | F1-мера = 0.522
Порог = 0.35 | Точность = 0.519, Полнота = 0.525 | F1-мера = 0.522
Порог = 0.40 | Точность = 0.519, Полнота = 0.525 | F1-мера = 0.522
Порог = 0.45 | Точность = 0.519, Полнота = 0.525 | F1-мера = 0.522
Порог = 0.50 | Точность = 0.519, Полнота = 0.525 | F1-мера = 0.522
Порог = 0.55 | Точность = 0.519, Полнота = 0.525 | F1-мера = 0.522
Порог = 0.60 | Точность = 0.519, Полнота = 0.525 | F1-мера = 0.522
Порог = 0.65 | Точность = 0.519, Полнота = 0.525 | F1-мера = 0.522
Порог = 0.70 | Точность = 0.519, Полнота = 0.525 | F1-мера = 0.522
Порог = 0.75 | Точность = 0.519, Полнота = 0.525 | F1-мера = 0.522
Порог = 0.80 | Точность = 0.519, Полнота = 0.525 | F1-мера = 0.522
Порог = 0.85 | Точность = 0.519, Полнота = 0.525 | F1-мера = 0.522
Порог = 0.90 | Точность = 0.519, Полнота = 0.525 | F1-мера = 0.522
Оценки модели DecisionTreeClassifier
F1: 0.5217
AUC: 0.6986910994764397
Лучшее значение порога: 0.0
=============================================
Статистика модели RandomForestClassifier
Порог = 0.00 | Точность = 0.226, Полнота = 0.985 | F1-мера = 0.368
Порог = 0.05 | Точность = 0.297, Полнота = 0.920 | F1-мера = 0.449
Порог = 0.10 | Точность = 0.358, Полнота = 0.858 | F1-мера = 0.506
Порог = 0.15 | Точность = 0.421, Полнота = 0.797 | F1-мера = 0.551
Порог = 0.20 | Точность = 0.486, Полнота = 0.750 | F1-мера = 0.590
Порог = 0.25 | Точность = 0.554, Полнота = 0.705 | F1-мера = 0.620
Порог = 0.30 | Точность = 0.610, Полнота = 0.665 | F1-мера = 0.636
Порог = 0.35 | Точность = 0.661, Полнота = 0.620 | F1-мера = 0.640
Порог = 0.40 | Точность = 0.717, Полнота = 0.570 | F1-мера = 0.635
Порог = 0.45 | Точность = 0.755, Полнота = 0.517 | F1-мера = 0.614
Порог = 0.50 | Точность = 0.779, Полнота = 0.492 | F1-мера = 0.603
Порог = 0.55 | Точность = 0.815, Полнота = 0.463 | F1-мера = 0.590
Порог = 0.60 | Точность = 0.847, Полнота = 0.430 | F1-мера = 0.570
Порог = 0.65 | Точность = 0.875, Полнота = 0.403 | F1-мера = 0.551
Порог = 0.70 | Точность = 0.894, Полнота = 0.357 | F1-мера = 0.511
Порог = 0.75 | Точность = 0.892, Полнота = 0.310 | F1-мера = 0.460
Порог = 0.80 | Точность = 0.929, Полнота = 0.260 | F1-мера = 0.406
Порог = 0.85 | Точность = 0.950, Полнота = 0.190 | F1-мера = 0.317
Порог = 0.90 | Точность = 0.951, Полнота = 0.098 | F1-мера = 0.177
Оценки модели RandomForestClassifier
F1: 0.64
AUC: 0.8503075916230366
Лучшее значение порога: 0.35
=============================================
II. ПОКАЗАТЕЛИ ЧИСТЫХ МОДЕЛЕЙ ПО ГРЯЗНОЙ THRESHOLDED-ДАТЕ С ВЫБРОСАМИ
Статистика модели LogisticRegression
Порог = 0.00 | Точность = 0.206, Полнота = 1.000 | F1-мера = 0.342
Порог = 0.05 | Точность = 0.259, Полнота = 0.978 | F1-мера = 0.410
Порог = 0.10 | Точность = 0.327, Полнота = 0.893 | F1-мера = 0.479
Порог = 0.15 | Точность = 0.392, Полнота = 0.838 | F1-мера = 0.534
Порог = 0.20 | Точность = 0.443, Полнота = 0.775 | F1-мера = 0.563
Порог = 0.25 | Точность = 0.501, Полнота = 0.705 | F1-мера = 0.586
Порог = 0.30 | Точность = 0.563, Полнота = 0.642 | F1-мера = 0.600
Порог = 0.35 | Точность = 0.593, Полнота = 0.571 | F1-мера = 0.582
Порог = 0.40 | Точность = 0.642, Полнота = 0.525 | F1-мера = 0.578
Порог = 0.45 | Точность = 0.679, Полнота = 0.446 | F1-мера = 0.538
Порог = 0.50 | Точность = 0.725, Полнота = 0.402 | F1-мера = 0.517
Порог = 0.55 | Точность = 0.768, Полнота = 0.329 | F1-мера = 0.461
Порог = 0.60 | Точность = 0.815, Полнота = 0.288 | F1-мера = 0.426
Порог = 0.65 | Точность = 0.838, Полнота = 0.237 | F1-мера = 0.370
Порог = 0.70 | Точность = 0.898, Полнота = 0.191 | F1-мера = 0.315
Порог = 0.75 | Точность = 0.877, Полнота = 0.155 | F1-мера = 0.263
Порог = 0.80 | Точность = 0.905, Полнота = 0.138 | F1-мера = 0.239
Порог = 0.85 | Точность = 0.941, Полнота = 0.116 | F1-мера = 0.207
Порог = 0.90 | Точность = 0.971, Полнота = 0.082 | F1-мера = 0.152
Оценки модели LogisticRegression
F1: 0.5995
AUC: 0.8429964405101378
Лучшее значение порога: 0.3
=============================================
Статистика модели DecisionTreeClassifier
Порог = 0.00 | Точность = 0.495, Полнота = 0.508 | F1-мера = 0.502
Порог = 0.05 | Точность = 0.495, Полнота = 0.508 | F1-мера = 0.502
Порог = 0.10 | Точность = 0.495, Полнота = 0.508 | F1-мера = 0.502
Порог = 0.15 | Точность = 0.495, Полнота = 0.508 | F1-мера = 0.502
Порог = 0.20 | Точность = 0.495, Полнота = 0.508 | F1-мера = 0.502
Порог = 0.25 | Точность = 0.495, Полнота = 0.508 | F1-мера = 0.502
Порог = 0.30 | Точность = 0.495, Полнота = 0.508 | F1-мера = 0.502
Порог = 0.35 | Точность = 0.495, Полнота = 0.508 | F1-мера = 0.502
Порог = 0.40 | Точность = 0.495, Полнота = 0.508 | F1-мера = 0.502
Порог = 0.45 | Точность = 0.495, Полнота = 0.508 | F1-мера = 0.502
Порог = 0.50 | Точность = 0.495, Полнота = 0.508 | F1-мера = 0.502
Порог = 0.55 | Точность = 0.495, Полнота = 0.508 | F1-мера = 0.502
Порог = 0.60 | Точность = 0.495, Полнота = 0.508 | F1-мера = 0.502
Порог = 0.65 | Точность = 0.495, Полнота = 0.508 | F1-мера = 0.502
Порог = 0.70 | Точность = 0.495, Полнота = 0.508 | F1-мера = 0.502
Порог = 0.75 | Точность = 0.495, Полнота = 0.508 | F1-мера = 0.502
Порог = 0.80 | Точность = 0.495, Полнота = 0.508 | F1-мера = 0.502
Порог = 0.85 | Точность = 0.495, Полнота = 0.508 | F1-мера = 0.502
Порог = 0.90 | Точность = 0.495, Полнота = 0.508 | F1-мера = 0.502
Оценки модели DecisionTreeClassifier
F1: 0.5018
AUC: 0.6868144778016297
Лучшее значение порога: 0.0
=============================================
Статистика модели RandomForestClassifier
Порог = 0.00 | Точность = 0.221, Полнота = 0.998 | F1-мера = 0.362
Порог = 0.05 | Точность = 0.295, Полнота = 0.949 | F1-мера = 0.451
Порог = 0.10 | Точность = 0.351, Полнота = 0.889 | F1-мера = 0.503
Порог = 0.15 | Точность = 0.409, Полнота = 0.828 | F1-мера = 0.548
Порог = 0.20 | Точность = 0.460, Полнота = 0.770 | F1-мера = 0.576
Порог = 0.25 | Точность = 0.517, Полнота = 0.719 | F1-мера = 0.601
Порог = 0.30 | Точность = 0.566, Полнота = 0.683 | F1-мера = 0.619
Порог = 0.35 | Точность = 0.611, Полнота = 0.625 | F1-мера = 0.618
Порог = 0.40 | Точность = 0.646, Полнота = 0.569 | F1-мера = 0.605
Порог = 0.45 | Точность = 0.706, Полнота = 0.530 | F1-мера = 0.606
Порог = 0.50 | Точность = 0.748, Полнота = 0.482 | F1-мера = 0.586
Порог = 0.55 | Точность = 0.798, Полнота = 0.431 | F1-мера = 0.560
Порог = 0.60 | Точность = 0.836, Полнота = 0.407 | F1-мера = 0.547
Порог = 0.65 | Точность = 0.844, Полнота = 0.380 | F1-мера = 0.524
Порог = 0.70 | Точность = 0.889, Полнота = 0.349 | F1-мера = 0.501
Порог = 0.75 | Точность = 0.897, Полнота = 0.274 | F1-мера = 0.419
Порог = 0.80 | Точность = 0.911, Полнота = 0.223 | F1-мера = 0.358
Порог = 0.85 | Точность = 0.938, Полнота = 0.148 | F1-мера = 0.255
Порог = 0.90 | Точность = 0.926, Полнота = 0.061 | F1-мера = 0.114
Оценки модели RandomForestClassifier
F1: 0.6191
AUC: 0.8554554178853303
Лучшее значение порога: 0.3
=============================================
Wall time: 5.4 s
# сформируем сводную таблицу
score_table = pd.DataFrame(
{'model': model_names,
'pure_f1': total_pipe_score[0], 'raw_f1': total_pipe_score[1],
'pure_downsampled_score': downasmpled_pipe_score[0],
'raw_downsampled_score': downasmpled_pipe_score[1],
'pure_threshold_score': total_threshold_score[0],
'raw_threshold_score': total_threshold_score[1],
'pure_auc_roc': total_auc_roc[0],
'raw_auc_roc': total_auc_roc[1]
}
)
pd.set_option('max_colwidth', 400)
score_table
score_table.max()
# сетка параметров для LogisticRegression
lr_param_grid = [
{'lr__class_weight': [None, 'balanced'],
'lr__C': [0.5, 1.0, 1.5, 2.0]}
]
# сетка параметров для DecisionTreeClassifier
dtc_param_grid = [
{'dtc__max_depth': range(1, 10),
'dtc__criterion': ['gini', 'entropy'],
'dtc__splitter': ['random', 'best'],
'dtc__min_samples_leaf': range(1, 10),
'dtc__class_weight': [None, 'balanced']}
]
# сетка параметров для RandomForestClassifier
rfc_param_grid = [
{'rfc__n_estimators': range(50, 200, 50),
'rfc__criterion': ['gini', 'entropy'],
'rfc__min_samples_split': range(2, 10),
'rfc__min_samples_leaf': range(1, 10, 3),
'rfc__class_weight': [None, 'balanced']}
]
# список сеток
param_grid_list = [lr_param_grid, dtc_param_grid, rfc_param_grid]
tune_pure_score = []
tune_raw_score = []
total_tune_score = [tune_pure_score, tune_raw_score]
lr_params = []
dtc_params = []
rfc_params = []
raw_lr_params = {}
raw_dtc_params = {}
raw_rfc_params = {}
best_params_list = [lr_params, dtc_params, rfc_params]
raw_best_params_list = [raw_lr_params, raw_dtc_params, raw_rfc_params]
total_params_list = [best_params_list, raw_best_params_list]
%%time
for i in range(0,2):
if i == 0:
print('\033[1m' + 'I. ПОКАЗАТЕЛИ НАСТРОЕННЫХ МОДЕЛЕЙ ПО ОЧИЩЕННОЙ ДАТЕ БЕЗ ВЫБРОСОВ' + '\033[0m')
else:
print('\033[1m' + 'II. ПОКАЗАТЕЛИ НАСТРОЕННЫХ МОДЕЛЕЙ ПО ГРЯЗНОЙ ДАТЕ С ВЫБРОСАМИ' + '\033[0m')
for inx in range(0, 3):
grid_pipeline = GridSearchCV(
model_pipe_list[inx],
param_grid_list[inx],
cv=5, scoring='f1',
return_train_score=True,
verbose=1)
ml_slave(
grid_pipeline, total_data_list[i],
total_tune_score[i], model_names[inx], best_params_list[inx]
)
I. ПОКАЗАТЕЛИ НАСТРОЕННЫХ МОДЕЛЕЙ ПО ОЧИЩЕННОЙ ДАТЕ БЕЗ ВЫБРОСОВ
Fitting 5 folds for each of 8 candidates, totalling 40 fits
F1-score модели LogisticRegression: 0.5786
Оценка достигнута при параметрах: {'lr__C': 1.0, 'lr__class_weight': 'balanced'}
=============================================
Fitting 5 folds for each of 648 candidates, totalling 3240 fits
F1-score модели DecisionTreeClassifier: 0.5961
Оценка достигнута при параметрах: {'dtc__class_weight': 'balanced', 'dtc__criterion': 'entropy', 'dtc__max_depth': 7, 'dtc__min_samples_leaf': 4, 'dtc__splitter': 'random'}
=============================================
Fitting 5 folds for each of 288 candidates, totalling 1440 fits
F1-score модели RandomForestClassifier: 0.6292
Оценка достигнута при параметрах: {'rfc__class_weight': 'balanced', 'rfc__criterion': 'entropy', 'rfc__min_samples_leaf': 7, 'rfc__min_samples_split': 2, 'rfc__n_estimators': 150}
=============================================
II. ПОКАЗАТЕЛИ НАСТРОЕННЫХ МОДЕЛЕЙ ПО ГРЯЗНОЙ ДАТЕ С ВЫБРОСАМИ
Fitting 5 folds for each of 8 candidates, totalling 40 fits
F1-score модели LogisticRegression: 0.5678
Оценка достигнута при параметрах: {'lr__C': 1.0, 'lr__class_weight': 'balanced'}
=============================================
Fitting 5 folds for each of 648 candidates, totalling 3240 fits
F1-score модели DecisionTreeClassifier: 0.5977
Оценка достигнута при параметрах: {'dtc__class_weight': 'balanced', 'dtc__criterion': 'entropy', 'dtc__max_depth': 7, 'dtc__min_samples_leaf': 4, 'dtc__splitter': 'random'}
=============================================
Fitting 5 folds for each of 288 candidates, totalling 1440 fits
F1-score модели RandomForestClassifier: 0.6296
Оценка достигнута при параметрах: {'rfc__class_weight': 'balanced', 'rfc__criterion': 'entropy', 'rfc__min_samples_leaf': 7, 'rfc__min_samples_split': 2, 'rfc__n_estimators': 150}
=============================================
Wall time: 37min 20s
# определим модели с лучшими параметрами
lr_model = lr_pipeline.set_params(**best_params_list[0][0])
dtc_model = dtc_pipeline.set_params(**best_params_list[1][0])
rfc_model = rfc_pipeline.set_params(**best_params_list[2][0])
tune_model_list = [lr_model, dtc_model, rfc_model]
tune_pure_score_thresh = []
tune_raw_score_thresh = []
total_threshold_score = [tune_pure_score_thresh, tune_raw_score_thresh]
pure_threshold_number = []
raw_threshold_number = []
threshold_number = [pure_threshold_number, raw_threshold_number]
%%time
for i in range(0,2):
if i == 0:
print('\033[1m' + 'I. ПОКАЗАТЕЛИ НАСТРОЕННЫХ МОДЕЛЕЙ ПО ОЧИЩЕННОЙ THRESHOLDED-ДАТЕ БЕЗ ВЫБРОСОВ' + '\033[0m')
else:
print('\033[1m' + 'II. ПОКАЗАТЕЛИ НАСТРОЕННЫХ МОДЕЛЕЙ ПО ГРЯЗНОЙ THRESHOLDED-ДАТЕ С ВЫБРОСАМИ' + '\033[0m')
for inx, pipe in enumerate(tune_model_list):
ml_threshold_slave(
pipe,
total_data_list[i],
total_threshold_score[i],
total_auc_roc[i],
model_names[inx],
threshold_number[i]
)
I. ПОКАЗАТЕЛИ НАСТРОЕННЫХ МОДЕЛЕЙ ПО ОЧИЩЕННОЙ THRESHOLDED-ДАТЕ БЕЗ ВЫБРОСОВ
Статистика модели LogisticRegression
Порог = 0.00 | Точность = 0.207, Полнота = 1.000 | F1-мера = 0.344
Порог = 0.05 | Точность = 0.218, Полнота = 0.993 | F1-мера = 0.357
Порог = 0.10 | Точность = 0.237, Полнота = 0.973 | F1-мера = 0.381
Порог = 0.15 | Точность = 0.259, Полнота = 0.955 | F1-мера = 0.407
Порог = 0.20 | Точность = 0.280, Полнота = 0.930 | F1-мера = 0.431
Порог = 0.25 | Точность = 0.308, Полнота = 0.917 | F1-мера = 0.461
Порог = 0.30 | Точность = 0.338, Полнота = 0.892 | F1-мера = 0.490
Порог = 0.35 | Точность = 0.370, Полнота = 0.858 | F1-мера = 0.517
Порог = 0.40 | Точность = 0.400, Полнота = 0.830 | F1-мера = 0.540
Порог = 0.45 | Точность = 0.435, Полнота = 0.785 | F1-мера = 0.560
Порог = 0.50 | Точность = 0.473, Полнота = 0.745 | F1-мера = 0.579
Порог = 0.55 | Точность = 0.512, Полнота = 0.713 | F1-мера = 0.596
Порог = 0.60 | Точность = 0.544, Полнота = 0.665 | F1-мера = 0.598
Порог = 0.65 | Точность = 0.600, Полнота = 0.620 | F1-мера = 0.610
Порог = 0.70 | Точность = 0.633, Полнота = 0.570 | F1-мера = 0.600
Порог = 0.75 | Точность = 0.691, Полнота = 0.525 | F1-мера = 0.597
Порог = 0.80 | Точность = 0.739, Полнота = 0.445 | F1-мера = 0.555
Порог = 0.85 | Точность = 0.812, Полнота = 0.378 | F1-мера = 0.515
Порог = 0.90 | Точность = 0.904, Полнота = 0.282 | F1-мера = 0.430
Оценки модели LogisticRegression
F1: 0.6101
AUC: 0.8431102748691102
Лучшее значение порога: 0.65
=============================================
Статистика модели DecisionTreeClassifier
Порог = 0.00 | Точность = 0.216, Полнота = 0.970 | F1-мера = 0.353
Порог = 0.05 | Точность = 0.227, Полнота = 0.953 | F1-мера = 0.367
Порог = 0.10 | Точность = 0.267, Полнота = 0.935 | F1-мера = 0.415
Порог = 0.15 | Точность = 0.284, Полнота = 0.922 | F1-мера = 0.434
Порог = 0.20 | Точность = 0.293, Полнота = 0.917 | F1-мера = 0.444
Порог = 0.25 | Точность = 0.312, Полнота = 0.897 | F1-мера = 0.463
Порог = 0.30 | Точность = 0.355, Полнота = 0.865 | F1-мера = 0.504
Порог = 0.35 | Точность = 0.388, Полнота = 0.848 | F1-мера = 0.533
Порог = 0.40 | Точность = 0.412, Полнота = 0.825 | F1-мера = 0.550
Порог = 0.45 | Точность = 0.467, Полнота = 0.752 | F1-мера = 0.576
Порог = 0.50 | Точность = 0.510, Полнота = 0.718 | F1-мера = 0.596
Порог = 0.55 | Точность = 0.516, Полнота = 0.713 | F1-мера = 0.599
Порог = 0.60 | Точность = 0.531, Полнота = 0.698 | F1-мера = 0.603
Порог = 0.65 | Точность = 0.589, Полнота = 0.578 | F1-мера = 0.583
Порог = 0.70 | Точность = 0.604, Полнота = 0.560 | F1-мера = 0.581
Порог = 0.75 | Точность = 0.701, Полнота = 0.470 | F1-мера = 0.563
Порог = 0.80 | Точность = 0.738, Полнота = 0.465 | F1-мера = 0.571
Порог = 0.85 | Точность = 0.857, Полнота = 0.390 | F1-мера = 0.536
Порог = 0.90 | Точность = 0.887, Полнота = 0.352 | F1-мера = 0.504
Оценки модели DecisionTreeClassifier
F1: 0.6032
AUC: 0.8331593586387435
Лучшее значение порога: 0.6
=============================================
Статистика модели RandomForestClassifier
Порог = 0.00 | Точность = 0.207, Полнота = 1.000 | F1-мера = 0.344
Порог = 0.05 | Точность = 0.228, Полнота = 0.988 | F1-мера = 0.370
Порог = 0.10 | Точность = 0.259, Полнота = 0.963 | F1-мера = 0.408
Порог = 0.15 | Точность = 0.295, Полнота = 0.940 | F1-мера = 0.449
Порог = 0.20 | Точность = 0.334, Полнота = 0.902 | F1-мера = 0.487
Порог = 0.25 | Точность = 0.371, Полнота = 0.875 | F1-мера = 0.521
Порог = 0.30 | Точность = 0.410, Полнота = 0.835 | F1-мера = 0.550
Порог = 0.35 | Точность = 0.456, Полнота = 0.797 | F1-мера = 0.580
Порог = 0.40 | Точность = 0.508, Полнота = 0.755 | F1-мера = 0.607
Порог = 0.45 | Точность = 0.558, Полнота = 0.700 | F1-мера = 0.621
Порог = 0.50 | Точность = 0.603, Полнота = 0.657 | F1-мера = 0.629
Порог = 0.55 | Точность = 0.634, Полнота = 0.615 | F1-мера = 0.624
Порог = 0.60 | Точность = 0.687, Полнота = 0.570 | F1-мера = 0.623
Порог = 0.65 | Точность = 0.729, Полнота = 0.517 | F1-мера = 0.605
Порог = 0.70 | Точность = 0.777, Полнота = 0.480 | F1-мера = 0.594
Порог = 0.75 | Точность = 0.832, Полнота = 0.420 | F1-мера = 0.558
Порог = 0.80 | Точность = 0.870, Полнота = 0.352 | F1-мера = 0.502
Порог = 0.85 | Точность = 0.898, Полнота = 0.285 | F1-мера = 0.433
Порог = 0.90 | Точность = 0.910, Полнота = 0.177 | F1-мера = 0.297
Оценки модели RandomForestClassifier
F1: 0.6292
AUC: 0.8564520615183246
Лучшее значение порога: 0.5
=============================================
II. ПОКАЗАТЕЛИ НАСТРОЕННЫХ МОДЕЛЕЙ ПО ГРЯЗНОЙ THRESHOLDED-ДАТЕ С ВЫБРОСАМИ
Статистика модели LogisticRegression
Порог = 0.00 | Точность = 0.206, Полнота = 1.000 | F1-мера = 0.342
Порог = 0.05 | Точность = 0.211, Полнота = 0.998 | F1-мера = 0.349
Порог = 0.10 | Точность = 0.230, Полнота = 0.990 | F1-мера = 0.373
Порог = 0.15 | Точность = 0.252, Полнота = 0.981 | F1-мера = 0.401
Порог = 0.20 | Точность = 0.279, Полнота = 0.969 | F1-мера = 0.433
Порог = 0.25 | Точность = 0.308, Полнота = 0.944 | F1-мера = 0.464
Порог = 0.30 | Точность = 0.328, Полнота = 0.901 | F1-мера = 0.481
Порог = 0.35 | Точность = 0.358, Полнота = 0.867 | F1-мера = 0.506
Порог = 0.40 | Точность = 0.385, Полнота = 0.838 | F1-мера = 0.528
Порог = 0.45 | Точность = 0.410, Полнота = 0.799 | F1-мера = 0.542
Порог = 0.50 | Точность = 0.451, Полнота = 0.765 | F1-мера = 0.568
Порог = 0.55 | Точность = 0.496, Полнота = 0.719 | F1-мера = 0.587
Порог = 0.60 | Точность = 0.537, Полнота = 0.661 | F1-мера = 0.593
Порог = 0.65 | Точность = 0.581, Полнота = 0.600 | F1-мера = 0.590
Порог = 0.70 | Точность = 0.621, Полнота = 0.547 | F1-мера = 0.582
Порог = 0.75 | Точность = 0.662, Полнота = 0.465 | F1-мера = 0.546
Порог = 0.80 | Точность = 0.712, Полнота = 0.378 | F1-мера = 0.494
Порог = 0.85 | Точность = 0.788, Полнота = 0.288 | F1-мера = 0.422
Порог = 0.90 | Точность = 0.848, Полнота = 0.189 | F1-мера = 0.309
Оценки модели LogisticRegression
F1: 0.5928
AUC: 0.8424517607497968
Лучшее значение порога: 0.6
=============================================
Статистика модели DecisionTreeClassifier
Порог = 0.00 | Точность = 0.237, Полнота = 0.964 | F1-мера = 0.381
Порог = 0.05 | Точность = 0.240, Полнота = 0.959 | F1-мера = 0.384
Порог = 0.10 | Точность = 0.256, Полнота = 0.956 | F1-мера = 0.404
Порог = 0.15 | Точность = 0.269, Полнота = 0.937 | F1-мера = 0.418
Порог = 0.20 | Точность = 0.283, Полнота = 0.927 | F1-мера = 0.434
Порог = 0.25 | Точность = 0.289, Полнота = 0.925 | F1-мера = 0.440
Порог = 0.30 | Точность = 0.296, Полнота = 0.913 | F1-мера = 0.447
Порог = 0.35 | Точность = 0.347, Полнота = 0.867 | F1-мера = 0.496
Порог = 0.40 | Точность = 0.354, Полнота = 0.860 | F1-мера = 0.501
Порог = 0.45 | Точность = 0.364, Полнота = 0.814 | F1-мера = 0.503
Порог = 0.50 | Точность = 0.456, Полнота = 0.678 | F1-мера = 0.545
Порог = 0.55 | Точность = 0.604, Полнота = 0.584 | F1-мера = 0.594
Порог = 0.60 | Точность = 0.607, Полнота = 0.584 | F1-мера = 0.595
Порог = 0.65 | Точность = 0.602, Полнота = 0.571 | F1-мера = 0.586
Порог = 0.70 | Точность = 0.618, Полнота = 0.564 | F1-мера = 0.590
Порог = 0.75 | Точность = 0.651, Полнота = 0.528 | F1-мера = 0.583
Порог = 0.80 | Точность = 0.811, Полнота = 0.385 | F1-мера = 0.522
Порог = 0.85 | Точность = 0.842, Полнота = 0.375 | F1-мера = 0.519
Порог = 0.90 | Точность = 0.887, Полнота = 0.286 | F1-мера = 0.432
Оценки модели DecisionTreeClassifier
F1: 0.5951
AUC: 0.8212847729204142
Лучшее значение порога: 0.6
=============================================
Статистика модели RandomForestClassifier
Порог = 0.00 | Точность = 0.206, Полнота = 1.000 | F1-мера = 0.342
Порог = 0.05 | Точность = 0.228, Полнота = 0.995 | F1-мера = 0.371
Порог = 0.10 | Точность = 0.263, Полнота = 0.985 | F1-мера = 0.415
Порог = 0.15 | Точность = 0.296, Полнота = 0.961 | F1-мера = 0.452
Порог = 0.20 | Точность = 0.337, Полнота = 0.930 | F1-мера = 0.495
Порог = 0.25 | Точность = 0.377, Полнота = 0.889 | F1-мера = 0.529
Порог = 0.30 | Точность = 0.408, Полнота = 0.840 | F1-мера = 0.549
Порог = 0.35 | Точность = 0.447, Полнота = 0.818 | F1-мера = 0.578
Порог = 0.40 | Точность = 0.497, Полнота = 0.782 | F1-мера = 0.608
Порог = 0.45 | Точность = 0.532, Полнота = 0.726 | F1-мера = 0.614
Порог = 0.50 | Точность = 0.583, Полнота = 0.690 | F1-мера = 0.632
Порог = 0.55 | Точность = 0.629, Полнота = 0.639 | F1-мера = 0.634
Порог = 0.60 | Точность = 0.668, Полнота = 0.596 | F1-мера = 0.630
Порог = 0.65 | Точность = 0.721, Полнота = 0.533 | F1-мера = 0.613
Порог = 0.70 | Точность = 0.770, Полнота = 0.477 | F1-мера = 0.589
Порог = 0.75 | Точность = 0.805, Полнота = 0.409 | F1-мера = 0.543
Порог = 0.80 | Точность = 0.835, Полнота = 0.332 | F1-мера = 0.475
Порог = 0.85 | Точность = 0.886, Полнота = 0.264 | F1-мера = 0.407
Порог = 0.90 | Точность = 0.912, Полнота = 0.150 | F1-мера = 0.258
Оценки модели RandomForestClassifier
F1: 0.6339
AUC: 0.8683141322274962
Лучшее значение порога: 0.55
=============================================
Wall time: 4.39 s
# сформируем сводную таблицу
tune_score_table = pd.DataFrame(
{'model': model_names,
'pure_threshold_number': threshold_number[0],
'raw_threshold_number': threshold_number[1],
'pure_f1': total_pipe_score[0],
'raw_f1': total_pipe_score[1],
'pure_f1_tune_thresh': total_threshold_score[0],
'raw_f1_tune_thresh': total_threshold_score[1]
}
)
pd.set_option('max_colwidth', 400)
tune_score_table
# подготовим объединенный набор без выбросов
X_train_max = pd.concat((X_train, X_val))
y_train_max = np.concatenate((y_train, y_val))
# подготовим объединенный набор с выбросами
X_train_max_raw = pd.concat((X_train_raw, X_val_raw))
y_train_max_raw = np.concatenate((y_train_raw, y_val_raw))
# определим списки для функции
pure_data_max_list = [X_train_max, y_train_max, X_test, y_test]
raw_data_max_list = [X_train_max_raw, y_train_max_raw, X_test_raw, y_test_raw]
pure_raw_max_data = [pure_data_max_list, raw_data_max_list]
# подготовка списка для оценок f1
test_pure_threshold_score = []
test_raw_threshold_score = []
test_total_threshold_score = [test_pure_threshold_score, test_raw_threshold_score]
# подготовка списка для оценок ROC-кривых
test_pure_auc_roc = []
test_raw_auc_roc = []
test_total_auc_roc = [test_pure_auc_roc, test_raw_auc_roc]
test_pure_threshold_number = []
test_raw_threshold_number = []
test_threshold_number = [test_pure_threshold_number, test_raw_threshold_number]
%%time
for i in range(0,2):
if i == 0:
print('\033[1m' + 'I. ПОКАЗАТЕЛИ ЧИСТЫХ МОДЕЛЕЙ ПО ОЧИЩЕННОЙ THRESHOLDED-ДАТЕ БЕЗ ВЫБРОСОВ' + '\033[0m')
else:
print('\033[1m' + 'II. ПОКАЗАТЕЛИ ЧИСТЫХ МОДЕЛЕЙ ПО ГРЯЗНОЙ THRESHOLDED-ДАТЕ С ВЫБРОСАМИ' + '\033[0m')
for inx, pipe in enumerate(tune_model_list):
ml_threshold_slave(
pipe,
pure_raw_max_data[i],
test_total_threshold_score[i],
test_total_auc_roc[i],
model_names[inx],
test_threshold_number[i]
)
I. ПОКАЗАТЕЛИ ЧИСТЫХ МОДЕЛЕЙ ПО ОЧИЩЕННОЙ THRESHOLDED-ДАТЕ БЕЗ ВЫБРОСОВ
Статистика модели LogisticRegression
Порог = 0.00 | Точность = 0.210, Полнота = 1.000 | F1-мера = 0.348
Порог = 0.05 | Точность = 0.220, Полнота = 0.995 | F1-мера = 0.361
Порог = 0.10 | Точность = 0.242, Полнота = 0.985 | F1-мера = 0.389
Порог = 0.15 | Точность = 0.268, Полнота = 0.970 | F1-мера = 0.420
Порог = 0.20 | Точность = 0.294, Полнота = 0.948 | F1-мера = 0.448
Порог = 0.25 | Точность = 0.323, Полнота = 0.929 | F1-мера = 0.479
Порог = 0.30 | Точность = 0.360, Полнота = 0.906 | F1-мера = 0.515
Порог = 0.35 | Точность = 0.385, Полнота = 0.874 | F1-мера = 0.535
Порог = 0.40 | Точность = 0.414, Полнота = 0.837 | F1-мера = 0.554
Порог = 0.45 | Точность = 0.446, Полнота = 0.798 | F1-мера = 0.572
Порог = 0.50 | Точность = 0.484, Полнота = 0.754 | F1-мера = 0.590
Порог = 0.55 | Точность = 0.527, Полнота = 0.714 | F1-мера = 0.607
Порог = 0.60 | Точность = 0.568, Полнота = 0.672 | F1-мера = 0.616
Порог = 0.65 | Точность = 0.613, Полнота = 0.613 | F1-мера = 0.613
Порог = 0.70 | Точность = 0.654, Полнота = 0.544 | F1-мера = 0.594
Порог = 0.75 | Точность = 0.698, Полнота = 0.490 | F1-мера = 0.576
Порог = 0.80 | Точность = 0.753, Полнота = 0.414 | F1-мера = 0.534
Порог = 0.85 | Точность = 0.786, Полнота = 0.298 | F1-мера = 0.432
Порог = 0.90 | Точность = 0.826, Полнота = 0.222 | F1-мера = 0.350
Оценки модели LogisticRegression
F1: 0.6156
AUC: 0.8522377728685604
Лучшее значение порога: 0.6
=============================================
Статистика модели DecisionTreeClassifier
Порог = 0.00 | Точность = 0.215, Полнота = 0.968 | F1-мера = 0.351
Порог = 0.05 | Точность = 0.246, Полнота = 0.953 | F1-мера = 0.391
Порог = 0.10 | Точность = 0.256, Полнота = 0.948 | F1-мера = 0.404
Порог = 0.15 | Точность = 0.291, Полнота = 0.941 | F1-мера = 0.445
Порог = 0.20 | Точность = 0.296, Полнота = 0.933 | F1-мера = 0.449
Порог = 0.25 | Точность = 0.331, Полнота = 0.879 | F1-мера = 0.481
Порог = 0.30 | Точность = 0.367, Полнота = 0.860 | F1-мера = 0.515
Порог = 0.35 | Точность = 0.376, Полнота = 0.855 | F1-мера = 0.523
Порог = 0.40 | Точность = 0.390, Полнота = 0.842 | F1-мера = 0.533
Порог = 0.45 | Точность = 0.494, Полнота = 0.722 | F1-мера = 0.587
Порог = 0.50 | Точность = 0.494, Полнота = 0.722 | F1-мера = 0.587
Порог = 0.55 | Точность = 0.532, Полнота = 0.653 | F1-мера = 0.586
Порог = 0.60 | Точность = 0.549, Полнота = 0.635 | F1-мера = 0.589
Порог = 0.65 | Точность = 0.601, Полнота = 0.599 | F1-мера = 0.600
Порог = 0.70 | Точность = 0.629, Полнота = 0.552 | F1-мера = 0.588
Порог = 0.75 | Точность = 0.693, Полнота = 0.468 | F1-мера = 0.559
Порог = 0.80 | Точность = 0.731, Полнота = 0.421 | F1-мера = 0.534
Порог = 0.85 | Точность = 0.748, Полнота = 0.394 | F1-мера = 0.516
Порог = 0.90 | Точность = 0.881, Полнота = 0.256 | F1-мера = 0.397
Оценки модели DecisionTreeClassifier
F1: 0.6
AUC: 0.8309856421568786
Лучшее значение порога: 0.65
=============================================
Статистика модели RandomForestClassifier
Порог = 0.00 | Точность = 0.210, Полнота = 1.000 | F1-мера = 0.348
Порог = 0.05 | Точность = 0.236, Полнота = 0.995 | F1-мера = 0.381
Порог = 0.10 | Точность = 0.273, Полнота = 0.983 | F1-мера = 0.427
Порог = 0.15 | Точность = 0.304, Полнота = 0.948 | F1-мера = 0.460
Порог = 0.20 | Точность = 0.343, Полнота = 0.914 | F1-мера = 0.498
Порог = 0.25 | Точность = 0.380, Полнота = 0.862 | F1-мера = 0.527
Порог = 0.30 | Точность = 0.422, Полнота = 0.818 | F1-мера = 0.557
Порог = 0.35 | Точность = 0.460, Полнота = 0.788 | F1-мера = 0.581
Порог = 0.40 | Точность = 0.501, Полнота = 0.766 | F1-мера = 0.606
Порог = 0.45 | Точность = 0.536, Полнота = 0.722 | F1-мера = 0.615
Порог = 0.50 | Точность = 0.582, Полнота = 0.663 | F1-мера = 0.620
Порог = 0.55 | Точность = 0.611, Полнота = 0.603 | F1-мера = 0.607
Порог = 0.60 | Точность = 0.646, Полнота = 0.567 | F1-мера = 0.604
Порог = 0.65 | Точность = 0.694, Полнота = 0.502 | F1-мера = 0.583
Порог = 0.70 | Точность = 0.725, Полнота = 0.456 | F1-мера = 0.560
Порог = 0.75 | Точность = 0.751, Полнота = 0.387 | F1-мера = 0.511
Порог = 0.80 | Точность = 0.817, Полнота = 0.330 | F1-мера = 0.470
Порог = 0.85 | Точность = 0.858, Полнота = 0.268 | F1-мера = 0.409
Порог = 0.90 | Точность = 0.902, Полнота = 0.182 | F1-мера = 0.303
Оценки модели RandomForestClassifier
F1: 0.6198
AUC: 0.8564717031785207
Лучшее значение порога: 0.5
=============================================
II. ПОКАЗАТЕЛИ ЧИСТЫХ МОДЕЛЕЙ ПО ГРЯЗНОЙ THRESHOLDED-ДАТЕ С ВЫБРОСАМИ
Статистика модели LogisticRegression
Порог = 0.00 | Точность = 0.197, Полнота = 1.000 | F1-мера = 0.328
Порог = 0.05 | Точность = 0.201, Полнота = 0.997 | F1-мера = 0.335
Порог = 0.10 | Точность = 0.218, Полнота = 0.987 | F1-мера = 0.357
Порог = 0.15 | Точность = 0.236, Полнота = 0.969 | F1-мера = 0.379
Порог = 0.20 | Точность = 0.259, Полнота = 0.952 | F1-мера = 0.408
Порог = 0.25 | Точность = 0.289, Полнота = 0.931 | F1-мера = 0.441
Порог = 0.30 | Точность = 0.320, Полнота = 0.911 | F1-мера = 0.474
Порог = 0.35 | Точность = 0.348, Полнота = 0.880 | F1-мера = 0.499
Порог = 0.40 | Точность = 0.374, Полнота = 0.850 | F1-мера = 0.519
Порог = 0.45 | Точность = 0.411, Полнота = 0.809 | F1-мера = 0.545
Порог = 0.50 | Точность = 0.445, Полнота = 0.766 | F1-мера = 0.563
Порог = 0.55 | Точность = 0.480, Полнота = 0.718 | F1-мера = 0.575
Порог = 0.60 | Точность = 0.517, Полнота = 0.659 | F1-мера = 0.579
Порог = 0.65 | Точность = 0.551, Полнота = 0.590 | F1-мера = 0.570
Порог = 0.70 | Точность = 0.595, Полнота = 0.527 | F1-мера = 0.559
Порог = 0.75 | Точность = 0.650, Полнота = 0.458 | F1-мера = 0.537
Порог = 0.80 | Точность = 0.678, Полнота = 0.349 | F1-мера = 0.461
Порог = 0.85 | Точность = 0.743, Полнота = 0.288 | F1-мера = 0.415
Порог = 0.90 | Точность = 0.818, Полнота = 0.206 | F1-мера = 0.329
Оценки модели LogisticRegression
F1: 0.5794
AUC: 0.8384358507863975
Лучшее значение порога: 0.6
=============================================
Статистика модели DecisionTreeClassifier
Порог = 0.00 | Точность = 0.209, Полнота = 0.977 | F1-мера = 0.345
Порог = 0.05 | Точность = 0.224, Полнота = 0.977 | F1-мера = 0.364
Порог = 0.10 | Точность = 0.232, Полнота = 0.969 | F1-мера = 0.374
Порог = 0.15 | Точность = 0.262, Полнота = 0.954 | F1-мера = 0.411
Порог = 0.20 | Точность = 0.297, Полнота = 0.926 | F1-мера = 0.450
Порог = 0.25 | Точность = 0.321, Полнота = 0.898 | F1-мера = 0.473
Порог = 0.30 | Точность = 0.346, Полнота = 0.868 | F1-мера = 0.495
Порог = 0.35 | Точность = 0.356, Полнота = 0.858 | F1-мера = 0.503
Порог = 0.40 | Точность = 0.370, Полнота = 0.850 | F1-мера = 0.516
Порог = 0.45 | Точность = 0.422, Полнота = 0.817 | F1-мера = 0.557
Порог = 0.50 | Точность = 0.447, Полнота = 0.802 | F1-мера = 0.574
Порог = 0.55 | Точность = 0.521, Полнота = 0.715 | F1-мера = 0.603
Порог = 0.60 | Точность = 0.567, Полнота = 0.623 | F1-мера = 0.594
Порог = 0.65 | Точность = 0.580, Полнота = 0.608 | F1-мера = 0.594
Порог = 0.70 | Точность = 0.588, Полнота = 0.595 | F1-мера = 0.592
Порог = 0.75 | Точность = 0.658, Полнота = 0.489 | F1-мера = 0.561
Порог = 0.80 | Точность = 0.707, Полнота = 0.412 | F1-мера = 0.521
Порог = 0.85 | Точность = 0.723, Полнота = 0.392 | F1-мера = 0.508
Порог = 0.90 | Точность = 0.803, Полнота = 0.280 | F1-мера = 0.415
Оценки модели DecisionTreeClassifier
F1: 0.603
AUC: 0.8441677710905374
Лучшее значение порога: 0.55
=============================================
Статистика модели RandomForestClassifier
Порог = 0.00 | Точность = 0.197, Полнота = 1.000 | F1-мера = 0.328
Порог = 0.05 | Точность = 0.218, Полнота = 0.997 | F1-мера = 0.358
Порог = 0.10 | Точность = 0.247, Полнота = 0.975 | F1-мера = 0.394
Порог = 0.15 | Точность = 0.285, Полнота = 0.952 | F1-мера = 0.439
Порог = 0.20 | Точность = 0.318, Полнота = 0.916 | F1-мера = 0.472
Порог = 0.25 | Точность = 0.349, Полнота = 0.873 | F1-мера = 0.498
Порог = 0.30 | Точность = 0.388, Полнота = 0.835 | F1-мера = 0.529
Порог = 0.35 | Точность = 0.425, Полнота = 0.799 | F1-мера = 0.555
Порог = 0.40 | Точность = 0.470, Полнота = 0.771 | F1-мера = 0.584
Порог = 0.45 | Точность = 0.516, Полнота = 0.735 | F1-мера = 0.607
Порог = 0.50 | Точность = 0.563, Полнота = 0.682 | F1-мера = 0.617
Порог = 0.55 | Точность = 0.600, Полнота = 0.631 | F1-мера = 0.615
Порог = 0.60 | Точность = 0.632, Полнота = 0.578 | F1-мера = 0.604
Порог = 0.65 | Точность = 0.706, Полнота = 0.527 | F1-мера = 0.603
Порог = 0.70 | Точность = 0.745, Полнота = 0.461 | F1-мера = 0.569
Порог = 0.75 | Точность = 0.795, Полнота = 0.415 | F1-мера = 0.545
Порог = 0.80 | Точность = 0.842, Полнота = 0.338 | F1-мера = 0.483
Порог = 0.85 | Точность = 0.881, Полнота = 0.244 | F1-мера = 0.382
Порог = 0.90 | Точность = 0.928, Полнота = 0.163 | F1-мера = 0.277
Оценки модели RandomForestClassifier
F1: 0.6168
AUC: 0.8604134899635976
Лучшее значение порога: 0.5
=============================================
Wall time: 4.96 s
# сформируем сводную таблицу
test_score_table = pd.DataFrame(
{'model': model_names,
'test_pure_f1': test_total_threshold_score[0],
'test_raw_f1': test_total_threshold_score[1],
'test_pure_auc_roc': test_total_auc_roc[0],
'test_raw_auc_roc': test_total_auc_roc[1],
'pure_threshold_number': test_threshold_number[0],
'raw_threshold_number': test_threshold_number[1]
}
)
pd.set_option('max_colwidth', 400)
test_score_table
display(score_table.style.set_caption('Оценки чистых моделей'))
display(tune_score_table.style.set_caption('Оценки настроенных моделей'))
test_score_table.style.set_caption('Оценки моделей на тестовой дате')
sns.set(rc={'figure.figsize':(11.7,8.27)})
feature_importance = tune_model_list[2].named_steps['rfc'].feature_importances_
feature_imp = pd.DataFrame(sorted(zip(feature_importance, features)), columns=['Value','Feature'])
sns.barplot(x="Value", y="Feature", data=feature_imp.sort_values(by="Value", ascending=False))
plt.title('Feature importance')
plt.tight_layout()
plt.show();