Pull to refresh

Распределенное машинное обучение с помощью 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

Tags:
Hubs:
You can’t comment this publication because its author is not yet a full member of the community. You will be able to contact the author only after he or she has been invited by someone in the community. Until then, author’s username will be hidden by an alias.