Методи в R або Python для вибору функції в непідконтрольному навчанні [закрито]


11

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

Дані мають ~ 100 особливостей зі змішаними типами. Деякі є числовими, а інші - двійковими (0/1).


Який алгоритм навчання без нагляду ви використовуєте? Як виглядають ваші дані?
Макс Кандокія

@ user1362215, Перш ніж застосувати будь-який непідтримуваний алгоритм, я намагаюся знайти спосіб видалення функції.
учень

Ви бачили цей чіт-лист для наукових робіт раніше? Це може допомогти вам розпочати роботу ...
Стів S

Чому б не скористатися непідконтрольним методом, який віддає парфуми сам по собі, як випадковий ліс в непідконтрольному режимі?
JEquihua

1
Я не повністю впевнений, я маю на увазі випадковий ліс абсолютно не параметричний, тому не турбуйтеся про припущення. Я не впевнений, що це буде служити вашим цілям. Я можу сказати, що існує версія Random Forest саме для "виявлення аномалії" під назвою ліси ізоляції: cs.nju.edu.cn/zhouzh/zhouzh.files/publication/… в R була реалізація, але я не впевнений, чи працює він зараз.
JEquihua

Відповіді:


7

Це рік, але я все ще вважаю, що це актуально, тому я просто хотів поділитися моєю реалізацією питоном аналізу основних характеристик (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 на вихідному наборі даних .
користувач35581

@ user35581 хороший момент. Однак те, що вони роблять, - це (1) виготовити коваріаційну матрицю з вихідних даних, а потім (2) обчислити власні вектори та власні значення матриці коваріації за допомогою методу SVD. Ці два кроки у поєднанні - це те, що ви називаєте PCA. Компоненти принципу - це власні вектори матриці коваріації вихідних даних.
Ульф Аслак

@Ulf Aslak Ви можете пояснити, чому ви вважаєте, що це не найбільш надійний підхід до непідконтрольного вибору функцій?
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 це вибір багатокластерних функцій метод, ви можете знайти міцну основу про це в останніх роботах. Повідомте мене, чи працює він для вас


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
Це не нагляд за навчанням, як вимагає ОП, оскільки ви використовуєте модель mpgяк результат. Чи існує спосіб використання таких методів у непідконтрольних моделях?
Макс Ghenis

0

У nsprcompпакеті R передбачені методи для аналізу розрізнених основних компонентів, які можуть відповідати вашим потребам.

Наприклад, якщо ви вважаєте, що ваші функції, як правило, лінійно співвідносяться і хочете вибрати першу п'ятірку, ви можете запустити рідкісний 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 одних і тих же можливостей до вершини. Однак, оптимізація цього процесу може бути емпіричним зусиллям.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.