Введение

Отдел инвестиций и портфелей банка захочет идентифицировать своих клиентов, которые потенциально подпишутся на их срочные вклады.

Цель

Эта деятельность направлена ​​на поиск модели машинного обучения, которая может предсказать, какие будущие клиенты подпишутся на свой срочный депозит. Это повысит эффективность и результативность кампании банка.

Банк будет определять клиентов, которые подпишутся на их срочный вклад, и использовать эти знания, чтобы направить на них свои маркетинговые усилия. Это называется целевым маркетингом.

Это поможет им лучше управлять своими ресурсами и избегать потерь.

Данные

Наборы данных были загружены с веб-сайта UCI ML, и можно прочитать более подробную информацию о данных с того же веб-сайта.

Предварительная обработка данных

Кодирование категориальных переменных

Для точной обработки данных категориальные переменные необходимо закодировать в числовые значения. Это можно сделать с помощью кодировщиков разных типов.

В этом упражнении кодировщик меток используется для преобразования категориальных переменных в числовые переменные. Он кодирует категориальные переменные со значениями от 0 до n_classes-1. N_classes - количество категорий.

# Replacing categorical values with numerical values
label_encoder = LabelEncoder()
all_columns = list(data_bank_additional_full.columns)
for x in all_columns:
  if type(data_bank_additional_full[x][0]) == str:
    try:
      data_bank_additional_full[x] = label_encoder.fit_transform(data_bank_additional_full[x])
    except:
      continue

Обработка выбросов

Известно, что выбросы искажают данные. Выбросы влияют на процесс обучения алгоритма машинного обучения, что приводит к потере точности. Это может привести к неточной модели.

Чтобы получить точную модель, выбросы удаляются путем замены их центральными мерами тенденций. В этом упражнении используется мера среднего.

all_columns = list(data_bank_additional_full.iloc[:,:20].columns)
for x in all_columns:
  try:
    data_bank_additional_full[x] = np.where(data_bank_additional_full[x] > data_bank_additional_full[x].quantile(0.975), data_bank_additional_full[x].quantile(0.50), data_bank_additional_full[x])
    data_bank_additional_full[x] = np.where(data_bank_additional_full[x] < data_bank_additional_full[x].quantile(0.025), data_bank_additional_full[x].quantile(0.50), data_bank_additional_full[x])
  except TypeError:
    continue

Масштабирование всех числовых столбцов

Наборы данных с переменными, которые имеют разную величину, единицы измерения и диапазон, влияют на процесс обучения алгоритма машинного обучения. Это связано с тем, что большинство алгоритмов, используемых в машинном обучении, в своих вычислениях используют евклидово расстояние между двумя точками данных. Это дает разные результаты.

Стандартизация сводит переменные к общей величине, единицам измерения и диапазону. Есть много способов стандартизации данных. В этом упражнении используется StandardScaler (). Он стандартизирует функции, удаляя среднее значение и масштабируя до единичной дисперсии.

scaler = StandardScaler()
scaled_df = scaler.fit_transform(data_bank_additional_full.iloc[:,:20])
data_bank_additional_fullish = pd.DataFrame(scaled_df,columns = all_columns)
data_bank_additional_fullish['y'] = data_bank_additional_full['y']
data_bank_additional_full = data_bank_additional_fullish

Методы уменьшения размерности

Это методы, позволяющие оценить, насколько информативен каждый столбец, и удалить столбцы, которые не являются информативными. В этом упражнении t-распределенное стохастическое вложение соседей, автокодировщики и анализ главных компонентов исследуются отдельно по сравнению с тем, чтобы найти лучший метод уменьшения размерности для использования.

ЦНЭ

T-распределенное стохастическое соседнее встраивание (TSNE) уменьшает уменьшенные размеры на основе нелинейных локальных отношений между точками данных. Он пытается минимизировать расхождение Кульбака-Лейблера между совместными вероятностями

Автоэнкодеры

Автоэнкодер - это неконтролируемая искусственная нейронная сеть, обученная с помощью алгоритма обратного распространения, для воспроизведения входного вектора на выходном слое. Его процедура начинает сжатие исходных данных в короткий код, игнорируя шум с помощью кодировщика. За этим следует алгоритм, который распаковывает короткий код, чтобы сгенерировать данные как можно ближе к исходному вводу с помощью декодера.

PCA

Анализ главных компонентов (PCA) - это статистический процесс, который перпендикулярно преобразует исходные числовые столбцы данных в новый набор основных компонентов. Это метод уменьшения линейной размерности.

Его можно использовать для извлечения информации из многомерного пространства. Он сохраняет важные столбцы с большим количеством вариаций данных и удаляет второстепенные столбцы с меньшим количеством вариаций.

Выбор методов уменьшения размерности

Выбранный метод уменьшения размерности - Автоэнкодеры. Выходные данные автоэнкодера могут лучше сжимать информацию в низкоразмерное скрытое пространство, используя его способность моделировать сложные нелинейные функции. Полученный набор данных от автокодировщиков дает более высокую точность, чем другие методы.

При t-распределенном стохастическом встраивании соседей размеры меньше для набора данных, который изначально имел 21 функцию. Это видно по снижению точности используемых моделей машинного обучения. У него самая низкая точность из трех техник.

При анализе главных компонентов точность модели ниже, чем при использовании автокодировщика, при применении результирующего набора данных из анализа главных компонентов.

Модели данных

Чтобы выбрать модель, перекрестная проверка для выбора лучших моделей машинного обучения. Используемые методы перекрестной проверки: стратифицированный K-кратный и K-образный.

Стратифицированный K-кратный - это выбранный метод перекрестной проверки. Использование стратифицированного K-Fold, потому что он генерирует тестовые наборы, содержащие такое же распределение классов или как можно более близкое. Он сохраняет зависимости порядка в порядке набора данных. Стратифицированный K-Fold имеет небольшой диапазон оценок точности перекрестной проверки.

Используемые метрики оценки:

  • Оценка AUC 1 представляет собой идеальный классификатор, а 0,5 представляет собой бесполезный классификатор.
  • Оценка F1 - это объем данных, проверенных для прогнозов.
  • Точность - это точность подмножества. Набор меток, предсказанный для выборки, должен точно соответствовать соответствующему набору меток в y_true.
  • Оценка точности означает уровень точности прогноза, сделанного моделью.
  • Отзыв - это сумма, до которой модель может предсказать результат.

Для вышесказанного помощник класса будет содержать код:

class helper:
  def __init__(self):
    print ("Helper object created")
  def confusion(self, y_pred):
    cnf_matrix = metrics.confusion_matrix(y_test, y_pred)
    class_names=[0,1] # name  of classes
    fig, ax = plt.subplots()
    tick_marks = np.arange(len(class_names))
    plt.xticks(tick_marks, class_names)
    plt.yticks(tick_marks, class_names)

    # create heatmap
    sns.heatmap(pd.DataFrame(cnf_matrix), annot=True, cmap=colour_palette ,fmt='g')
    ax.xaxis.set_label_position("top")
    plt.tight_layout()
    plt.title('Confusion matrix', y=1.1)
    plt.ylabel('Actual label')
    plt.xlabel('Predicted label')

  def roc_plot(self,model):
    y_pred_proba = model.predict_proba(X_test)[::,1]
    fpr, tpr, _ = metrics.roc_curve(y_test,  y_pred_proba)
    auc = metrics.roc_auc_score(y_test, y_pred_proba)
    plt.plot(fpr,tpr,label="data 1, auc="+str(auc))
    print("auc="+str(auc))
    plt.legend(loc=4)
    plt.show()

  def s_kfold(self,model):
    skfold = StratifiedKFold(n_splits=5, shuffle=True, random_state=1)

    scores = cross_val_score(model, X_train, y_train, cv=skfold,scoring='accuracy')
    print('\nCross-Validation Accuracy Scores', scores)

    scores = pd.Series(scores)
    print('\nThe minimum Cross-Validation Accuracy is  %.4f ' % scores.min())
    print('\nThe mean Cross-Validation Accuracy is  %.4f ' % scores.mean())
    print('\nThe maximum Cross-Validation Accuracy is  %.4f ' % scores.max())

  def kfold(self,model):
    kfold = KFold(n_splits=5, shuffle=True, random_state=1)

    scores = cross_val_score(model, X_train, y_train, cv=kfold,scoring='accuracy')
    print('\nCross-Validation Accuracy Scores', scores)

    scores = pd.Series(scores)
    print('\nThe minimum Cross-Validation Accuracy is  %.4f ' % scores.min())
    print('\nThe mean Cross-Validation Accuracy is  %.4f ' % scores.mean())
    print('\nThe maximum Cross-Validation Accuracy is  %.4f ' % scores.max())

  def calc_metrics(self,y_pred):
    print("\nF1 Score: %.4f " % metrics.f1_score(y_test, y_pred))
    print("\nAccuracy: %.4f " % metrics.accuracy_score(y_test, y_pred))
    print("\nPrecision: %.4f " % metrics.precision_score(y_test, y_pred))
    print("\nRecall: %.4f " % metrics.recall_score(y_test, y_pred))

Модель логистической регрессии

Логистическая регрессия - это статистический метод прогнозирования бинарных классов. Итоговая или целевая переменная - это только два возможных класса.

# instantiate the model (using the default parameters)
logistic_regressor = LogisticRegression()

# fit the model with data
logistic_regressor = logistic_regressor.fit(X_train,y_train)

# predict
y_pred = logistic_regressor.predict(X_test)

Минимальная точность перекрестной проверки составляет 0,8916.

Средняя точность перекрестной проверки составляет 0,8941.

Максимальная точность перекрестной проверки составляет 0,8955.

Оценка AUC для этого случая составляет 0,7894. Оценка F1 составляет 0,2632. Точность 0,8844. Точность равна 0,6028. Отзыв - 0,1683

XGBoost

Повышение - это последовательный метод, который объединяет набор слабых учеников и обеспечивает повышенную точность прогнозирования. Правильно предсказанным результатам присваивается меньший вес, а тем, которые не были классифицированы, - больший.

# instantiate the model (using the default parameters)
xgboost_classifier = XGBClassifier()

# fit the model with data
xgboost_classifier = xgboost_classifier.fit(X_train,y_train)

# predict
y_pred = xgboost_classifier.predict(X_test)
#XGBoost Tree
xgb.plot_tree(xgboost_classifier,num_trees=0) 
plt.rcParams['figure.figsize'] = [50, 10] 
plt.show()

Минимальная точность перекрестной проверки составляет 0,8917.

Средняя точность перекрестной проверки составляет 0,8942.

Максимальная точность перекрестной проверки составляет 0,8953.

Оценка AUC для этого случая составляет 0,7927. Оценка F1 составляет 0,2621. Точность 0,8852. Точность - 0,6176. Отзыв - 0,1663.

Многослойный персептрон

Многослойный перцептрон собирает перцептроны, которые создаются на входном уровне, предназначенном для приема сигнала. У него есть выходной слой, отвечающий за решение или прогноз относительно входных данных. Многослойные персептроны имеют произвольное количество скрытых слоев, которые представляют истинную вычислительную мощность алгоритма машинного обучения.

# create mutli-layer perceptron classifier
perceptron_classifier = MLPClassifier()

# train
perceptron_classifier = perceptron_classifier.fit(X, y)

# make predictions
y_pred = perceptron_classifier.predict(X_test)

Минимальная точность перекрестной проверки составляет 0,8917.

Средняя точность перекрестной проверки составляет 0,8941.

Максимальная точность перекрестной проверки составляет 0,8949.

Оценка AUC для этого случая составляет 0,7102. Оценка F1 составляет 0,3166. Точность 0,5419. Точность - 0,1937. Отзыв - 0,8653.

Машина опорных векторов

Машина опорных векторов обрабатывает нелинейные входные пространства. Он использует алгоритмы классификации для задач классификации двух групп.

Он используется в различных приложениях, таких как обнаружение лиц, обнаружение вторжений, классификация электронных писем, новостных статей и веб-страниц, классификация генов и распознавание почерка.

#Create a svm Classifier
support_vector_classifier = svm.SVC(kernel='linear', probability=True)

#Train the model using the training sets
support_vector_classifier = support_vector_classifier.fit(X_train, y_train)

#Predict the response for test dataset
y_pred = support_vector_classifier.predict(X_test)

Минимальная точность перекрестной проверки составляет 0,8849.

Средняя точность перекрестной проверки составляет 0,8872.

Максимальная точность перекрестной проверки составляет 0,8885.

Оценка AUC для этого случая составляет 0,7462. Оценка F1 составляет 0,0000. Точность 0,8774. Точность 0,0000. Отзыв составляет 0,0000.

Деревья решений

Дерево решений похоже на древовидную структуру блок-схемы с внутренним узлом, ветвью и листовыми узлами. Внутренний узел представляет функцию. Ветвь представляет собой решающее правило. Каждый листовой узел представляет результат. Корневой узел самый высокий.

Деревья решений учатся разбивать на части на основе значения атрибута. Он разбивает дерево с помощью рекурсивного разбиения.

Деревья решений помогают в принятии решений. Визуализация деревьев решений похожа на блок-схему. Это упрощает понимание и интерпретацию, поскольку имитирует мышление человеческого уровня.

# Create Decision Tree classifer object
decision_tree_classifer = DecisionTreeClassifier(max_depth=5)

# Train Decision Tree Classifer
decision_tree_classifer = decision_tree_classifer.fit(X_train,y_train)

#Predict the response for test dataset
y_pred = decision_tree_classifer.predict(X_test)
#Decision Tree
dot_data = StringIO()
export_graphviz(decision_tree_classifer, out_file=dot_data, filled=True, rounded=True, special_characters=True,feature_names = X.columns,class_names=['0','1'])
graph = pydotplus.graph_from_dot_data(dot_data.getvalue())  
graph.write_png('Term Deposits.png')
Image(graph.create_png())

Минимальная точность перекрестной проверки составляет 0,8918.

Средняя точность перекрестной проверки составляет 0,8936.

Максимальная точность перекрестной проверки составляет 0,8947.

Оценка AUC для этого случая составляет 0,7891. Оценка F1 составляет 0,2609. Точность 0,8844. Точность равна 0,6043. Отзыв - 0,1663.

Случайные леса

Случайный лес состоит из деревьев. Чем больше деревьев, тем крепче лес. Деревья - это деревья решений для случайно выбранных выборок данных. Это необходимо для получения прогноза из каждого дерева и выбора наилучшего решения с помощью голосования.

# create classifier object 
random_forest_classifier = RandomForestClassifier() 
  
# fit the classifier with x and y data 
random_forest_classifier = random_forest_classifier.fit(X_train,y_train)

#Predict the response for test dataset
y_pred = random_forest_classifier.predict(X_test)

Минимальная точность перекрестной проверки составляет 0,8913.

Средняя точность перекрестной проверки составляет 0,8935.

Максимальная точность перекрестной проверки составляет 0,8947.

Оценка AUC для этого случая составляет 0,7883. Оценка F1 составляет 0,2646. Точность 0,8840. Точность - 0,5931. Отзыв - 0,1703.

Вывод

Модель была выбрана на основе точности, интерпретируемости, сложности и масштабируемости модели.

Лучшей моделью будет XGBoost.

Средняя точность перекрестной проверки составляет 0,8942.

Оценка AUC для XGBoost составляет 0,7927. Это ближе к 1, чем все другие оценки AUC. Оценка F1 составляет 0,2621. Точность 0,8852. Точность - 0,6176. Отзыв - 0,1663.

Следующая лучшая модель - это связь между логистической регрессией и многослойным персептроном.

Логистическая регрессия

Средняя точность перекрестной проверки составляет 0,8941.

Оценка AUC для логистической регрессии составляет 0,7894. Оценка F1 составляет 0,2632. Точность 0,8844. Точность - 0,6028. Отзыв - 0,1683.

Многослойный персептрон

Средняя точность перекрестной проверки составляет 0,8941.

Оценка AUC для многослойного персептрона составляет 0,7102. Оценка F1 составляет 0,3166. Точность 0,5419. Точность 0,1937. Отзыв 0,8653.

Ссылка на репозиторий git с проектом - https://github.com/mwi-kali/Bank-Institution-Term-Deposit-Predictive-Model

Я собрал это в рамках пакета 3 тренинга 10academy.org.

использованная литература

Навлани А., 2018. Классификация дерева решений в Python. [онлайн] Сообщество DataCamp.

Навлани А., 2019. Машины опорных векторов с помощью Scikit-Learn. [онлайн] Сообщество DataCamp.

Навлани А., 2020. Понимание логистической регрессии в Python. [онлайн] Сообщество DataCamp.

Патак, М., 2020. Использование Xgboost в Python. [онлайн] Сообщество DataCamp.

Pythonprogramminglanguage.com. 2020. Многослойный персептрон - изучение Python .

Quantdare. 2020. Обнаружение выбросов с помощью автоэнкодера, нейронная сеть ⋆ Quantdare.

Scikit-learn.org. 2020. Sklearn.Decomposition.PCA - Документация Scikit-Learn 0.23.2.

Scikit-learn.org. 2020. Sklearn.Preprocessing.Standardscaler - Документация Scikit-Learn 0.23.2.