В первой части нашего проекта сквозной классификации набор данных о кредитном риске был преобразован и стал пригодным для использования в алгоритмах машинного обучения за счет категоризации функций. В этой части будут реализованы различные алгоритмы классификации для прогнозирования 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 и его возможностей.
Ссылки