В этом видео мы поговорим про работу с пропусками. Эта задача решается в большинстве своем методами обучения без учителя. Однако она актуальна и во многих задачах обучения с учителем. Представьте, что у вас есть матрица X и какие-то значения этой матрицы пропущены. Например, можно представить, что строки этой матрицы — это пользователи «КиноПоиска», а столбцы — это разные фильмы. Соответственно элементы матрицы — это оценки, которые пользователи выставляют фильмам. Большая часть людей не посмотрела всех фильмов. Более того, скорей всего, большая часть людей посмотрела какую-то маленькую долю фильмов из всех, что есть в базе «КиноПоиска». Поэтому в нашей матрице X такой, будет огромное количество неизвестных значений. Можно ли пропуски в такой матрице как-то заполнить? Еще одна задача. Если матрица X — это матрица объекты-признаки, на которые мы дальше хотим как-то делать классификацию или регрессию, и в этой матрице есть пропуски. Как это правильно делать? Ключевое предположение всех методов работы с пропусками — это что пропуски матрицы расположены случайно. Это предположение очень сильное и в каждой задаче нужно проверять, действительно ли оно выполняется. Примеры задач, в которых оно заведомо не выполняется, можно привести такие. Представьте, что вы делаете какой-то опрос и среди списка вопросов, которые вы задаете вашим респондентам, есть вопрос про годовой доход. Не все респонденты могут захотеть на этот вопрос отвечать. Более того, может оказаться так, что респонденты с большим годовым доходом чаще будут отказываться отвечать на этот вопрос и тогда в вашей итоговой матрице, которая по итогам опроса у вас составится, будут неслучайные пропуски. Еще один классический пример, взятый из практики венгерского статистика Абрахама Вальда, который работал в США во время второй мировой войны и анализировал повреждения самолетов, которые возвращались с бомбардировок. На основании этого анализа принималось решение о том, какие части самолетов нужно укрепить. Нельзя укрепить весь самолет целиком, потому что от этого он будет плохо летать, поэтому нужно как-то выбрать, какие части самолетов важнее всего. Для того чтобы это понять, собиралась статистика о количестве пулевых отверстий в разных частях самолетов. Это задача, в которой пропуски не просто не случайны, а несут в себе самую важную информацию о нашем признаке, потому что самолеты, которые не возвращаются с боевых действий, получили как раз наиболее критические повреждения. Поэтому Вальд принял решение о том, что укреплять нужно те части самолетов, в которых... на самолетах, которые вернулись, повреждений меньше всего. Эти примеры показывают, что всегда нужно следить за выполнением предположения о случайности пропусков. А теперь давайте разберем, что можно сделать с матрицей X в условиях, когда это предположение выполняется. Ну, во-первых, самый простой способ — можно выбрасывать те объекты, на которых значение хотя бы одного из признаков пропущено. Перед этим, пожалуй, стоит избавиться от признаков, у которых очень много пропусков. Потому что иначе вы оставите себя совсем без выборки. Этот способ очень прост, но, кажется, что он не очень хорош, потому что вы выбрасываете информацию. Поскольку вы исключаете объекты на которых какие-то признаки все-таки померяны. Другая крайность работы с пропусками — это методы, которые эти пропуски пытаются заполнить. Это можно делать большим количеством разных способов. Например, для каждого объекта, для каждой строки xi1, в которой есть хотя бы один пропуск, вы находите самую похожую на нее строку xi2, в смысле какой-то функции потери, и заменяете пропущенное значение в xi1 на соответствующее значение из xi2. Другая крайность — это заполнение пропусков средними или медианами по столбцу. Таким образом, вы не используете никакой информации об объекте, а используете только среднее значение признака во всей вашей выборке. Эти две крайности сочетает друг с другом EM-алгоритм. EM-алгоритм предполагает, что полные данные каким-то образом распределены. Например, имеют совместное многомерное нормальное распределение. И по имеющимся данным оценивает среднее и ковариационную матрицу признаков у этого распределения. Затем пропуски заполняются наиболее вероятными значениями в соответствии с полученной оценкой распределения. Этот процесс повторяется несколько раз, то есть после заполнения пропусков, вы переоцениваете параметры распределения. После получения новых параметров распределения вы заново заполняете пропуски. И так, пока процесс не сойдется. Еще один способ заполнения пропусков — это матричное разложение. Вы можете представить вашу большую разреженную матрицу в виде произведения двух плотных матриц меньшего ранга, а затем пропуски в исходной матрице представить, как значение матрицы X с крышкой равное произведению ваших маленьких матриц. Все эти методы немного подозрительны, поскольку информация в них берется как будто бы ниоткуда. Действительно, у вас были объекты, на которых значения признака было неизвестно, а затем после каких-то магических манипуляций, оно вдруг стало известным. Как это произошло? И правильно ли это? В некоторых задачах, вроде линейной регрессии или метода главных компонент, можно обойтись вовсе без заполнения пропусков. В таких задачах часто матрица объекты-признаки X используется только для подсчета величин вида 1 / l (X транспонированное X), или 1 / l (X транспонированное Y). Значение вот таких матриц можно вычислять только по полным парам, то есть для каждого jk-го элемента матрицы X транспонированное X мы будем считать вот эту сумму только по тем парам X ij-ое, X jk-ое, которые обе не равны NA, то есть они обе не пропущены. И делить будем соответственно не на l, а на число полных пар. При использовании таких методов у вас информация никуда не исчезает, и не появляется ниоткуда. Кажется, что когда этот метод применим, он оптимален. Давайте обсудим еще несколько деталей в задаче заполнения пропусков. Если у вас есть категориальные переменные, некоторые здесь значения которые пропущены, вот эти пропуски удобно закодировать просто отдельной категорией. Этот метод работает, в том числе и для ситуации, когда пропуски у вас неслучайны. Если вы работаете с деревьями или лесами и у вас пропущены значения в каких-то непрерывных признаках, то заполнить их можно каким-то значением, которое сильно отличается от всех типичных значений, значений признака. Например, какими-то очень большими отрицательными признаками. Если вы так поступите, то эти значения будут попадать на ваших деревьях в отдельный лист, и будут обрабатываться отдельно. Заполнение пропусков — это задача творческая. Поэтому к ней нужно подходить вдумчиво в каждой конкретной задаче анализа данных. Если вы используете какой-то метод обучения с учителем и в вашей матрице объекты-признаки есть пропуски, всегда следите за тем, какой метод обработки пропусков зашит по умолчанию в метод, который вы хотите применить. Например, в большей части методов, которые реализуют линейную регрессию, по умолчанию зашито отбрасывание объектов, на которых есть пропуски — не очень хороший метод. Например, в методе xgboost по умолчанию используется какой-то свой собственный, достаточно сложный метод обработки пропусков и, таким образом, метод xgboost можно использовать с пропусками менее вдумчиво. В этом видео мы поговорили про пропуски в матрице X и о том, как в разных ситуациях эти пропуски либо нельзя игнорировать, либо можно заполнять, либо можно выбрасывать, либо можно обрабатывать как-то еще по-другому. Если вы анализируете данные, в которых есть пропуски, имеет смысл посвятить какое-то время обдумыванию того, как их правильно обработать. За счет этого часто можно получить существенный выигрыш, что видно, например, на многих конкурсах, на сайте кэгл.