Уведомления

Группа в Telegram: @pythonsu

#1 Янв. 11, 2018 12:25:36

Kazzi85
Зарегистрирован: 2017-12-02
Сообщения: 7
Репутация: +  0  -
Профиль   Отправить e-mail  

ROC-кривые

Здравствуйте!

Не могу понять как провести оценку модели, и вывести ROC-кривые. Подскажите пожалуйста, как это сделать.

 # загрузим библиотеки и установим опции
 
from __future__ import division, print_function
# отключим всякие предупреждения Anaconda
import warnings
warnings.filterwarnings('ignore')
%matplotlib inline
from matplotlib import pyplot as plt
import seaborn as sns
 
import pickle
import numpy as np
import pandas as pd
from scipy.sparse import csr_matrix
from scipy.sparse import hstack
from sklearn.preprocessing import StandardScaler
from sklearn.metrics import roc_auc_score
from sklearn.linear_model import LogisticRegression
 
from sklearn.datasets import load_files
from sklearn.svm import LinearSVC
 
 
# загрузим обучающую и тестовую выборки
train_df = pd.read_csv('C:/Users/Kazzi/Desktop/mlcourse_open-master/data/train_sessions.csv',
                       index_col='session_id')
test_df = pd.read_csv('C:/Users/Kazzi/Desktop/mlcourse_open-master/data/test_sessions.csv',
                      index_col='session_id')
 
# приведем колонки time1, ..., time10 к временному формату
times = ['time%s' % i for i in range(1, 11)]
train_df[times] = train_df[times].apply(pd.to_datetime)
test_df[times] = test_df[times].apply(pd.to_datetime)
 
# отсортируем данные по времени
train_df = train_df.sort_values(by='time1')
 
# посмотрим на заголовок обучающей выборки
train_df.head()
 
# приведем колонки site1, ..., site10 к целочисленному формату и заменим пропуски нулями
sites = ['site%s' % i for i in range(1, 11)]
train_df[sites] = train_df[sites].fillna(0).astype('int')
test_df[sites] = test_df[sites].fillna(0).astype('int')
 
# загрузим словарик сайтов
with open(r"C:/Users/Kazzi/Desktop/mlcourse_open-master/data/site_dic.pkl", "rb") as input_file:
    site_dict = pickle.load(input_file)
 
# датафрейм словарика сайтов
sites_dict = pd.DataFrame(list(site_dict.keys()), index=list(site_dict.values()), columns=['site'])
print(u'всего сайтов:', sites_dict.shape[0])
sites_dict.head()
 
# топ-сайты в обучающей выборке
top_sites = pd.Series(train_df[sites].fillna(0).values.flatten()
                     ).value_counts().sort_values(ascending=False).head(5)
print(top_sites)
sites_dict.ix[top_sites.index]
 
 
time_df = pd.DataFrame(index=train_df.index)
time_df['target'] = train_df['target']
 
# найдем время начала и окончания сессии
time_df['min'] = train_df[times].min(axis=1)
time_df['max'] = train_df[times].max(axis=1)
 
# вычислим длительность сессии и переведем в секунды
time_df['seconds'] = (time_df['max'] - time_df['min']) / np.timedelta64(1, 's')
 
time_df.head()
# создадим отдельный датафрейм, где будем работать со временем
time_df = pd.DataFrame(index=train_df.index)
time_df['target'] = train_df['target']
​
# найдем время начала и окончания сессии
time_df['min'] = train_df[times].min(axis=1)
time_df['max'] = train_df[times].max(axis=1)
​
# вычислим длительность сессии и переведем в секунды
time_df['seconds'] = (time_df['max'] - time_df['min']) / np.timedelta64(1, 's')
​
time_df.head()
 
# наша целевая переменная
y_train = train_df['target']
 
# объединенная таблица исходных данных
full_df = pd.concat([train_df.drop('target', axis=1), test_df])
 
# индекс, по которому будем отделять обучающую выборку от тестовой
idx_split = train_df.shape[0]
 
full_df.corr()
 
# табличка с индексами посещенных сайтов в сессии
full_sites = full_df[sites]
full_sites.head()
 
# последовательность с индексами
sites_flatten = full_sites.values.flatten()
 
# искомая матрица
full_sites_sparse = csr_matrix(([1] * sites_flatten.shape[0],
                                sites_flatten,
                                range(0, sites_flatten.shape[0]  + 10, 10)))[:, 1:]
 
%%time
# выделим из объединенной выборки только обучающую (для которой есть ответы)
X_train = full_sites_sparse[:idx_split, :]
 
# считаем метрику на валидационной выборке
print(get_auc_lr_valid(X_train, y_train))
 
# функция для записи прогнозов в файл
def write_to_submission_file(predicted_labels, out_file,
                             target='target', index_label="session_id"):
    predicted_df = pd.DataFrame(predicted_labels,
                                index = np.arange(1, predicted_labels.shape[0] + 1),
                                columns=[target])
    predicted_df.to_csv(out_file, index_label=index_label)
 
# обучим модель на всей выборке
# random_state=17 для воспроизводимости
# параметр C=1 по умолчанию, но здесь мы его укажем явно
lr = LogisticRegression(C=1.0, random_state=17).fit(X_train, y_train)
 
# обучим модель на всей выборке
# random_state=17 для воспроизводимости
# параметр C=1 по умолчанию, но здесь мы его укажем явно
lr = LogisticRegression(C=1.0, random_state=17).fit(X_train, y_train)
 
def plot_grid_scores(grid, param_name):
    plt.plot(grid.param_grid[param_name], grid.cv_results_['mean_train_score'],
        color='green', label='train')
    plt.plot(grid.param_grid[param_name], grid.cv_results_['mean_test_score'],
        color='red', label='test')
    plt.legend();
 
visualize_coefficients(lr, site_dict)
 
 
full_new_feat = pd.DataFrame(index=full_df.index)
 
# добавим признак start_month
full_new_feat['start_month'] = full_df['time1'].apply(lambda ts: 100 * ts.year + ts.month)
# датафрейм для новых признаков
 
# рассчитаем количество сессий Элис по месяцам
tmp = full_new_feat.ix[:idx_split, 'start_month'].to_frame()
tmp['target'] = y_train
stm_vs_target = tmp.groupby('start_month')['target'].sum()
 
# вывод таблички
print(stm_vs_target)
 
 
# построим график
x_axis = stm_vs_target.index
y_axis = stm_vs_target.values
fig=plt.figure(figsize=(12, 8))
ax1=fig.add_subplot(111)
line1 = ax1.plot(y_axis,'ro',label='line1')
plt.xticks(range(len(y_axis)), x_axis)
ax1.set_ylabel('y values',fontsize=12)
lines = line1
labels = [l.get_label() for l in lines]
ax1.set_xlabel('ГГГГММ',fontsize=14)
ax1.set_ylabel('Кол-во сессий',fontsize=14)
plt.setp(ax1.get_xticklabels(), visible=True)
plt.suptitle(u'Количество сессий Элис по месяцам', y=1.0, fontsize=17)
fig.tight_layout()
fig.subplots_adjust(top=0.96,bottom=0.4)
plt.show() 
 
# добавим новый признак в разреженную матрицу
tmp = full_new_feat[['start_month']].as_matrix()
X_train = csr_matrix(hstack([full_sites_sparse[:idx_split,:], tmp[:idx_split,:]]))
 
# считаем метрику на валидационной выборке
print(get_auc_lr_valid(X_train, y_train))
 
# добавим новый стандартизированный признак в разреженную матрицу
tmp = StandardScaler().fit_transform(full_new_feat[['start_month']])
X_train = csr_matrix(hstack([full_sites_sparse[:idx_split,:], tmp[:idx_split,:]]))
 
# считаем метрику на валидационной выборке
print(get_auc_lr_valid(X_train, y_train))
 
full_new_feat['start_hour'] = full_df['time1'].apply(lambda ts: ts.hour)
full_new_feat['morning'] = full_new_feat['start_hour'].apply(lambda hour: int(hour <= 11))
 
 
# scaled start_hour
tmp_scaled = StandardScaler().fit_transform(full_new_feat[['start_month', 'start_hour']])
X_train = csr_matrix(hstack([full_sites_sparse[:idx_split,:], 
                             tmp_scaled[:idx_split,:]]))
print(get_auc_lr_valid(X_train, y_train))
# 0.957924006323 <---
 
# raw start_hour
tmp_raw = full_new_feat[['start_hour']].as_matrix()
tmp_scaled = StandardScaler().fit_transform(full_new_feat[['start_month']])
X_train = csr_matrix(hstack([full_sites_sparse[:idx_split,:], 
                             tmp_scaled[:idx_split,:]]))
print(get_auc_lr_valid(X_train, y_train))
# 0.919698464197
 
 
 
# scaled morning
tmp_scaled = StandardScaler().fit_transform(full_new_feat[['start_month', 'morning']])
X_train = csr_matrix(hstack([full_sites_sparse[:idx_split,:], 
                             tmp_scaled[:idx_split,:],
                             tmp_raw[:idx_split,:]]))
print(get_auc_lr_valid(X_train, y_train))
# 0.958430928728 <---
                         
# raw morning
tmp_raw = full_new_feat[['morning']].as_matrix()
tmp_scaled = StandardScaler().fit_transform(full_new_feat[['start_month']])
X_train = csr_matrix(hstack([full_sites_sparse[:idx_split,:], 
                             tmp_scaled[:idx_split,:],
                             tmp_raw[:idx_split,:]]))
print(get_auc_lr_valid(X_train, y_train))
# 0.948665199943
 
 
# start_hour и morning
tmp_scaled = StandardScaler().fit_transform(full_new_feat[['start_month', 'start_hour', 'morning']])
X_train = csr_matrix(hstack([full_sites_sparse[:idx_split,:], 
                             tmp_scaled[:idx_split,:]]))
print(get_auc_lr_valid(X_train, y_train))
# 0.959149043641 <---
 
full_new_feat.corr()
 
# формируем обучающую выборку
tmp_scaled = StandardScaler().fit_transform(full_new_feat[['start_month', 'start_hour', 'morning']])
X_train = csr_matrix(hstack([full_sites_sparse[:idx_split,:], 
                             tmp_scaled[:idx_split,:]]))
 
# зафиксируем качество с параметрами по умолчанию
score_C_1 = get_auc_lr_valid(X_train, y_train)
print(score_C_1)
 
%%time
# набор возможных значений С
Cs = np.logspace(-3, 1, 10)
 
scores = []
    
for C in Cs:
    scores.append(get_auc_lr_valid(X_train, y_train, C=C))
 
plt.plot(Cs, scores, 'ro-')
plt.xscale('log')
plt.xlabel('C')
plt.ylabel('AUC-ROC')
plt.title('Подбор коэффициента регуляризации')
# горизонтальная линия -- качество модели с коэффициентом по умолчанию
plt.axhline(y=score_C_1, linewidth=.5, color = 'b', linestyle='dashed') 
plt.show()
 
# подготовим данные для обучения и теста
tmp_scaled = StandardScaler().fit_transform(full_new_feat[['start_month', 'start_hour', 'morning']])
X_train = csr_matrix(hstack([full_sites_sparse[:idx_split,:], 
                             tmp_scaled[:idx_split,:]]))
X_test = csr_matrix(hstack([full_sites_sparse[idx_split:,:], 
                            tmp_scaled[idx_split:,:]]))
 
# обучим модель на всей выборке с оптимальным коэффициентом регуляризации
lr = LogisticRegression(C=C, random_state=17).fit(X_train, y_train)

Я прикреплю юпитер-тетрадку, в ней весь код. Если удобно с нее читать.

Прикреплённый файлы:
attachment Final.ipynb (348,9 KБ)

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version