Denetimsiz öğrenmede özellik seçimini gerçekleştirmek için R veya Python'daki yöntemler [kapalı]


11

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).


Ne tür denetimsiz öğrenme algoritması kullanıyorsunuz? Verileriniz neye benziyor?
Max Candocia

@ user1362215, Herhangi bir denetimsiz algoritma uygulamadan önce, özellik kaldırma gerçekleştirmek için bir yol bulmaya çalışıyorum.
Öğrenci

Bu scikit-öğren hile sayfasını daha önce gördün mü ? Başlamanıza yardımcı olabilir ...
Steve S

Neden gözetimsiz modda rastgele orman gibi özellik seçimini gerçekleştiren gözetimsiz bir yöntem kullanmıyorsunuz?
JEquihua

1
Tamamen emin değilim, yani rastgele orman tamamen parametrik değil, bu yüzden varsayımlar için endişelenmeyin. Emin olmadığım, amacınıza hizmet edip etmeyeceğidir. Söyleyebileceğim, izolasyon ormanları olarak adlandırılan "anomali tespiti" için Rastgele Orman'ın bir sürümü olduğu: cs.nju.edu.cn/zhouzh/zhouzh.files/publication/… R'de bir uygulama vardı ama ben şu an çalışıp çalışmadığından emin değilim.
JEquihua

Yanıtlar:


7

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.


Bağlantı verdiğiniz makalede açıklanan yöntemde, Adım 1 kovaryans matrisini hesaplamak ve adım 2, Adım 1'deki kovaryans matrisinde PCA'yı hesaplamaktır. fitFonksiyonunuzun Adım 1'i atladığına ve orijinal veri kümesinde PCA gerçekleştirdiğine inanıyorum .
user35581

@ user35581 iyi bir nokta. Bununla birlikte, yaptıkları (1) orijinal verilerden kovaryans matrisini üretmek ve (2) SVD yöntemini kullanarak kovaryans matrisinin özvektörlerini ve özdeğerlerini hesaplamaktır. Bu iki adım, PCA olarak adlandırdığınız adımdır. Temel Bileşenler, orijinal verilerin kovaryans matrisinin özvektörleridir.
Ulf Aslak

@Ulf Aslak, neden denetimsiz özellik seçimine en sağlam yaklaşım olmadığını düşündüğünüzü açıklayabilir misiniz?
hipoglucido

1
@hipoglucido dürüstçe, bunu yazarken düşüncelerimi açıklayamıyorum. Üç yıl önce. Kodu tekrar gözden geçirerek, KMeans (deterministik olmayan) kullanımı ile ilgili bir şey olduğuna inanmaya yol açtım. Ayrıca, bunun sadece PCA tarafından dönüştürülmemiş özellikleri kümelemeyle nasıl karşılaştırıldığını görmek istiyorum.
Ulf Aslak




0

İçinde birçok seçenek vardır R. Bakmak için güzel bir yer, caretdiğ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ç: dağılım grafikleri


1
Bu, OP'nin istediği gibi denetimsiz öğrenme değildir, çünkü model mpgbir sonuç olarak kullanırsınız . Denetimsiz modellerde bu gibi yöntemleri kullanmanın bir yolu var mı?
Max Ghenis

0

nsprcompR 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. nsprcompBiraz 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.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.