Улучшение предсказуемости и классификации по одному параметру за раз! «Визуализируйте» 30 измерений с помощью 2D-графика!

Не забудьте подписаться на мой профиль, если вам понравилась эта статья и вы хотите увидеть больше!

Настраивать

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

wdbc <- read.csv("wdbc.csv", header = F)
features <- c("radius", "texture", "perimeter", "area", "smoothness", "compactness", "concavity", "concave_points", "symmetry", "fractal_dimension")
names(wdbc) <- c("id", "diagnosis", paste0(features,"_mean"), paste0(features,"_se"), paste0(features,"_worst"))

Приведенный выше код просто загрузит данные и назовет все 32 переменные. ID, диагноз и десять отдельных (30) функций. От UCI:

«Были вычислены среднее, стандартная ошибка и« наихудшее »или наибольшее (среднее из трех наибольших значений) этих характеристик. для каждого изображения, в результате получается 30 функций. Например, поле 3 - это средний радиус, поле 13 - радиус SE, поле 23 - худший радиус ».

Почему СПС?

Итак, теперь мы загрузили наши данные и обнаружили 30 переменных (исключая, таким образом, наш ответ «диагноз» и нерелевантную переменную ID).

Кто-то из вас может сказать «30 переменных - это много», а кто-то может сказать «Пфф ... Только 30? Я работал с ТЫСЯЧАМИ !! » но будьте уверены, что это одинаково применимо в любом сценарии ..!

Есть несколько веских причин использовать PCA. График в самом начале статьи - отличный пример того, как можно построить многомерные данные с помощью PCA, мы фактически фиксируем 63,3% (Dim1 44,3% + Dim2 19%) дисперсии в всего набора данных, просто используя эти два основных компонента, что довольно неплохо, если учесть, что исходные данные состояли из 30 функций, которые невозможно было бы построить сколько-нибудь значимым образом.

Очень важно признать, что мы никогда не указывали переменную ответа или что-либо еще на нашем графике PCA, указывающее, была ли опухоль «доброкачественной» или «злокачественной». ». Просто выясняется, что когда мы пытаемся описать дисперсию данных с помощью линейных комбинаций PCA, мы обнаруживаем довольно очевидную кластеризацию и разделение между «доброкачественными» и «злокачественными «Опухоли! Это отличный повод для разработки модели классификации, основанной на наших особенностях!

Еще одна важная «особенность» (без каламбура) PCA заключается в том, что она может напрямую улучшить производительность ваших моделей. Пожалуйста, прочтите эту замечательную статью, чтобы узнать больше:



Что такое PCA и как оно работает?

Давайте сразу решим кое-что, основная цель PCA - НЕ как способ удаления функций! PCA может уменьшить размерность, но он не уменьшит количество функций / переменных в ваших данных. Это означает, что вы можете обнаружить, что вы можете объяснить 99% дисперсии в своем наборе данных 1000 объектов, просто используя 3 основных компонентов, но вам по-прежнему нужны эти 1000 функций для построения этих 3 основных компонентов, это также означает, что в случае прогнозирования будущих данных вам все равно понадобятся те же 1000 функций в ваших новых наблюдениях для построения соответствующих основных компонентов.

Хорошо, достаточно этого, как это работает?

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

  • Стандартизируйте данные (центр и масштаб).
  • Вычислите собственные векторы и собственные значения из ковариационной матрицы или корреляционной матрицы (можно также использовать разложение по сингулярным векторам).
  • Отсортируйте собственные значения в порядке убывания и выберите K наибольших собственных векторов (где K - желаемое количество измерений подпространства новых функций k ≤ d ).
  • Постройте матрицу проекции W из выбранных K собственных векторов.
  • Преобразуйте исходный набор данных X через W , чтобы получить подпространство Y K -мерного объекта.

Это может показаться немного сложным, если у вас не было нескольких курсов по алгебре, но суть заключается в том, чтобы преобразовать наши данные из исходного состояния X в подпространство Y с размерами K, где K - чаще, чем нет - меньше чем исходные размеры X. К счастью, это легко сделать с помощью R!

PCA на наших данных опухоли

Итак, теперь мы немного понимаем, как работает PCA, и на данный момент этого должно быть достаточно. Давайте на самом деле попробуем:

wdbc.pr <- prcomp(wdbc[c(3:32)], center = TRUE, scale = TRUE)
summary(wdbc.pr)

Это довольно очевидно, функция 'prcomp' запускает PCA для данных, которые мы ей предоставляем, в нашем случае это 'wdbc [c (3:32)]' это наши данные, за исключением переменных идентификатора и диагностики, затем мы говорим R центрировать и масштабировать наши данные (таким образом, стандартизируя данные). Наконец, мы призываем к подведению итогов:

Напомним, что свойство PCA состоит в том, что наши компоненты отсортированы от наибольшего к наименьшему с учетом их стандартного отклонения (Собственные значения). Итак, давайте разберемся с этим:

  • Стандартное отклонение. В нашем случае это просто собственные значения, поскольку данные были центрированы и масштабированы (стандартизированы).
  • Пропорция дисперсии: это величина дисперсии, которую компонент учитывает в данных, т. е. На PC1 приходится ›44% общей дисперсии одних только данных!
  • Суммарная доля: это просто накопленная величина объясненной дисперсии, т. е. если бы мы использовали первые 10 компонентов, мы смогли бы учесть ›95% общей дисперсии данных.

Итак, сколько компонентов нам нужно? Мы, очевидно, хотим иметь возможность объяснить как можно больше отклонений, но для этого нам потребуются все 30 компонентов, в то же время мы хотим уменьшить количество измерений, поэтому мы определенно хотим меньше 30!

Поскольку мы стандартизировали наши данные и теперь у нас есть соответствующие собственные значения каждого ПК, мы можем использовать их, чтобы провести для нас границу. Поскольку собственные значения ‹1 означало бы, что компонент фактически объясняет менее одной объясняющей переменной, мы бы хотели их отбросить. Если наши данные хорошо подходят для PCA, мы сможем отбросить эти компоненты, сохранив при этом не менее 70–80% совокупной дисперсии. Давайте построим и посмотрим:

screeplot(wdbc.pr, type = "l", npcs = 15, main = "Screeplot of the first 10 PCs")
abline(h = 1, col="red", lty=5)
legend("topright", legend=c("Eigenvalue = 1"),
       col=c("red"), lty=5, cex=0.6)
cumpro <- cumsum(wdbc.pr$sdev^2 / sum(wdbc.pr$sdev^2))
plot(cumpro[0:15], xlab = "PC #", ylab = "Amount of explained variance", main = "Cumulative variance plot")
abline(v = 6, col="blue", lty=5)
abline(h = 0.88759, col="blue", lty=5)
legend("topleft", legend=c("Cut-off @ PC6"),
       col=c("blue"), lty=5, cex=0.6)

Мы замечаем, что первые 6 компонентов имеют собственное значение ›1 и объясняют почти 90% дисперсии, это здорово! Мы можем эффективно уменьшить размерность с 30 до 6, «теряя» лишь около 10% дисперсии!

Мы также замечаем, что на самом деле можем объяснить более 60% отклонений только первыми двумя компонентами. Давайте попробуем изобразить это:

plot(wdbc.pr$x[,1],wdbc.pr$x[,2], xlab="PC1 (44.3%)", ylab = "PC2 (19%)", main = "PC1 / PC2 - plot")

Хорошо, это не слишком многозначительно, но подумайте на мгновение, что это составляет 60% + дисперсии в 30-мерном наборе данных. Но что мы из этого видим? В верхнем / среднем правом углу происходит некая кластеризация. Давайте также на минутку рассмотрим, какова на самом деле цель этого анализа. Мы хотим объяснить разницу между злокачественными и доброкачественными опухолями. Давайте добавим к графику переменную ответа (диагностика) и посмотрим, сможем ли мы ее лучше понять:

library("factoextra")
fviz_pca_ind(wdbc.pr, geom.ind = "point", pointshape = 21, 
             pointsize = 2, 
             fill.ind = wdbc$diagnosis, 
             col.ind = "black", 
             palette = "jco", 
             addEllipses = TRUE,
             label = "var",
             col.var = "black",
             repel = TRUE,
             legend.title = "Diagnosis") +
  ggtitle("2D PCA-plot from 30 feature dataset") +
  theme(plot.title = element_text(hjust = 0.5))

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

Что дальше?

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

Мы рассмотрим это в следующей статье:



Заключительное слово

Если вы хотите увидеть и узнать больше, не забудьте подписаться на меня на Medium 🔍 и Twitter 🐦



Дополнительные ресурсы: