2016-09-13 2 views
0

Я использую PCA из sckit-learn, и я получаю некоторые результаты, которые я пытаюсь интерпретировать, поэтому я поставил под вопрос - следует ли вычесть среднее значение (или выполнить стандартизацию) перед использованием PCA, или это каким-то образом встроено в реализацию sklearn?Масштаб до PCA

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

+1

Да, вы должны означают нормализацию. Кроме того, вам может понадобиться масштабировать ваши функции, если функции имеют очень разные диапазоны. Я часто использую 'sklearn.preprocessing.StandardScaler'. – MhFarahani

+0

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

+0

Правило большого пальца состоит в том, что если ваши данные уже находятся в другом масштабе (например, каждая функция равна XX на 100 жителей), масштабирование будет удалять информацию, содержащуюся в том, что ваши функции имеют неравные отклонения. Если данные находятся в разных масштабах, вы должны нормализовать их перед запуском PCA. Однако всегда центрируйте данные. Если вам нужна более подробная информация, я рекомендую проверить [перекрестный перехват] (http://stats.stackexchange.com/). – ursan

ответ

1

Я попытаюсь объяснить это на примере. Предположим, у вас есть набор данных, который включает в себя множество функций о жилье, и ваша цель - классифицировать, является ли покупка хорошей или плохой (двоичная классификация). Набор данных включает в себя некоторые категориальные переменные (например, местоположение дома, состояние, доступ к общественному транспорту и т. Д.) И некоторые числа с плавающей точкой или целые числа (например, рыночная цена, количество спален и т. Д.). Первое, что вы можете сделать, это кодировать категориальные переменные. Например, если у вас есть 100 местоположений в вашем наборе данных, общий способ - кодировать их от 0 до 99. Возможно, вы даже можете кодировать эти переменные в режиме горячего кодирования (т. Е. Столбец 1 и 0 для каждого местоположения) в зависимости от классификатора, который вы планируете использовать. Теперь, если вы используете цену в миллион долларов, функция цены будет иметь гораздо более высокую дисперсию и, следовательно, более высокое стандартное отклонение. Помните, что мы используем квадратное значение разницы от среднего для вычисления дисперсии. Более крупный масштаб создавал бы большие значения, а квадрат большой стоимости возрастал бы быстрее. Но это не означает, что цена несет значительно больше информации по сравнению с местом расположения. В этом примере, однако, PCA придаст очень большой вес функции цены, и, возможно, вес категориальных функций почти снизится до 0. Если вы нормализируете свои функции, это обеспечивает справедливое сравнение объясненной дисперсии в наборе данных. Таким образом, хорошей практикой является нормализация среднего значения и масштабирование функций перед использованием PCA.

0

Это действительно нетехнический ответ, но мой метод - попробовать оба, а затем посмотреть, какая из них учитывает больше вариантов на PC1 и PC2. Однако, если атрибуты находятся в разных масштабах (например, cm vs. feet vs. inch), вы должны определенно масштабировать до единицы дисперсии. В каждом случае вы должны центрировать данные.

Вот набор данных диафрагмы w/center и w/center + масштабирование. В этом случае центрирование приведет к более высокой объясненной дисперсии, поэтому я бы пошел с этим. Получил это от sklearn.datasets import load_iris данных. Опять же, PC1 имеет большую часть веса на center, поэтому шаблоны я нахожу в PC2 Я бы не подумал, что они значительны. С другой стороны, на center | scaled вес разделяется между PC1 и PC2, поэтому следует учитывать обе оси.

enter image description here enter image description here

Смежные вопросы