Дипломная работа: Разработка методики применения методов машинного обучения для решения маркетинговых задач в телекоммуникационном бизнесе

Внимание! Если размещение файла нарушает Ваши авторские права, то обязательно сообщите нам

# прогнозные значения вероятностей принадлежности к классу 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

# Определение наиболее оптимальных параметров для градиентного бустинга

param = {'max_depth':3, 'eta':0.06, 'silent':1, 'objective':'binary:logistic', 'nthread':8,

'alpha':1, 'lambda':1, 'gamma':1, 'eval_metric':'auc', 'subsample':0.5,

'colsample_bytree':0.5, 'min_child_weight':1}

# max_depth - максимальная глубина деревьев (в нашем случае равна 3)

# eta - доля исправляемой ошибки, полученной при построении предыдущего дерева (в нашем случае равна 0.06)

# silent - нужно ли выводить сообщения во время обучения (в нашем случае используем показатель по умолчанию = 1 (то есть не выводить))

# objective - объектная функция оптимизации в зависимости от решаемой задачи (в нашем случае решается задача бинарной классификации, поэтому используем objective binary logistic)

# nthread - количество параллельных потоков при отработке скрипта для увеличения скорости выполнения (в нашем случае 8)

# alpha - применение L2-регуляризации к листьям (в нашем случае используем показатель по умолчанию = 1 (то есть условия стандартные, регуляризацию не применяем))

# lambda - применение L1-регуляризации к листьям (в нашем случае используем показатель по умолчанию = 1 (то есть условия стандартные, регуляризацию не применяем))

# gamma - минимальное значение, которое позволяет продолжить построение ветви на узлах (в нашем случае используем показатель по умолчанию = 1)

# eval_metric - метрика для оценки качества модели (в нашем случае AUC)

# subsample - доля записей, которые будут использоваться при обучении дерева (в нашем случае 0.5)

# colsample_bytree - доля предикторов, которые будут использоваться при построении каждого дерева (в нашем случае 0.5)

# min_child_weight - минимальная сумма веса экземпляра, необходимая ребенку (в нашем случае используем показатель по умолчанию = 1)

bst = xgb.train(param, dtrain, 160, [(dtrain,'train'), (dtest,'test')]) # Обучаем бустер на 160 деревьев с использованием заданных параметров, обучающей и тестовой матриц

result, cumm_lift = cumm_lift(df, bst, dtest) # Применяем пользовательскую функцию для расчета cummulative lift

print (cumm_lift) # Вывод показателя commulative lift на первых 10 перцентилях

# Вывод результатов в текстовый файл

result.to_csv('Viasat_ON.csv', sep = ',', header = True, index = False)

# Сохранение обучающей выборки после обработки

output = open('Viasat_Train_DS.pkl', 'wb')

pickle.dump(df, output, 2)

output.close()

# Сохранение бустера

output = open('Viasat_Model.pkl', 'wb')

pickle.dump(bst, output, 2)

output.close()

Источник: https://otherreferats.allbest.ru/download/1003541/