Які доступні методи / реалізація в R / Python для відмови / вибору неважливих / важливих функцій у даних? Мої дані не мають міток (без нагляду).
Дані мають ~ 100 особливостей зі змішаними типами. Деякі є числовими, а інші - двійковими (0/1).
Які доступні методи / реалізація в R / Python для відмови / вибору неважливих / важливих функцій у даних? Мої дані не мають міток (без нагляду).
Дані мають ~ 100 особливостей зі змішаними типами. Деякі є числовими, а інші - двійковими (0/1).
Відповіді:
Це рік, але я все ще вважаю, що це актуально, тому я просто хотів поділитися моєю реалізацією питоном аналізу основних характеристик (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_
Це суворо дотримується описаного алгоритму зі статті. Я думаю, що метод обіцяє, але, чесно кажучи, я не думаю, що це найбільш надійний підхід до непідконтрольного вибору функцій. Я опублікую оновлення, якщо придумаю щось краще.
fit
функція пропускає крок 1 і виконує PCA на вихідному наборі даних .
Пакет sparcl в R виконує розріджену ієрархічну та рідкісну кластеризацію K-засобів. Це може бути корисно. http://www.ncbi.nlm.nih.gov/pmc/articles/PMC2930825/
Аналіз основних функцій виглядає як рішення для непідконтрольного вибору функцій. Це описано в цій роботі .
Я знайшов посилання, яке може бути корисним, це реалізації Matlab, вони можуть працювати для вас http://www.cad.zju.edu.cn/home/dengcai/Data/MCFS.html це вибір багатокластерних функцій метод, ви можете знайти міцну основу про це в останніх роботах. Повідомте мене, чи працює він для вас
Є багато варіантів, доступних в 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()
}))
Результат цього графіка:
mpg
як результат. Чи існує спосіб використання таких методів у непідконтрольних моделях?
У 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 одних і тих же можливостей до вершини. Однак, оптимізація цього процесу може бути емпіричним зусиллям.