Существует несколько фреймворков для создания моделей машинного обучения. Популярным является машинное обучение PySpark (PySpark MLlib). PySpark особенно популярен при работе с большими наборами данных, но, конечно, работает и с меньшими наборами данных. В этом посте мы рассмотрим этапы создания вашей первой модели машинного обучения в PySpark.

Первый шаг — собрать ваши данные. Это можно сделать разными способами. Его можно прочитать из файла csv.

dataset = (spark.read
                .format(“csv”)
                .option(‘header’, ‘true’)
                .load(“data.csv”))

Данные также можно считывать из базы данных.

dataset = spark.sql("""
                     SELECT *
                     FROM database.table
                    """)

В этом посте будут использованы некоторые простые примеры данных. Набор данных содержит пол, вес и длину 20 мышей. Его можно сгенерировать с помощью следующего кода:

data = [{“gender”: 0, “weight”: 3.00, “length”: 11.00}, 
 {“gender”: 1, “weight”: 9.00, “length”: 15.00},
 {“gender”: 1, “weight”: 7.50, “length”: 16.50},
 {“gender”: 1, “weight”: 5.50, “length”: 14.50},
 {“gender”: 0, “weight”: 5.50, “length”: 16.50},
 {“gender”: 1, “weight”: 7.00, “length”: 16.00},
 {“gender”: 0, “weight”: 4.00, “length”: 12.00},
 {“gender”: 0, “weight”: 6.50, “length”: 15.50},
 {“gender”: 0, “weight”: 5.50, “length”: 10.50},
 {“gender”: 0, “weight”: 5.00, “length”: 10.00},
 {“gender”: 1, “weight”: 10.00, “length”: 20.00},
 {“gender”: 1, “weight”: 5.00, “length”: 14.00},
 {“gender”: 0, “weight”: 5.00, “length”: 16.00}, 
 {“gender”: 1, “weight”: 9.50, “length”: 15.50},
 {“gender”: 0, “weight”: 6.00, “length”: 15.00},
 {“gender”: 0, “weight”: 3.50, “length”: 11.50},
 {“gender”: 1, “weight”: 8.00, “length”: 19.00}, 
 {“gender”: 0, “weight”: 4.50, “length”: 12.50},
 {“gender”: 1, “weight”: 10.50, “length”: 20.50},
 {“gender”: 1, “weight”: 8.50, “length”: 19.50}]
dataset = spark.createDataFrame(data)

Чтобы проверить набор данных, чтобы он выглядел хорошо, его можно отобразить с помощью

dataset.show()
+------+------+------+
|gender|length|weight|
+------+------+------+
|     0|  11.0|   3.0|
|     1|  15.0|   9.0|
|     1|  16.5|   7.5|
|     1|  14.5|   5.5|
|     0|  16.5|   5.5|
|     1|  16.0|   7.0|
|     0|  12.0|   4.0|
|     0|  15.5|   6.5|
|     0|  10.5|   5.5|
|     0|  10.0|   5.0|
|     1|  20.0|  10.0|
|     1|  14.0|   5.0|
|     0|  16.0|   5.0|
|     1|  15.5|   9.5|
|     0|  15.0|   6.0|
|     0|  11.5|   3.5|
|     1|  19.0|   8.0|
|     0|  12.5|   4.5|
|     1|  20.5|  10.5|
|     1|  19.5|   8.5|
+------+------+------+

Если вы видите, что необходимо выполнить некоторую подготовку данных, может быть полезно следующее:

from pyspark.sql.functions import col
# Convert column_name to specific type, e.g. float 
dataset = dataset.select(col("column_name").cast("float"))
# Drop specific column 
dataset = dataset.drop("column_name")
# Drop na values
dataset = dataset.dropna(how='any')

Для примера набора данных все выглядит хорошо, поэтому мы готовы двигаться дальше.

Что-то, что отличается (по сравнению с другими фреймворками) от машинного обучения в spark, заключается в том, что все функции должны быть помещены в списочную структуру в одном столбце. Обратите внимание, что цель, которую мы прогнозируем, не должна быть включена сюда. Это делается с помощью VectorAssembler из библиотеки pyspark со следующим кодом для длины и веса примера:

from pyspark.ml.feature import VectorAssembler
feature_names = ["length", "weight"]
assembler = VectorAssembler(inputCols=feature_names, 
                            outputCol="features")
transformed_data = assembler.transform(dataset)
transformed_data.show()
+------+------+------+-----------+
|gender|length|weight|   features|
+------+------+------+-----------+
|     0|  11.0|   3.0| [11.0,3.0]|
|     1|  15.0|   9.0| [15.0,9.0]|
|     1|  16.5|   7.5| [16.5,7.5]|
|     1|  14.5|   5.5| [14.5,5.5]|
|     0|  16.5|   5.5| [16.5,5.5]|
|     1|  16.0|   7.0| [16.0,7.0]|
|     0|  12.0|   4.0| [12.0,4.0]|
|     0|  15.5|   6.5| [15.5,6.5]|
|     0|  10.5|   5.5| [10.5,5.5]|
|     0|  10.0|   5.0| [10.0,5.0]|
|     1|  20.0|  10.0|[20.0,10.0]|
|     1|  14.0|   5.0| [14.0,5.0]|
|     0|  16.0|   5.0| [16.0,5.0]|
|     1|  15.5|   9.5| [15.5,9.5]|
|     0|  15.0|   6.0| [15.0,6.0]|
|     0|  11.5|   3.5| [11.5,3.5]|
|     1|  19.0|   8.0| [19.0,8.0]|
|     0|  12.5|   4.5| [12.5,4.5]|
|     1|  20.5|  10.5|[20.5,10.5]|
|     1|  19.5|   8.5| [19.5,8.5]|
+------+------+------+-----------+

Перед обучением модели мы разделяем набор данных для обучения и тестирования данных с помощью следующего кода:

training_data, test_data = transformed_data.randomSplit([0.8,0.2])

Теперь мы готовы создать нашу модель. Это будет классификатор дерева решений (DecisionTreeClassifier (apache.org)), который предсказывает столбец пол. Итак, импортируем модель из библиотеки pyspark со следующим кодом:

from pyspark.ml.classification import DecisionTreeClassifier
dt = DecisionTreeClassifier(labelCol=’gender’, 
                            featuresCol=’features’,
                            maxDepth=5)

Теперь мы подгоняем/обучаем модель:

model = dt.fit(training_data)

И, наконец, мы прогнозируем, используя тестовый набор данных:

predictions = model.transform(test_data)
predictions.show()
+------+------+------+----------+----------+
|gender|length|weight|  features|prediction|
+------+------+------+----------+----------+
|     1|  15.0|   9.0|[15.0,9.0]|       1.0|
|     0|  12.0|   4.0|[12.0,4.0]|       0.0|
|     1|  15.5|   9.5|[15.5,9.5]|       1.0|
|     0|  15.0|   6.0|[15.0,6.0]|       1.0|
+------+------+------+----------+----------+

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

Теперь вы создали свою первую модель машинного обучения PySpark!