Перейти к содержимому

Обработка пропусков

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

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

Подробнее о том, как найти и удалить пропуски в таблице, см. раздел Пропущенные данные. Здесь речь идёт именно о подготовке данных перед машинным обучением.

С пропусками обычно делают одно из следующих действий:

  • удаляют строки с пропусками;
  • заменяют числовые пропуски средним значением;
  • заменяют числовые пропуски медианой;
  • заменяют пропуски заранее выбранной константой.

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

Imputer — это преобразователь, который заполняет пропущенные значения по выбранному правилу.

Imputer заполняет пропущенные значения

Идея такая:

  1. Imputer смотрит на данные и запоминает, чем заменять пропуски.
  2. Затем он применяет это правило и возвращает новую таблицу без пропусков в выбранных столбцах.

По умолчанию Imputer заполняет числовые пропуски средним значением по столбцу.

Другие варианты:

new Imputer(['Возраст']) // среднее значение
new Imputer(ImputeStrategy.isMedian, ['Возраст']) // медиана
new Imputer(0, ['Возраст']) // константа
new Imputer('Не указан', ['Отдел']) // строковая константа

Стратегии isMean и isMedian работают с числовыми столбцами. Константа подходит и для числовых, и для строковых, и для логических столбцов, если значение имеет подходящий тип.

uses MLABC;
begin
var df := DataFrame.FromCsvText('''
Имя,Возраст,Зарплата
Анна,28,90000
Борис,,85000
Вера,31,
Глеб,35,110000
''');
var imputer := new Imputer(['Возраст', 'Зарплата']);
var filled := imputer.FitTransform(df);
filled.Print;
end.

В этом примере Imputer заполняет пропуски в столбцах Возраст и Зарплата средними значениями:

  • для Возраст: среднее от 28, 31 и 35;
  • для Зарплата: среднее от 90000, 85000 и 110000.

Исходная таблица df не изменяется, результат сохраняется в новую переменную filled.

Вывод программы:

Имя Возраст Зарплата
Анна 28.00 90000.00
Борис 31.33 85000.00
Вера 31.00 95000.00
Глеб 35.00 110000.00

В примере выше используется короткая запись FitTransform: она сразу вычисляет значения для заполнения и применяет их к таблице.

То же самое можно записать в два шага:

var imputer := new Imputer(['Возраст', 'Зарплата']);
imputer.Fit(df);
var filled := imputer.Transform(df);

Fit вычисляет значения для замены пропусков. Transform применяет уже найденное правило и возвращает новую таблицу.

Позже, когда появится разбиение на обучающую и тестовую выборки, это разделение станет особенно важным: правило заполнения нужно будет вычислять по обучающим данным, а затем применять к другим данным. Это будет рассмотрено в разделе про TrainTestSplit.

  • Если пропусков очень мало, иногда достаточно удалить строки.
  • Для числовых столбцов часто используют среднее или медиану.
  • Для строковых и категориальных столбцов удобно использовать константу, например 'Не указан'.
  • Для машинного обучения лучше использовать Imputer, чтобы одинаково обрабатывать исходные и новые данные.