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

Завершено

Прежде чем создать модель машинного обучения, необходимо подготовить данные, которые будут использоваться для обучения и оценки. Данные используются в Azure Databricks из источника, часто как файлы данных. При необходимости можно создавать разностные таблицы на основе файлов данных, чтобы упростить изучение и анализ данных. После приема данных специалист по обработке данных подготавливает его к машинному обучению.

Как правило, подготовка данных включает две ключевые задачи:

  • Очистка данных: выявление и устранение проблем в данных, которые повлияют на его полезность для машинного обучения.
  • Проектирование функций и предварительная обработка: выбор и преобразование подходящих функций для обучения модели.

Очистка данных

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

  • Неполные данные: данные часто включают записи, в которых отсутствуют отдельные поля (часто указываются на наличие значений NULL). Необходимо определить отсутствующие значения и устранить их следующими способами:
    • Подстановка их подходящей заменой — путем интерполяции значения в ряде, использования среднего (или медиана) или создания другого соответствующего значения.
    • Удаление неполных строк полностью (если это оставляет достаточно подходящих репрезентативных данных для моделирования)
  • Ошибки. Это не редкость для данных для включения ошибок, вызванных ошибками ввода данных или сбоем вышестоящий обработке данных. Поиск ошибок может быть сложным, и обычно включает в себя существенное внимание к данным с помощью запросов и визуализаций, чтобы суммировать данные и искать значения, которые не соответствуют большинству других значений в заданном поле.
  • Выпадающие: outliers — это значения, которые значительно находятся вне (выше или ниже) статистического распределения данных. Иногда выбросы являются признаком ошибки (например, кто-то может иметь значение с дополнительным нулем или опущен десятичной запятой), а иногда они являются подлинными значениями, которые являются необычно высокими или низкими по сравнению с большинством наблюдений. В любом случае экстремальные выбросы могут негативно повлиять на обучение модели машинного обучения; Поэтому обычно лучше всего обрабатывать их, сбрасывая их на верхнее или нижнее пороговое значение, или путем удаления записей, содержащих исходящие данные из набора данных.
  • Неправильные типы данных: алгоритмы машинного обучения могут быть чувствительны к типам данных, назначенным значениям признаков. Обычно для наборов данных, основанных на текстовых файлах, содержащих ошибки или значения NULL, для неправильного переключения числовых полей в строковый тип данных, и часто значения, представляющие дискретные целые значения, могут быть неправильно переадресовано десятичными числами (или наоборот). Необходимо проверить схему данных и назначить соответствующие типы данных, которые наиболее эффективно отражают значения данных.
  • Несбалансированные данные: обучение машинного обучения лучше всего подходит, если данные обучения имеют достаточное представление для всех различных сочетаний функций и меток, которые могут возникнуть. В небалансированном наборе данных записи, включающие определенное категориальное значение или сочетание полей, представляются чрезмерно; которые могут повлиять на алгоритм обучения и ввести предвзятость в модель. Распространенный способ устранения этой проблемы заключается в переустранке недостаточно представленных значений путем включения повторяющихся строк или перенастраивать слишком представленные строки (удалив их из набора данных).

В Azure Databricks наиболее распространенный способ обнаружения и обработки этих проблем заключается в написании кода в записной книжке, которая изучает и управляет данными. Основной класс, используемый для такого рода манипуляции данными, — это кадр данных Spark.

Например, следующий код загружает данные из текстового файла в кадр данных:

df = spark.read.format("csv").option("header", "true").load("/myfolder/mydata.csv")

Кроме того, если данные были загружены в разностную таблицу в рабочей области Azure Databricks, можно использовать SQL-запрос для загрузки данных в кадр данных:

df = spark.sql("SELECT * FROM mytable")

После загрузки данных в кадр данных можно использовать его методы и другие функции в библиотеке SQL Spark для изучения и преобразования данных. Например, следующий код использует метод dropna для удаления строк, включающих значения NULL, и назначает определенные типы данных столбцам в кадре данных.

clean_data = df.dropna().select(col("column1").astype("string"),
                                col("column2").astype("float"))

Совет

Дополнительные сведения о функциях кадра данных Spark см. в документации по кадрам данных Spark.

Проектирование компонентов и предварительная обработка

После завершения и очистки набора данных можно приступить к подготовке функций для машинного обучения. Проектирование признаков — это итеративный подход, который часто включает в себя некоторые пробные и ошибки, чтобы определить, какие столбцы признаков имеют прогнозное значение и как лучше представлять функции. К общим задачам по проектированию функций и предварительной обработке относятся:

  • Производные новые функции: часто вы можете наследить новые, более прогнозные функции от существующих. Например, предположим, что набор данных содержит столбец даты , и вы подозреваете, что дата завершения не может быть важным прогнозным фактором для идентификации метки, но день недели может быть. Вы можете создать новую функцию day_of_week , производную от даты и проверить теорию.

  • Дискретизация числовых признаков: в некоторых случаях числовое значение может оказаться более прогнозным при дискретизации в категории, представляющие определенные диапазоны значений. Например, можно принимать числовые значения в функции цен и назначать их на низкие, средние и высокие категории на основе соответствующих пороговых значений.

  • Категориальные признаки кодировки: многие наборы данных включают категориальные данные, представленные строковыми значениями. Однако большинство алгоритмов машинного обучения лучше всего работают с числовыми данными. Поэтому обычно присваивать числовые коды для представления категорий вместо строк. Например, набор данных сведений о продукте может включать функцию цвета, которая может иметь значение "Зеленый", "Красный" или "Синий". Эти значения можно закодировать с помощью простых целых чисел, таких как 0 для "Зеленый", 1 для "Красный" и 2 для "Синий". Кроме того, можно использовать метод одно горячей кодировки , в котором создается новый столбец для каждой возможной категории, и присвоить значение 1 или 0 каждому столбцу соответствующим образом для каждой строки, как показано ниже.

    Исходный столбец цвета Зеленый Красный Синий
    Зеленый 1 0 0
    Синий 0 0 1
    Красный 0 1 0
  • Числовые значения масштабирования (нормализация). Числовые значения данных часто находятся в разных масштабах или единицах измерения друг от друга. Алгоритмы машинного обучения обрабатывают их все как абсолютные числовые значения, а функции с большими значениями часто могут доминировать в обучении модели. Для решения этой проблемы обычно масштабируются все числовые столбцы, чтобы отдельные значения для одного столбца сохраняли одинаковую пропорциональную связь друг с другом, но все числовые столбцы находятся в аналогичном масштабе. Например, предположим, что набор данных содержит значения длины и веса , измеряемые в метрах и килограммах. Оба этих компонента можно преобразовать в масштабируемое значение в диапазоне от 0 до 1, как показано ниже:

    length вес scaled_length scaled_weight
    250.0 2.1 0,250 0.210
    176.0 0,9 0.176 0,09

Многие библиотеки машинного обучения включают классы, которые можно использовать для выполнения общих задач проектирования признаков. Например, библиотека Spark MLlib включает класс StringIndexer , который можно использовать для выполнения простой кодировки на основе целых чисел для строковых значений.

from pyspark.ml.feature import StringIndexer

encoder = StringIndexer(inputCol="catCol", outputCol="catColCode")
encoded_data = encoder.fit(data).transform(data)

Примечание.

Стоит более подробно объяснить пример кода StringIndexer. Классы Spark MLlib могут включать вычислители, которые соответствуют алгоритму для определенной операции преобразования в некоторые образцы данных. В этом случае StringIndexer соответствует алгоритму кодирования дискретным строковым значениям в столбце catCol в кадре данных, чтобы определить конкретные вычисления, необходимые для создания нового столбца catColCode, содержащего закодированные значения. Выходные данные вычислителя — это преобразователь , который инкапсулирует функцию, определенную вычислителем, и которая может применить ее к данным и создать новый кадр данных. В этом примере мы передаем те же данные, которые используются для определения функции кодирования в результирующий преобразователь, чтобы фактически применить кодировку.

В Spark MLLib можно объединить последовательность вычислителей и преобразователей в конвейере , который выполняет все этапы разработки компонентов и предварительной обработки данных. Конвейер может завершиться алгоритмом машинного обучения, который выступает в качестве вычислителя для определения операций, необходимых для прогнозирования метки из подготовленных функций. Выходные данные конвейера — это модель машинного обучения, которая фактически является преобразователем, который можно использовать для применения функции модели к функциям в кадре данных и прогнозирования соответствующих значений меток.