Для всех, кто хочет стать инженером по машинному обучению (или учеником), очевидна следующая истина: вы тратите большую часть своего времени на предварительную обработку данных. В конце концов, кодировать архитектуру просто после нескольких тренировок, а благодаря современной библиотеке, такой как Pytorch и Keras, вы можете легко кодировать сложную архитектуру без особых усилий. Однако предварительная обработка этих изображений или CSV-документов в формате данных, который вы хотите использовать, всегда проблематична. В этой статье представлен простой способ предварительной обработки CSV-документа в соответствии с вашими потребностями.

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

Прежде всего, как загрузить документ csv? Один из способов — использовать pandas. Например, следующий код загружает CSV-документ по указанному вами пути:

Далее, давайте посмотрим на набор данных, который у нас есть:

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

Разделение между поездами и тестами

Первое, что вам нужно сделать, это разделить набор данных на набор поездов и набор тестов. На самом деле существует множество способов сделать это, и самый простой способ:

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

Отдельный ярлык от набора данных

Эта часть довольно проста. Вы можете отделить метку от набора данных с помощью функции drop(). Обратите внимание, эта функция не изменит исходный набор данных, который у вас есть, но вернет новый набор данных без удаленного столбца.

Числовая предварительная обработка

Теперь самое интересное, мы хотим обработать наши числовые значения в наборе данных. Нам нужно сделать несколько вещей: во-первых, нам нужно заменить пропущенные значения; во-вторых, нам необходимо стандартизировать наши ценности.

Замена отсутствующих значений

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

Совершенно просто! Сначала мы избавляемся от нечисловых атрибутов, затем просто подгоняем импутер к нашим данным и преобразуем наши данные, заменяя отсутствующие значения медианой. Наконец, мы преобразуем наш замененный набор данных обратно в фрейм данных pandas для согласованности.

Стандартизировать

Этот шаг еще проще!

Просто импортируйте StandardScaler из sklearn.preprocessing и fit_transform() набора данных, который у нас есть. Сделанный!

Нечисловой предварительный процесс

Далее нам нужно обработать нечисловые атрибуты. По сути, все, что мы хотим сделать, это преобразовать нечисловые атрибуты в числовые категории, а затем закодировать их с помощью горячего кодировщика. Причина, по которой мы хотим использовать однократное кодирование, заключается в том, что числовые категории могут указывать на числовую корреляцию между различными категориями (алгоритм может думать: может быть, категория 1 похожа на категорию 2 по сравнению с категорией 5) и (в большинстве случаев) мы действительно не хочу. К счастью, у sklearn есть отличные модули именно для этой цели:

Сделанный! Это все, что вам нужно сделать! И последнее, тип данных housing_cat_1hot на самом деле является разреженной матрицей, и если вы хотите объединить этот массив после числового массива (помните его? массив housing_num_scaled на предыдущем шаге), вы должны преобразовать housing_cat_1hotв плотный массив, вызвав housing_cat_1hot.todense(). Теперь вы можете объединить его с помощью numpy.concatenate() и передать в свою нейронную сеть.

Одна последняя вещь! Обязательно сделайте точно такую ​​же предварительную обработку для ваших тестовых данных, иначе вы все испортите!

И последнее. Если вы хотите узнать больше о предварительной обработке данных, посмотрите Практическое машинное обучение с помощью Scikit-Learn, Keras и Tensorflow!