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