อะไรคือวิธีการ / การนำไปใช้งานใน R / Python เพื่อยกเลิก / เลือกคุณสมบัติที่ไม่สำคัญ / สำคัญในข้อมูล ข้อมูลของฉันไม่มีป้ายกำกับ (ไม่มีการสำรอง)
ข้อมูลมีคุณสมบัติประมาณ ~ 100 ชนิดผสม บางตัวเป็นตัวเลขในขณะที่อื่น ๆ เป็นเลขฐานสอง (0/1)
อะไรคือวิธีการ / การนำไปใช้งานใน R / Python เพื่อยกเลิก / เลือกคุณสมบัติที่ไม่สำคัญ / สำคัญในข้อมูล ข้อมูลของฉันไม่มีป้ายกำกับ (ไม่มีการสำรอง)
ข้อมูลมีคุณสมบัติประมาณ ~ 100 ชนิดผสม บางตัวเป็นตัวเลขในขณะที่อื่น ๆ เป็นเลขฐานสอง (0/1)
คำตอบ:
อายุหนึ่งขวบ แต่ฉันก็ยังรู้สึกว่ามันมีความเกี่ยวข้องดังนั้นฉันแค่อยากจะแบ่งปันการดำเนินการของหลามของการวิเคราะห์คุณสมบัติหลัก (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_
นี่คือการปฏิบัติตามอัลกอริทึมที่อธิบายอย่างเคร่งครัดจากบทความ ฉันคิดว่าวิธีการนี้มีสัญญา แต่โดยสุจริตฉันไม่คิดว่ามันเป็นวิธีที่มีประสิทธิภาพที่สุดในการเลือกคุณลักษณะที่ไม่มีผู้ดูแล ฉันจะโพสต์การอัปเดตหากฉันได้สิ่งที่ดีกว่า
fit
ฟังก์ชันของคุณข้ามขั้นตอนที่ 1 และดำเนินการ PCA .
sparclแพคเกจในการวิจัยดำเนินเบาบางลำดับชั้นและเบาบาง K-วิธีการจัดกลุ่ม สิ่งนี้อาจมีประโยชน์ http://www.ncbi.nlm.nih.gov/pmc/articles/PMC2930825/
การวิเคราะห์คุณสมบัติหลักดูเหมือนจะเป็นทางออกสำหรับการเลือกคุณสมบัติที่ไม่ได้รับการสนับสนุน มันอธิบายไว้ในบทความนี้
ฉันได้พบการเชื่อมโยงชอาจจะมีประโยชน์ให้ผู้ที่มีการใช้งาน MATLAB พวกเขาอาจจะทำงานออกมาให้คุณ http://www.cad.zju.edu.cn/home/dengcai/Data/MCFS.html มันเป็นตัวเลือกคุณลักษณะ multicluster วิธีการที่คุณสามารถหารากฐานที่แข็งแกร่งเกี่ยวกับเรื่องนี้ในเอกสารล่าสุดแจ้งให้เราทราบว่ามันเหมาะกับคุณหรือไม่
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()
}))
ผลลัพธ์ในกราฟนี้:
mpg
เป็นผลลัพธ์ มีวิธีการใช้วิธีการเช่นนี้ในรูปแบบที่ไม่มีผู้ดูแลหรือไม่?
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 ที่กล่าวว่าการเพิ่มประสิทธิภาพกระบวนการนี้อาจเป็นความพยายามเชิงประจักษ์