Verideki önemsiz / önemli özellikleri atmak / seçmek için R / Python'da mevcut yöntemler / uygulamalar nelerdir? Verilerimde etiket yok (denetimsiz).
Verilerin karışık tiplerle ~ 100 özelliği vardır. Bazıları sayısal, diğerleri ikili (0/1).
Verideki önemsiz / önemli özellikleri atmak / seçmek için R / Python'da mevcut yöntemler / uygulamalar nelerdir? Verilerimde etiket yok (denetimsiz).
Verilerin karışık tiplerle ~ 100 özelliği vardır. Bazıları sayısal, diğerleri ikili (0/1).
Yanıtlar:
Bir yaşında ama yine de alakalı olduğunu hissediyorum, bu yüzden sadece python Uygulamamı Temel Özellik Analizi (PFA) uygulamamda Charles'ın cevabına bağladığı makalede önerildiği gibi paylaşmak istedim .
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_]
Bu şekilde kullanabilirsiniz:
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_
Bu kesinlikle makalede açıklanan algoritmayı takip ediyor. Yöntemin vaat ettiğini düşünüyorum, ama dürüst olmak gerekirse, denetimsiz özellik seçimine en sağlam yaklaşım olduğunu düşünmüyorum. Daha iyi bir şey bulursam bir güncelleme gönderirim.
fit
Fonksiyonunuzun Adım 1'i atladığına ve orijinal veri kümesinde PCA gerçekleştirdiğine inanıyorum .
SPARCL R gerçekleştirir seyrek hiyerarşik ve seyrek K-ortalama kümelenme paket. Bu yararlı olabilir. http://www.ncbi.nlm.nih.gov/pmc/articles/PMC2930825/
Temel Özellik Analizi, denetimsiz özellik seçimine bir çözüm gibi görünüyor. Bu makalede açıklanmıştır .
Yararlı olabilecek bir bağlantı buldum, bunlar matlab uygulamaları, sizin için işe yarayabilirler http://www.cad.zju.edu.cn/home/dengcai/Data/MCFS.html Bu çok merkezli bir özellik seçimi yöntemi, son yazılarda bu konuda güçlü bir temel bulabilirsiniz.
İçinde birçok seçenek vardır R
. Bakmak için güzel bir yer, caret
diğer birçok pakete ve seçeneğe hoş bir arayüz sağlayan pakettir. Web sitesine buradan bakabilirsiniz . Orada birçok seçenek var, ama bir tanesini açıklayacağım.
Aşağıda R
"mtcars" veri kümelerini kullanan basit bir filtre kullanımına bir örnek verilmiştir (aşağıda gösterilmiştir).
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
Şimdi bazı kod ayarları (yükleme paketleri vb.):
# setup a parallel environment
library(doParallel)
cl <- makeCluster(2) # number of cores to use
registerDoParallel(cl)
library(caret)
Ve değişkenleri seçmek için basit bir modele sığabiliriz:
fit1 <- sbf(mtcars[, -1], mtcars[, 1],
sbfControl =
sbfControl(functions = rfSBF, method = "repeatedcv", repeats = 10)
)
Sonuçları inceleyerek şunu elde ederiz:
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)
Son olarak, seçilen değişkenleri (in fit1$optVariables
) sonuca göre çizebiliriz mpg
:
library(ggplot2)
library(gridExtra)
do.call(grid.arrange,
lapply(fit1$optVariables, function(v) {
ggplot(mtcars, aes_string(x = v, y = "mpg")) +
geom_jitter()
}))
Bu grafikte sonuç:
mpg
bir sonuç olarak kullanırsınız . Denetimsiz modellerde bu gibi yöntemleri kullanmanın bir yolu var mı?
nsprcomp
R paketi ihtiyaçlarınızı karşılayacak olabilir seyrek Temel Bileşenler Analizi için yöntemler sağlar.
Örneğin, özelliklerinizin genellikle doğrusal olarak ilişkili olduğunu düşünüyorsanız ve ilk beşi seçmek istiyorsanız, azami beş özellikle seyrek PCA çalıştırabilir ve ilk temel bileşenle sınırlayabilirsiniz:
m <- nsprcomp(x, scale.=T, k=5, ncomp=1)
m$rotation[, 1]
Alternatif olarak, özelliklerin dikey doğasını yakalamak istiyorsanız, en iyi beş bilgisayarın her birinden en iyi özelliği seçerek her bir bilgisayarı tek bir özellikle sınırlayabilirsiniz:
m <- nsprcomp(x, scale.=T, k=1, ncomp=5)
m$rotation
Bunlardan oluşan bir topluluk da yararlı olabilir; başka bir deyişle, farklı yöntemlerde sürekli olarak en üstte yer alan özelliklerin, özellik alanında büyük miktarda varyansı açıklaması muhtemeldir. nsprcomp
Biraz oynadıktan sonra , ilk iki yöntem aynı özelliklerin ~ 1 / 2'sini zirveye çıkarıyor gibi görünüyor. Bununla birlikte, bu süreci optimize etmek ampirik bir çaba olabilir.