# прогнозные значения вероятностей принадлежности к классу 1
result = result.sort_values(['pred'], axis = 0, ascending = False) # Сортировка значений в DataFrame по убыванию вероятностей принадлежности к классу 1
result = result.reset_index(drop = True) # Реиндексирование DataFrame
qty_10 = math.ceil(result.shape[0] * 0.1) # Расчет количества записей в первых 10 перцентилях выборки
cumm_lift = (result.iloc[: qty_10, 0].sum() * 1.0 / qty_10) / (result.iloc[:, 0].sum() * 1.0 / result.shape[0]) # Расчет cummulative lift на первых 10 перцентилях (отношение суммы фактических целевых меток
# в первых 10 перцентилях к количеству записей в первых 10 перцентилях разделить на отношение суммы фактических целевых меток во всей генеральной совокупности к количеству записей в генеральной совокупности)
return result, cumm_lift # Функция возвращаяет полученный DataFrame и commulative lift
dtrain = xgb.DMatrix(train_data, train_labels, missing = NaN) # Формирование тренировочной матрицы на основе обучающих меток и данных, в качестве пропущенных значений определяем NaN
dtest = xgb.DMatrix(test_data, test_labels, missing = NaN) # Формирование тестовой матрицы на основе проверочных меток и данных, в качестве пропущенных значений определяем NaN
mas = [] # Создание массива для сохранения всех параметров
x_colsample_bytree = 0.3 # Перебираем параметр colsample_bytree от 0.3 до 0.8
while x_colsample_bytree <= 0.8:
x_subsample = 0.3 # Перебираем параметр subsample от 0.3 до 0.8
while x_subsample <= 0.8:
x_eta = 0.03 # Перебираем параметр eta от 0.03 до 0.08
while x_eta <= 0.08:
x_max_depth = 3 # Перебираем параметр max_depth от 3 до 8
while x_max_depth <= 8:
# Определяем перечень параметров
param = {'max_depth':x_max_depth, 'eta':x_eta, 'silent':1, 'objective':'binary:logistic', 'nthread':8,
'alpha':1, 'lambda':1, 'gamma':1, 'eval_metric':'auc', 'subsample':x_subsample,
'colsample_bytree':x_colsample_bytree, 'min_child_weight':1}
i=60 # Перебираем количество деревьев от 60 до 800
while i < 800:
bst = xgb.train(param, dtrain, i) # Обучаем модель на каждой совокупности параметров
result, cumm_lift = cumm_lift(df, bst, dtest) # Применяем пользовательскую функцию для расчета
# cummulative lift
mas.append(x_colsample_bytree, x_subsample, x_eta, x_max_depth, i, cumm_lift) # Заполнение массива
# для параметрами и значениями целевой переменной
print (x_colsample_bytree, x_subsample, x_eta, x_max_depth, i, cumm_lift) # Выводим на экран значения
# параметров и полученный целевой показатель
i += 20 # Деревья перебираем с шагом 20
x_max_depth += 1 # max_depth перебираем с шагом 1
x_eta += 0.01 # eta перебираем с шагом 0.01
x_subsample += 0.1 # subsample перебираем с шагом 0.1
x_colsample_bytree += 0.1 # colsample_bytree перебираем с шагом 0.1
mas = pd.DataFrame(mas, columns = [['COLSAMPLE','SUBSAMPLE','ETA','DEPTH',
'TREES','CUMM_LIFT']]).sort_values(['CUMM_LIFT'], axis = 0, ascending = False)
# Сортировка массива по убыванию значения Cumm lift
mas.head() # Вывод пяти множеств параметров с наибольшим значением cumm lift