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