วิธีการใน R หรือ Python เพื่อทำการเลือกคุณสมบัติในการเรียนรู้ที่ไม่มีผู้ดูแล [ปิด]


11

อะไรคือวิธีการ / การนำไปใช้งานใน R / Python เพื่อยกเลิก / เลือกคุณสมบัติที่ไม่สำคัญ / สำคัญในข้อมูล ข้อมูลของฉันไม่มีป้ายกำกับ (ไม่มีการสำรอง)

ข้อมูลมีคุณสมบัติประมาณ ~ 100 ชนิดผสม บางตัวเป็นตัวเลขในขณะที่อื่น ๆ เป็นเลขฐานสอง (0/1)


คุณใช้อัลกอริทึมการเรียนรู้แบบไม่สนับสนุนอะไร ข้อมูลของคุณเป็นอย่างไร
Max Candocia

@ user1362215, ก่อนที่จะใช้อัลกอริทึม unsupervised ใด ๆ ฉันพยายามหาวิธีที่จะทำการลบคุณลักษณะ
ผู้เรียน

คุณจะได้เห็นนี้scikit เรียนรู้ cheatsheetมาก่อนหรือไม่ มันอาจช่วยให้คุณเริ่มต้น ...
Steve S

ทำไมไม่ใช้วิธีการสำรองที่ให้คุณสมบัติการเลือกด้วยตัวเองเช่นฟอเรสต์แบบสุ่มในโหมด unsupervised
JEquihua

1
ฉันไม่แน่ใจอย่างสมบูรณ์ฉันหมายถึงป่าสุ่มไม่มีพารามิเตอร์สมบูรณ์ดังนั้นไม่ต้องกังวลกับสมมติฐาน สิ่งที่ฉันไม่แน่ใจคือถ้ามันจะตอบสนองวัตถุประสงค์ของคุณ สิ่งที่ฉันสามารถพูดได้คือมี Random Forest เวอร์ชั่นหนึ่งสำหรับ "การตรวจจับความผิดปกติ" ที่เรียกว่าป่าแยก: cs.nju.edu.cn/zhouzh/zhouzh.files/publication/มีการใช้งานใน R แต่ฉัน ไม่แน่ใจว่ามันเริ่มทำงานแล้วหรือยัง
JEquihua

คำตอบ:


7

อายุหนึ่งขวบ แต่ฉันก็ยังรู้สึกว่ามันมีความเกี่ยวข้องดังนั้นฉันแค่อยากจะแบ่งปันการดำเนินการของหลามของการวิเคราะห์คุณสมบัติหลัก (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_

นี่คือการปฏิบัติตามอัลกอริทึมที่อธิบายอย่างเคร่งครัดจากบทความ ฉันคิดว่าวิธีการนี้มีสัญญา แต่โดยสุจริตฉันไม่คิดว่ามันเป็นวิธีที่มีประสิทธิภาพที่สุดในการเลือกคุณลักษณะที่ไม่มีผู้ดูแล ฉันจะโพสต์การอัปเดตหากฉันได้สิ่งที่ดีกว่า


ในวิธีที่อธิบายไว้ในเอกสารที่คุณเชื่อมโยงไปถึงขั้นตอนที่ 1 คือการคำนวณเมทริกซ์ความแปรปรวนร่วมและขั้นตอนที่ 2 คือการคำนวณ PCA บนเมทริกซ์ความแปรปรวนร่วมจากขั้นตอนที่ 1 ฉันเชื่อว่าfitฟังก์ชันของคุณข้ามขั้นตอนที่ 1 และดำเนินการ PCA .
user35581

@ user35581 จุดที่ดี อย่างไรก็ตามสิ่งที่พวกเขาทำคือ (1) สร้างเมทริกซ์ความแปรปรวนร่วมจากข้อมูลดั้งเดิมและจากนั้น (2) คำนวณค่าลักษณะเฉพาะและค่าลักษณะเฉพาะของเมทริกซ์ความแปรปรวนร่วมโดยใช้วิธี SVD การรวมสองขั้นตอนเหล่านั้นคือสิ่งที่คุณเรียกว่า PCA องค์ประกอบหลักคือ eigenvectors เมทริกซ์ความแปรปรวนร่วมของข้อมูลต้นฉบับ
Ulf Aslak

@Ulf Aslak คุณช่วยอธิบายได้ไหมว่าทำไมคุณถึงคิดว่ามันไม่ใช่วิธีที่มีประสิทธิภาพที่สุดในการเลือกคุณสมบัติที่ไม่มีผู้ดูแล?
hipoglucido

1
@hipoglucido โดยสุจริตฉันไม่สามารถอธิบายความคิดของฉันได้เมื่อฉันเขียนสิ่งนั้น สามปีที่แล้ว การตรวจสอบรหัสอีกครั้งฉันเชื่อว่ามีส่วนเกี่ยวข้องกับการใช้ KMeans (ซึ่งไม่ได้กำหนดไว้แล้ว) นอกจากนี้ฉันต้องการจะดูว่าสิ่งนี้เปรียบเทียบกับเพียงการจัดกลุ่มคุณสมบัติที่ไม่ได้แปลง PCA
Ulf Aslak


1

การวิเคราะห์คุณสมบัติหลักดูเหมือนจะเป็นทางออกสำหรับการเลือกคุณสมบัติที่ไม่ได้รับการสนับสนุน มันอธิบายไว้ในบทความนี้


ลิงค์เสียชีวิต ที่ใช้ร่วมกันดำเนินการหลามของวิธีการที่นำเสนอในบทความstats.stackexchange.com/a/203978/76815
Ulf Aslak

ขอบคุณฉันลบลิงค์ (มันถูกลบออกเป็นหัวข้อ)
Max Ghenis

0

ฉันได้พบการเชื่อมโยงชอาจจะมีประโยชน์ให้ผู้ที่มีการใช้งาน MATLAB พวกเขาอาจจะทำงานออกมาให้คุณ http://www.cad.zju.edu.cn/home/dengcai/Data/MCFS.html มันเป็นตัวเลือกคุณลักษณะ multicluster วิธีการที่คุณสามารถหารากฐานที่แข็งแกร่งเกี่ยวกับเรื่องนี้ในเอกสารล่าสุดแจ้งให้เราทราบว่ามันเหมาะกับคุณหรือไม่


0

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)

ในที่สุดเราสามารถพล็อตตัวแปรที่เลือก (ใน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()
}))

ผลลัพธ์ในกราฟนี้: แผนการกระจาย


1
นี่ไม่ใช่การเรียนรู้แบบไม่มีการดูแลเนื่องจาก OP ขอเนื่องจากคุณเป็นแบบจำลองที่ใช้mpgเป็นผลลัพธ์ มีวิธีการใช้วิธีการเช่นนี้ในรูปแบบที่ไม่มีผู้ดูแลหรือไม่?
Max Ghenis

0

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 ที่กล่าวว่าการเพิ่มประสิทธิภาพกระบวนการนี้อาจเป็นความพยายามเชิงประจักษ์

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.