Các phương thức trong R hoặc Python để thực hiện lựa chọn tính năng trong học tập không giám sát [đã đóng]


11

Các phương thức / triển khai có sẵn trong R / Python để loại bỏ / chọn các tính năng không quan trọng / quan trọng trong dữ liệu là gì? Dữ liệu của tôi không có nhãn (không được giám sát).

Dữ liệu có ~ 100 tính năng với các loại hỗn hợp. Một số là số trong khi số khác là nhị phân (0/1).


Bạn đang sử dụng loại thuật toán học tập không giám sát nào? Dữ liệu của bạn trông như thế nào?
Max Candocia

@ user1362215, Trước khi áp dụng bất kỳ thuật toán không giám sát nào, tôi đang cố gắng tìm cách thực hiện loại bỏ tính năng.
người học

Bạn đã thấy điều này scikit-học cheatsheet trước? Nó có thể giúp bạn bắt đầu ...
Steve S

Tại sao không sử dụng một phương pháp không giám sát mà chính perfomes chọn lựa giống như rừng ngẫu nhiên trong chế độ không giám sát?
JEquihua

1
Tôi không hoàn toàn chắc chắn, ý tôi là rừng ngẫu nhiên hoàn toàn không tham số nên đừng lo lắng về các giả định. Điều tôi không chắc là nó sẽ phục vụ mục đích của bạn. Điều tôi CÓ THỂ nói là có một phiên bản Rừng ngẫu nhiên chỉ để "phát hiện dị thường" được gọi là rừng cách ly: cs.nju.edu.cn/zhouzh/zhouzh.files/publication/ đã có một triển khai trong R nhưng tôi không chắc chắn nếu nó lên và chạy như bây giờ.
JEquihua

Câu trả lời:


6

Nó đã được một năm tuổi nhưng tôi vẫn cảm thấy nó có liên quan, vì vậy tôi chỉ muốn chia sẻ việc triển khai Phân tích tính năng chính (PFA) của python như đề xuất trong bài báo mà Charles liên kết trong câu trả lời của mình.

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

Bạn có thể sử dụng nó như thế này:

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_

Đây là đúng theo thuật toán được mô tả từ bài viết. Tôi nghĩ rằng phương pháp này có hứa hẹn, nhưng thực lòng tôi không nghĩ rằng đó là cách tiếp cận mạnh mẽ nhất để lựa chọn tính năng không giám sát. Tôi sẽ đăng một bản cập nhật nếu tôi nghĩ ra thứ gì đó tốt hơn.


Trong phương pháp được mô tả trong bài báo mà bạn liên kết đến, Bước 1 là tính toán ma trận hiệp phương sai và bước 2 là tính PCA trên ma trận hiệp phương sai từ Bước 1. Tôi tin rằng fithàm của bạn bỏ qua Bước 1 và thực hiện PCA trên tập dữ liệu gốc .
user35581

@ user35581 điểm tốt. Tuy nhiên, những gì họ làm là (1) tạo ra ma trận hiệp phương sai từ dữ liệu gốc và sau đó (2) tính toán các hàm riêng và giá trị riêng của ma trận hiệp phương sai bằng phương pháp SVD. Hai bước kết hợp là những gì bạn gọi PCA. Các thành phần nguyên tắc là các hàm riêng của ma trận hiệp phương sai của dữ liệu gốc.
Ulf Aslak

@Ulf Aslak bạn có thể giải thích lý do tại sao bạn nghĩ rằng đó không phải là cách tiếp cận mạnh mẽ nhất để lựa chọn tính năng không giám sát?
hipoglucido

1
@hipoglucido thành thật mà nói, tôi không thể giải thích suy nghĩ của mình khi tôi viết nó. Đó là ba năm trước. Xem xét lại mã một lần nữa, tôi đã tin rằng nó có liên quan đến việc sử dụng KMeans (không mang tính quyết định). Ngoài ra, tôi muốn xem làm thế nào điều này so sánh với việc phân cụm các tính năng không được chuyển đổi PCA.
Ulf Aslak



0

Tôi đã tìm thấy một liên kết có thể hữu ích, đó là các triển khai MATLAB, chúng có thể phù hợp với bạn http://www.cad.zju.edu.cn/home/dengcai/Data/MCFS.html đó là một lựa chọn tính năng đa màn hình Phương pháp, bạn có thể tìm thấy nền tảng vững chắc về nó trong các bài báo gần đây Hãy cho tôi biết nếu nó hiệu quả với bạn


0

Có nhiều lựa chọn có sẵn trong R. Một nơi tốt để tìm là caretgói cung cấp một giao diện đẹp cho nhiều gói và tùy chọn khác. Bạn có thể xem trang web ở đây . Có nhiều lựa chọn ngoài kia, nhưng tôi sẽ minh họa một.

Dưới đây là một ví dụ về việc sử dụng bộ lọc đơn giản bằng cách sử dụng Rbộ dữ liệu "mtcars" tích hợp (hiển thị bên dưới).

                   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

Bây giờ một số thiết lập mã (tải gói, v.v.):

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

Và chúng ta có thể điều chỉnh một mô hình đơn giản để chọn các biến:

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

Xem kết quả, chúng tôi nhận được:

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)

Cuối cùng, chúng ta có thể vẽ các biến được chọn (trong fit1$optVariables) dựa trên kết quả , mpg:

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

Kết quả trong biểu đồ này: điểm phân tán


1
Đây không phải là học tập không giám sát như OP yêu cầu, vì mô hình của bạn sử dụng mpgnhư một kết quả. Có cách nào để sử dụng các phương thức như thế này trong các mô hình không giám sát không?
Max Ghenis

0

Các nsprcompgói R cung cấp phương pháp cho phép phân tích thành phần chính thưa thớt, có thể phù hợp với nhu cầu của bạn.

Ví dụ: nếu bạn tin rằng các tính năng của bạn thường tương quan tuyến tính và muốn chọn năm tính năng hàng đầu, bạn có thể chạy PCA thưa thớt với tối đa năm tính năng và giới hạn ở thành phần chính đầu tiên:

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

Ngoài ra, nếu bạn muốn nắm bắt bản chất trực giao của các tính năng, bạn có thể chọn tính năng hàng đầu từ mỗi trong số năm PC hàng đầu, giới hạn mỗi PC trong một tính năng:

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

Một nhóm gồm những điều này cũng có thể hữu ích; tức là, các tính năng luôn đứng đầu trong các phương thức khác nhau có khả năng giải thích một lượng lớn phương sai trong không gian tính năng. Đã chơi xung quanh với nsprcompmột chút, có vẻ như hai phương pháp đầu tiên nâng ~ 1/2 các tính năng tương tự lên đầu. Điều đó nói rằng, tối ưu hóa quá trình này có thể là một nỗ lực thực nghiệm.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.