Методы в R или Python для выбора функций в обучении без учителя [закрыто]

11

Каковы доступные методы / реализации в R / Python для отбрасывания / выбора неважных / важных функций в данных? Мои данные не имеют меток (без надзора).

Данные имеют ~ 100 признаков со смешанными типами. Некоторые числовые, а другие двоичные (0/1).

ученик
источник
Какой тип алгоритма обучения без присмотра вы используете? Как выглядят ваши данные?
Макс Кандокия
@ user1362215, Прежде чем применять какой-либо неконтролируемый алгоритм, я пытаюсь найти способ выполнить удаление функции.
ученик
Вы видели этот scikit-Learn Cheatsheet раньше? Это может помочь вам начать ...
Стив S
Почему бы не использовать неконтролируемый метод, который выполняет выборку отдельно, как случайный лес в режиме без присмотра?
JEquihua
1
Я не совсем уверен, я имею в виду случайный лес совершенно непараметрический, так что не беспокойтесь о предположениях. Что я не уверен, так это то, что это послужит вашей цели. Я могу сказать, что существует версия Random Forest только для «обнаружения аномалий», называемая изолированными лесами: cs.nju.edu.cn/zhouzh/zhouzh.files/publication/… В R была реализация, но я не уверен, что он работает и работает как сейчас.
JEquihua

Ответы:

7

Ему уже год, но я все еще чувствую, что это актуально, поэтому я просто хотел поделиться своей реализацией Python анализа основных функций (PFA), предложенного в статье, с которой Чарльз связал в своем ответе.

from sklearn.decomposition import PCA
from sklearn.cluster import KMeans
from collections import defaultdict
from sklearn.metrics.pairwise import euclidean_distances
from sklearn.preprocessing import StandardScaler

class PFA(object):
    def __init__(self, n_features, q=None):
        self.q = q
        self.n_features = n_features

    def fit(self, X):
        if not self.q:
            self.q = X.shape[1]

        sc = StandardScaler()
        X = sc.fit_transform(X)

        pca = PCA(n_components=self.q).fit(X)
        A_q = pca.components_.T

        kmeans = KMeans(n_clusters=self.n_features).fit(A_q)
        clusters = kmeans.predict(A_q)
        cluster_centers = kmeans.cluster_centers_

        dists = defaultdict(list)
        for i, c in enumerate(clusters):
            dist = euclidean_distances([A_q[i, :]], [cluster_centers[c, :]])[0][0]
            dists[c].append((i, dist))

        self.indices_ = [sorted(f, key=lambda x: x[1])[0][0] for f in dists.values()]
        self.features_ = X[:, self.indices_]

Вы можете использовать это так:

import numpy as np
X = np.random.random((1000,1000))

pfa = PFA(n_features=10)
pfa.fit(X)

# To get the transformed matrix
X = pfa.features_

# To get the column indices of the kept features
column_indices = pfa.indices_

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

Ульф Аслак
источник
В методе, описанном в статье, на которую вы ссылаетесь, шаг 1 предназначен для вычисления ковариационной матрицы, а шаг 2 - для расчета PCA на ковариационной матрице из шага 1. Я полагаю, что ваша fitфункция пропускает шаг 1 и выполняет PCA для исходного набора данных. ,
user35581
@ user35581 хороший момент. Однако то, что они делают, - это (1) получить ковариационную матрицу из исходных данных, а затем (2) вычислить собственные векторы и собственные значения ковариационной матрицы, используя метод SVD. Эти два шага вместе - это то, что вы называете PCA. Принципиальные компоненты являются собственными векторами ковариационной матрицы исходных данных.
Ульф Аслак
@ Ульф Аслак, можете ли вы уточнить, почему вы думаете, что это не самый надежный подход к выбору неконтролируемых функций?
hipoglucido
1
@hipoglucido честно, я не могу объяснить свои мысли, когда я написал это. Это три года назад. Пересматривая код снова, я убежден, что он как-то связан с использованием KMeans (который не является детерминированным). Кроме того, я хотел бы увидеть, как это сравнивается с простой кластеризацией не-PCA-преобразованных функций.
Ульф Аслак
1

Анализ основных функций выглядит как решение для неконтролируемого выбора функций. Это описано в этой статье .

Макс Генис
источник
Ссылка мертва. Совместно с Python реализована реализация метода, предложенного в статье stats.stackexchange.com/a/203978/76815 .
Ульф Аслак
Спасибо, я удалил ссылку (она была удалена как не по теме).
Макс Генис
0

Я нашел ссылку, которая может быть полезна, это реализации Matlab, они могут работать для вас http://www.cad.zju.edu.cn/home/dengcai/Data/MCFS.html это выборка из нескольких кластеров метод, вы можете найти прочную основу об этом в последних работах. Дайте мне знать, если это работает для вас

formacero10
источник
0

Есть много вариантов, доступных в R. Хорошее место для поиска - это caretпакет, который обеспечивает хороший интерфейс для многих других пакетов и опций. Вы можете посмотреть на сайте здесь . Есть много вариантов, но я проиллюстрирую один.

Вот пример использования простого фильтра с использованием встроенных Rнаборов данных «mtcars» (показано ниже).

                   mpg cyl disp  hp drat    wt  qsec vs am gear carb
Mazda RX4         21.0   6  160 110 3.90 2.620 16.46  0  1    4    4
Mazda RX4 Wag     21.0   6  160 110 3.90 2.875 17.02  0  1    4    4
Datsun 710        22.8   4  108  93 3.85 2.320 18.61  1  1    4    1
Hornet 4 Drive    21.4   6  258 110 3.08 3.215 19.44  1  0    3    1

Теперь немного настройки кода (загрузка пакетов и т. Д.):

# setup a parallel environment
library(doParallel)
cl <- makeCluster(2) # number of cores to use
registerDoParallel(cl)
library(caret)

И мы можем подобрать простую модель для выбора переменных:

fit1 <- sbf(mtcars[, -1], mtcars[, 1],
  sbfControl =
    sbfControl(functions = rfSBF, method = "repeatedcv", repeats = 10)
)

Просматривая результаты, мы получаем:

fit1
Selection By Filter

Outer resampling method: Cross-Validated (10 fold, repeated 10 times) 

Resampling performance:

  RMSE Rsquared RMSESD RsquaredSD
 2.266   0.9224 0.8666     0.1523

Using the training set, 7 variables were selected:
   cyl, disp, hp, wt, vs...

During resampling, the top 5 selected variables (out of a possible 9):
   am (100%), cyl (100%), disp (100%), gear (100%), vs (100%)

On average, 7 variables were selected (min = 5, max = 9)

Наконец, мы можем построить выбранные переменные (in fit1$optVariables) в зависимости от результата mpg:

library(ggplot2)
library(gridExtra)
do.call(grid.arrange, 
lapply(fit1$optVariables, function(v) {
  ggplot(mtcars, aes_string(x = v, y = "mpg")) +
    geom_jitter()
}))

В результате на этом графике: точечные диаграммы

Джошуа
источник
1
Это не самообучаемое обучение по требованию OP, так как ваша модель использует mpgв качестве результата. Есть ли способ использовать такие методы в неконтролируемых моделях?
Макс Генис
0

Пакет nsprcompR предоставляет методы для разреженного анализа основных компонентов, которые могут удовлетворить ваши потребности.

Например, если вы считаете, что ваши функции обычно коррелируют линейно, и хотите выбрать первые пять, вы можете запустить разреженный PCA с максимум пятью функциями и ограничиться первым основным компонентом:

m <- nsprcomp(x, scale.=T, k=5, ncomp=1)
m$rotation[, 1]

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

m <- nsprcomp(x, scale.=T, k=1, ncomp=5)
m$rotation

Их также может быть полезно; т. е. объекты, которые последовательно достигают вершины по различным методам, могут объяснить большую разницу в пространстве признаков. Поэкспериментировав nsprcompнемного, кажется, что первые два метода поднимают ~ 1/2 из тех же функций на вершину. Тем не менее, оптимизация этого процесса может быть эмпирическим усилием.

Макс Генис
источник