Автор материала: Виталий Радченко, Data scientist @ YouScan (@vradchenko в Slack ODS). Материал распространяется на условиях лицензии Creative Commons CC BY-NC-SA 4.0. Можно использовать в любых целях (редактировать, поправлять и брать за основу), кроме коммерческих, но с обязательным упоминанием автора материала
Веб-форма для ответов.
Но для разминки решите первое задание :)
Задание 1. В зале суда есть 5 присяжных, каждый из них по отдельности с вероятностью 70% может правильно определить, виновен подсудимый или нет. С какой вероятностью они все вместе вынесут правильный вердикт, если решение принимается большинством голосов?
Теперь перейдем непосредственно к машинному обучению.
%matplotlib inline
import matplotlib.pyplot as plt
import seaborn as sns
# отключим предупреждения Anaconda
import warnings
warnings.filterwarnings('ignore')
import pandas as pd
import numpy as np
## Сделаем функцию, которая будет заменять NaN значения на медиану в каждом столбце таблицы
def delete_nan(table):
for col in table.columns:
table[col]= table[col].fillna(table[col].median())
return table
## Считываем данные
data = pd.read_csv('../../data/credit_scoring_sample.csv', sep =';')
data.head()
## Рассмотрим типы считанных данных
data.dtypes
## Посмотрим на распределение классов в зависимой переменной
ax =data['SeriousDlqin2yrs'].hist(orientation='horizontal', color='red')
ax.set_xlabel("number_of_observations")
ax.set_ylabel("unique_value")
ax.set_title("Target distribution")
print('Distribution of target')
data['SeriousDlqin2yrs'].value_counts()/data.shape[0]
## Выберем названия всех признаков из таблицы, кроме прогнозируемого
independent_columns_names = data.columns.values
independent_columns_names = [x for x in data if x != 'SeriousDlqin2yrs']
independent_columns_names
## Применяем функцию, заменяющую все NaN значения на медианное значение соответствующего столбца
table =delete_nan(data)
## Разделяем таргет и признаки
X =table[independent_columns_names]
y = table['SeriousDlqin2yrs']
Задание 2. Сделайте интервальную оценку среднего возраста (age) для клиентов, которые просрочили выплату кредита, с 90% "уверенностью". Используйте пример из статьи, поставьте np.random.seed(0)
, как это сделано в статье.
### Ваш код должен быть здесь ###
from sklearn.linear_model import LogisticRegression
from sklearn.model_selection import GridSearchCV, StratifiedKFold
## Используем модуль LogisticRegression для построения логистической регрессии.
## Из-за несбалансированности классов в таргете добавляем параметр балансировки.
## Используем также параметр random_state=5 для воспроизводимости результатов
lr = LogisticRegression(random_state=5, class_weight= 'balanced')
## Попробуем подобрать лучший коэффициент регуляризации (коэффициент C в логистической регрессии) для модели лог.регрессии.
## Этот параметр необходим для того, чтобы подобрать оптимальную модель, которая не будет переобучена, с одной стороны,
## и будет хорошо предсказывать значения таргета, с другой.
## Остальные параметры оставляем по умолчанию.
parameters = {'C': (0.0001, 0.001, 0.01, 0.1, 1, 10)}
## Для того, чтобы подобрать коэффициент регуляризации, попробуем для каждого его возможного значения посмотреть
## значения roc-auc на стрэтифайд кросс-валидации из 5 фолдов с помощью функции StratifiedKFold
skf = StratifiedKFold(n_splits=5, shuffle=True, random_state=5)
Задание 3. Сделайте GridSearch с метрикой "roc-auc" по параметру C. Какое оптимальное значение параметра С?
### Ваш код должен быть здесь ###
Задание 4. Можно ли считать лучшую модель устойчивой? (модель считаем устойчивой, если стандартное отклонение на валидации меньше 0.5%) Сохраните точность лучшей модели, она вам приходится для следующих заданий
### Ваш код должен быть здесь ###
Задание 5. Определите самый важный признак. Важность признака определяется абсолютным значением его коэффициента. Так же нужно нормализировать все признаки, что бы можно их было корректно сравнить.
### Ваш код должен быть здесь ###
Задание 6. Посчитайте долю влияния DebtRatio на предсказание. (Воспользуйтесь функцией softmax)
### Ваш код должен быть здесь ###
Задание 7. Давайте посмотрим как можно интерпретировать влияние наших признаков. Для этого заного оценим логистическую регрессию в абсолютных величинах. После этого посчитайте во сколько раз увеличатся шансы, что клиент не выплатит кредит, если увеличить возраст на 20 лет при всех остальных равных значениях признаков. (теоретический расчет можно посмотреть здесь)
### Ваш код должен быть здесь ###
from sklearn.ensemble import RandomForestClassifier
# Инициализируем случайный лес с 100 деревьями и сбалансированными классами
rf = RandomForestClassifier(n_estimators=100, n_jobs=-1,
random_state=42, oob_score=True,
class_weight='balanced')
## Будем искать лучшие параметры среди следующего набора
parameters = {'max_features': [1, 2, 4],
'min_samples_leaf': [3, 5, 7, 9],
'max_depth': [5,10,15]}
## Делаем опять же стрэтифайд k-fold валидацию. Инициализация которой должна у вас продолжать храниться в skf
Задание 8. На сколько точность лучшей модели случайного леса выше точности логистической регрессии на валидации?
### Ваш код должен быть здесь ###
Задание 9. Определите какой признак имеет самое слабое влияние.
### Ваш код должен быть здесь ###
Задание 10. Какое наиболее существенное примущество логистической регрессии перед случайным лесом для нашей бизнес-задачи?
from sklearn.ensemble import BaggingClassifier
from sklearn.model_selection import RandomizedSearchCV
parameters = {'max_features': [2, 3, 4], 'max_samples': [0.5, 0.7, 0.9],
"base_estimator__C": [0.0001, 0.001, 0.01, 1, 10, 100]}
Задание 11. Следующая задача обучить бэггинг классификатор (random_state
=42). В качестве базовых классификаторов возьмите 100 логистических регрессий и на этот раз используйте не GridSearchCV
, а RandomizedSearchCV
. Так как перебирать все 54 варианта комбинаций долго, то поставьте максимальное число итераций 20 для RandomizedSearchCV
. Также не забудьте передать параметр валидации cv
и random_state=1
. Какая лучшая точность получилась?
### Ваш код должен быть здесь ###
Задача 12. Дайте интерпретацию лучших параметров для бэггинга. Почему именно такие значения оказались лучшими?