Metode dalam R atau Python untuk melakukan pemilihan fitur dalam pembelajaran tanpa pengawasan [ditutup]


11

Apa metode / implementasi yang tersedia dalam R / Python untuk membuang / memilih fitur yang tidak penting / penting dalam data? Data saya tidak memiliki label (tidak diawasi).

Data memiliki ~ 100 fitur dengan tipe campuran. Beberapa numerik sedangkan yang lainnya biner (0/1).


Algoritme belajar tanpa pengawasan seperti apa yang Anda gunakan? Seperti apa data Anda?
Max Candocia

@ user1362215, Sebelum menerapkan algoritma tanpa pengawasan, saya mencoba mencari cara untuk melakukan penghapusan fitur.
pelajar

Pernahkah Anda melihat cheatsheet scikit-learn ini sebelumnya? Mungkin membantu Anda memulai ...
Steve S

Mengapa tidak menggunakan metode tanpa pengawasan yang menghasilkan pemilihan fitur dengan sendirinya seperti hutan acak dalam mode tanpa pengawasan?
JEquihua

1
Saya tidak sepenuhnya surem, maksud saya hutan acak sepenuhnya non parametrik jadi jangan khawatir tentang asumsi. Yang saya tidak yakin adalah apakah itu akan memenuhi tujuan Anda. Apa yang BISA saya katakan adalah bahwa ada versi Random Forest hanya untuk "deteksi anomali" yang disebut hutan isolasi: cs.nju.edu.cn/zhouzh/zhouzh.files/publication/... ada implementasi di R tapi saya tidak yakin apakah sudah aktif dan berjalan seperti sekarang.
JEquihua

Jawaban:


7

Ini berumur satu tahun tetapi saya masih merasa itu relevan, jadi saya hanya ingin membagikan implementasi python saya dari Principal Feature Analysis (PFA) seperti yang diusulkan dalam makalah yang terkait dengan Charles dalam jawabannya.

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_]

Anda bisa menggunakannya seperti ini:

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_

Ini benar-benar mengikuti algoritma yang dijelaskan dari artikel. Saya pikir metode ini menjanjikan, tapi jujur ​​saya tidak berpikir itu pendekatan yang paling kuat untuk pemilihan fitur yang tidak diawasi. Saya akan memposting pembaruan jika saya menemukan sesuatu yang lebih baik.


Dalam metode yang dijelaskan dalam makalah yang Anda tautkan, Langkah 1 adalah untuk menghitung matriks kovarians dan langkah 2 adalah menghitung PCA pada matriks kovarians dari Langkah 1. Saya percaya fitfungsi Anda melompati Langkah 1, dan melakukan PCA pada dataset asli .
user35581

@ user35581 poin bagus. Namun, yang mereka lakukan adalah (1) menghasilkan matriks kovarians dari data asli dan kemudian (2) menghitung vektor eigen dan nilai eigen dari matriks kovarians menggunakan metode SVD. Kedua langkah tersebut digabungkan adalah apa yang Anda sebut PCA. Komponen Prinsip adalah vektor eigen dari matriks kovarian data asli.
Ulf Aslak

@Ulf Aslak dapatkah Anda menguraikan mengapa menurut Anda itu bukan pendekatan yang paling kuat untuk pemilihan fitur yang tidak diawasi?
hipoglucido

1
@hipoglucido jujur, saya tidak bisa menjelaskan pikiran saya ketika saya menulis itu. Tiga tahun lalu. Meninjau kode lagi, saya dituntun untuk percaya itu ada hubungannya dengan penggunaan KMeans (yang non-deterministik). Juga, saya ingin melihat bagaimana ini membandingkan hanya mengelompokkan fitur non-PCA-berubah.
Ulf Aslak



0

Saya telah menemukan sebuah tautan yang dapat berguna, itu adalah implementasi matlab, mereka dapat bekerja untuk Anda http://www.cad.zju.edu.cn/home/dengcai/Data/MCFS.html itu adalah pilihan fitur multicluster metode, Anda dapat menemukan dasar yang kuat tentang hal itu di makalah baru-baru ini. Beri tahu saya jika itu berhasil untuk Anda


0

Ada banyak opsi yang tersedia di R. Tempat yang bagus untuk melihat adalah caretpaket yang menyediakan antarmuka yang bagus untuk banyak paket dan opsi lainnya. Anda dapat melihat situs webnya di sini . Ada banyak pilihan di luar sana, tetapi saya akan mengilustrasikannya.

Berikut ini adalah contoh penggunaan filter sederhana menggunakan Rdataset "mtcars" bawaan (ditunjukkan di bawah).

                   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

Sekarang beberapa pengaturan kode (memuat paket, dll.):

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

Dan kita dapat menyesuaikan model sederhana untuk memilih variabel:

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

Melihat hasilnya, kita mendapatkan:

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)

Akhirnya kita bisa plot variabel yang dipilih (dalam fit1$optVariables) terhadap hasil, mpg:

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

Menghasilkan grafik ini: plot pencar


1
Ini bukan pembelajaran tanpa pengawasan seperti yang diminta OP, karena model Anda digunakan mpgsebagai hasil. Apakah ada cara untuk menggunakan metode seperti ini dalam model yang tidak diawasi?
Max Ghenis

0

The nsprcomppaket R menyediakan metode untuk jarang Principal Component Analysis, yang bisa sesuai dengan kebutuhan Anda.

Misalnya, jika Anda yakin fitur Anda secara umum berkorelasi linier, dan ingin memilih lima teratas, Anda dapat menjalankan PCA yang jarang dengan maksimal lima fitur, dan membatasi ke komponen utama pertama:

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

Atau, jika Anda ingin menangkap fitur ortogonal dari fitur, Anda dapat memilih fitur teratas dari masing-masing dari lima PC teratas, membatasi setiap PC ke satu fitur:

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

Sebuah ansambel ini bisa bermanfaat juga; yaitu, fitur yang secara konsisten mencapai puncak di seluruh metode yang berbeda cenderung menjelaskan sejumlah besar variasi dalam ruang fitur. Setelah bermain-main dengan nsprcompsedikit, sepertinya dua metode pertama menaikkan ~ 1/2 dari fitur yang sama ke atas. Yang mengatakan, mengoptimalkan proses ini mungkin merupakan upaya empiris.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.