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

Конвейер

В машинном обучении для обработки и обучения данных используются разные алгоритмы. Мы создаем числовые векторы признаков из каждого слова, а затем алгоритм учится на этих векторах и метках. Каждый конвейер включает стадии, которые могут быть Transformer или Estimator.

По сути, Transformer реализует метод transform(), который преобразует один DataFrame в другой, обычно путем добавления одного или нескольких столбцов. С другой стороны, Estimator принимает DataFrame и создает модель с помощью метода fit(). Приступим к формированию нашего пайплайна:

Конвейер построен, и мы готовы разделить данные на две части: обучение и тестирование.

(train, test) = df.randomSplit([0.7, 0.3], seed = 1)

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

Spark ML предоставляет набор высокоуровневых API поверх DataFrames, что позволяет нам реализовывать алгоритмы машинного обучения. Логистическая регрессия - очень известный алгоритм предсказания категориального результата. Этот алгоритм использует логистическую функцию для моделирования двоичной зависимой переменной. Логистическая регрессия имеет разные типы, такие как двоичная, полиномиальная и порядковая логистическая регрессия. В этой статье мы используем двоичную логистическую регрессию для прогнозирования двоичного результата, который имеет два категориальных результата, например Да или Нет.

## Logistic Regression
from pyspark.ml.classification import LogisticRegression
lr = LogisticRegression(featuresCol = ‘features’, labelCol = ‘label’, maxIter=100)
lrModel = lr.fit(train)

Давайте интерпретируем коэффициенты:

import matplotlib.pyplot as plt
import numpy as np
beta = np.sort(lrModel.coefficients)
plt.plot(beta)
plt.ylabel(‘Beta Coefficients’)
plt.show()

Затем мы наносим на график ROC (Рабочие характеристики приемника) и AUC (Площадь под кривой). Это один из наиболее важных показателей оценки для проверки эффективности любой модели классификации. Это даст нам возможность измерить производительность, и это фундаментальная задача машинного обучения. Мы можем определить ROC как кривую вероятности, а AUC представляет собой измерение разделимости. Это гарантирует, насколько наша модель способна различать классы.

trainSet = lrModel.summary
roc = trainSet.roc.toPandas()
plt.plot(roc[‘FPR’],roc[‘TPR’])
plt.ylabel(‘False Positive Rate’)
plt.xlabel(‘True Positive Rate’)
plt.title(‘ROC Curve’)
plt.show()
print(‘TrainSet areaUnderROC: ‘ + str(trainSet.areaUnderROC))

Точность и отзыв отображаются следующим образом:

pr = trainSet.pr.toPandas()
plt.plot(pr[‘recall’],pr[‘precision’])
plt.ylabel(‘Precision’)
plt.xlabel(‘Recall’)
plt.show()

Сделаем несколько прогнозов на тестовой выборке:

## make predictions
predictions = lrModel.transform(test)
predictions.select(‘ApplicantIncome’, ‘CoapplicantIncome’, ‘Loan_Amount_Term’, ‘Credit_History’, ‘prediction’, ‘probability’).show(10)

Двоичная классификация

Binary Classification - это задача предсказания двоичной метки. В нашей модели мы прогнозируем, сможет ли человек получить ссуду или нет.

from pyspark.ml.evaluation import BinaryClassificationEvaluator
evaluator = BinaryClassificationEvaluator()
print(‘Test Area Under ROC’, evaluator.evaluate(predictions))

что дает Test Ares Under ROC: 0.8132286318332832.

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

Случайные леса - это группа деревьев решений, которая использует Mojority of Voting для каждого дерева решений. Этот алгоритм обеспечивает меньший риск переобучения за счет комбинирования деревьев решений.

## Random Forest Classifier
from pyspark.ml.classification import RandomForestClassifier
# Creating RandomForest model.
rf = RandomForestClassifier(labelCol=”label”, featuresCol=”features”)
## train the model
rfModel = rf.fit(train)
## make predictions
predictions = rfModel.transform(test)
rfPredictions = predictions.select("label", "prediction", "probability")
rfPredictions.show(10)

## evaluate the Rnadom Forest Classifier
from pyspark.ml.evaluation import BinaryClassificationEvaluator
evaluator = BinaryClassificationEvaluator()
evaluator.evaluate(predictions)
print(‘Random Forest Test areaUnderROC: {}’.format(evaluator.evaluate(predictions)))

И область теста случайного лесаUnderRoc: 0.8418604651162791.

Классификатор деревьев с градиентным усилением

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

## Gradient-Boosted Tree Classifier
from pyspark.ml.classification import GBTClassifier
gbt = GBTClassifier(labelCol=”label”, featuresCol=”features”,maxIter=10)
pipeline = Pipeline(stages=stages+[gbt])
(traininggbt, testgbt) = df_copy.randomSplit([0.7, 0.3], seed=1)
gbtModel = pipeline.fit(traininggbt)

Делать предсказания:

from pyspark.ml.evaluation import MulticlassClassificationEvaluator
predictions =gbtModel.transform(testgbt)
# Show predictions
predictions.select(‘label’, ‘prediction’, ‘probability’).show(10)

Оценка классификатора дерева с градиентным усилением может быть произведена следующим образом:

evaluator = BinaryClassificationEvaluator()
print(“GBT Test Area Under ROC: “ + str(evaluator.evaluate(predictions, {evaluator.metricName: “areaUnderROC”})))

в результате получается Тестовая зона GBT под ROC: 0.813024203211119.

ParamGridBuilder и CrossValidator

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

from pyspark.ml.tuning import ParamGridBuilder, CrossValidator
paramGrid = ParamGridBuilder()\
 .addGrid(lr.aggregationDepth,[2,5,10])\
 .addGrid(lr.elasticNetParam,[0.0, 0.5, 1.0])\
 .addGrid(lr.fitIntercept,[False, True])\
 .addGrid(lr.maxIter,[10, 100, 1000])\
 .addGrid(lr.regParam,[0.01, 0.5, 2.0]) \
 .build()

Затем мы создаем 5-кратный кросс-валидатор:

cv = CrossValidator(estimator=lr, estimatorParamMaps=paramGrid, evaluator=evaluator, numFolds=5)
# Run cross validations
cvModel = cv.fit(train)
predict_train=cvModel.transform(train)
predict_test=cvModel.transform(test)
print(“Cross-validation areaUnderROC for train set is {}”.format(evaluator.evaluate(predict_train)))
print(“Cross-validation areaUnderROC for test set is {}”.format(evaluator.evaluate(predict_test)))

Это приводит к:

Cross-validation areaUnderROC for train set is 0.8361628101944998
Cross-validation areaUnderROC for test set is 0.811416490486258

Заключение

В конце концов, эта статья описала базовую реализацию двоичной классификации в PySpark. Мы показали разные алгоритмы для сравнения и, наконец, применили перекрестную проверку для повышения производительности. Он также показал эффективность Apache Spark и его возможностей.

Ссылки