1. При предварительной обработке данных обучения и тестовых данных имеет ли значение предварительная обработка перед разделением или разделение перед предварительной обработкой?

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

Например, если он заполняет нули, предварительная обработка перед разделением или разделение перед предварительной обработкой не имеет значения.

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

2. Как правильно предварительно обработать категориальные признаки?

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

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

б. Кодирование значения: однократное кодирование.

Мы знаем, что тип даты категориальных признаков — строка. Горячее кодирование преобразует строки в двоичные векторы. Например, окрестности x, y, z можно преобразовать в:

[1, 0, 0, 0]

[0, 1, 0, 0]

[0, 0, 1, 0]

*последний 0 представляет окрестности всех остальных

Но будьте осторожны с этим методом. Когда есть много возможных значений для функции, векторы будут слишком длинными, что замедлит расчет. В нашем примере, если есть 500 видов соседства, длина векторов будет 501!

3. Проверка асимметрии (проверка нормальности)!

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

Чем более искажены данные, тем менее точные результаты они возвращают. Это почему? Взяв, например, цену продажи набора данных о ценах на жилье в Бостоне, как показывает график распределения, большинство цен расположены в нижней части.

Использование таких данных для обучения моей модели сделало бы модель неточной для элитных домов.

Я использовал log1p для нормализации распределения. Коды, как показано ниже:

$ SalePrice_normalized = np.log1p(SalePrice)
$ sns.distplot(SalePrice_normalized).set(xlabel=’SalePrice_normalized’)
$ plt.show()

В результате получилось то, что я хотел: