Как стать автором
Обновить

Распределенное машинное обучение с помощью PySpark

Уровень сложностиПростой

Решил взяться за изучение распределенного машинного обучения и освоившись в основах инструментария MLLib от PySpark, хочу привести конкретный пример применения библиотеки. Заодно рассказать: а зачем вообще идти в эту сторону?

Simple. Fast. Scalable. Unified.

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

Впрочем его можно установить на одной машине локально или в Colab, что мы и сделаем.

Устанавливаем pyspark.

!apt-get install openjdk-8-jdk-headless -qq > /dev/null
!wget -q https://apache.osuosl.org/spark/spark-3.3.1/spark-3.3.1-bin-hadoop3.tgz
!tar xf spark-3.3.1-bin-hadoop3
!pip install -q findspark

Устанавливаем переменные окружения

import os
os.environ["JAVA_HOME"] = "/usr/lib/jvm/java-8-openjdk-amd64"
os.environ["SPARK_HOME"] = "/content/spark-3.3.1-bin-hadoop3"

Проверяем работоспособность на примере Hello, world!

import findspark
findspark.init()

from pyspark.sql import SparkSession

spark = SparkSession.builder.master("local[*]").getOrCreate()
# Test the spark 
df = spark.createDataFrame([{"hello": "world"} for x in range(1000)])

df.show(3, False)

+-----+
|hello|
+-----+
|world|
|world|
|world|
+-----+

Загружаем тестовые данные по заболеванию диабетом в spark DataFrame.

df = spark.read.csv("/content/diabetes.csv", header=True,inferSchema=True)

Для подготовки данных для обучения в MLLib мы используем VectorAssembler. Он позволяет преобразовать численные признаки в один вектор, который впоследствии будет подаваться на вход моделям.

from pyspark.ml.feature import MinMaxScaler
from pyspark.ml.feature import VectorAssembler

features = ['Pregnancies', 'Glucose', 'BloodPressure', 'SkinThickness', 'Insulin', 'BMI', 'DiabetesPedigreeFunction', 'Age']
assembler = VectorAssembler(
    inputCols=[x for x in df.columns if x in features],
    outputCol='features')
df = assembler.transform(df)
df.show(5)

+-----------+-------+-------------+-------------+-------+----+------------------------+---+-------+--------------------+
|Pregnancies|Glucose|BloodPressure|SkinThickness|Insulin| BMI|DiabetesPedigreeFunction|Age|Outcome|            features|
+-----------+-------+-------------+-------------+-------+----+------------------------+---+-------+--------------------+
|          6|    148|           72|           35|      0|33.6|                   0.627| 50|      1|[6.0,148.0,72.0,3...|
|          1|     85|           66|           29|      0|26.6|                   0.351| 31|      0|[1.0,85.0,66.0,29...|
|          8|    183|           64|            0|      0|23.3|                   0.672| 32|      1|[8.0,183.0,64.0,0...|
|          1|     89|           66|           23|     94|28.1|                   0.167| 21|      0|[1.0,89.0,66.0,23...|
|          0|    137|           40|           35|    168|43.1|                   2.288| 33|      1|[0.0,137.0,40.0,3...|

Нормируем фичи.

features_scaler = MinMaxScaler(inputCol = 'features', outputCol = 'features_norm')
fsc = features_scaler.fit(df)
df = fsc.transform(df)

Обучим классификатор на основе деревьев принятия решения.

from pyspark.ml.classification import DecisionTreeClassifier
 
dt = DecisionTreeClassifier(labelCol="Outcome", featuresCol="features_norm")
dt_model = dt.fit(df)
df = dt_model.transform(df)

Оценим точность классификатора.

from pyspark.ml.evaluation import MulticlassClassificationEvaluator

dt_evaluator = MulticlassClassificationEvaluator(labelCol="Outcome", predictionCol="prediction", metricName="accuracy")
dt_accuracy = dt_evaluator.evaluate(df)

dt_accuracy = 0.826

MLLib позволяет решать задачи классификации, регрессии, кластеризации. Отдельные методы разработаны для работы с текстами. Весь инструментарий можно посмотреть в приложении 1. Ссылка на ноутбук и данные в приложении 2 и 3.

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

На этом все. Удачи!

Приложения

  1. https://spark.apache.org/docs/1.5.0/ml-features.html

  2. https://colab.research.google.com/drive/1xpLPUzQTC8mlQk9tNX-2zRObRHXrsZBV?usp=sharing

  3. https://drive.google.com/file/d/1JJ_cBOClGCdHkdfghYRXss5V2sF4S_eN/view?usp=sharing

Теги:
Хабы:
Данная статья не подлежит комментированию, поскольку её автор ещё не является полноправным участником сообщества. Вы сможете связаться с автором только после того, как он получит приглашение от кого-либо из участников сообщества. До этого момента его username будет скрыт псевдонимом.