วิธีการใช้ R prcomp ผลลัพธ์สำหรับการทำนาย?


25

ฉันมี data.frame พร้อม 800 obs ของตัวแปร 40 ตัวและต้องการใช้การวิเคราะห์องค์ประกอบหลักเพื่อปรับปรุงผลลัพธ์ของการทำนายของฉัน (ซึ่งจนถึงขณะนี้ทำงานได้ดีที่สุดกับ Support Vector Machine กับตัวแปรที่เลือกด้วยมือ 15 อัน)

ฉันเข้าใจว่า prcomp สามารถช่วยปรับปรุงการทำนายของฉันได้ แต่ฉันไม่รู้วิธีใช้ผลลัพธ์ของฟังก์ชัน prcomp

ฉันได้รับผล:

> PCAAnalysis <- prcomp(TrainTrainingData, scale.=TRUE)
> summary(PCAAnalysis)
Importance of components:
                          PC1    PC2    PC3    PC4    PC5   PC6    PC7    PC8    PC9   PC10   PC11   PC12   PC13   PC14
Standard deviation     1.7231 1.5802 1.3358 1.2542 1.1899 1.166 1.1249 1.1082 1.0888 1.0863 1.0805 1.0679 1.0568 1.0520
Proportion of Variance 0.0742 0.0624 0.0446 0.0393 0.0354 0.034 0.0316 0.0307 0.0296 0.0295 0.0292 0.0285 0.0279 0.0277
Cumulative Proportion  0.0742 0.1367 0.1813 0.2206 0.2560 0.290 0.3216 0.3523 0.3820 0.4115 0.4407 0.4692 0.4971 0.5248
                         PC15   PC16   PC17   PC18  PC19   PC20   PC21   PC22   PC23   PC24   PC25   PC26   PC27   PC28
Standard deviation     1.0419 1.0283 1.0170 1.0071 1.001 0.9923 0.9819 0.9691 0.9635 0.9451 0.9427 0.9238 0.9111 0.9073
Proportion of Variance 0.0271 0.0264 0.0259 0.0254 0.025 0.0246 0.0241 0.0235 0.0232 0.0223 0.0222 0.0213 0.0208 0.0206
Cumulative Proportion  0.5519 0.5783 0.6042 0.6296 0.655 0.6792 0.7033 0.7268 0.7500 0.7723 0.7945 0.8159 0.8366 0.8572
                         PC29   PC30   PC31   PC32   PC33   PC34   PC35   PC36    PC37                 PC38
Standard deviation     0.8961 0.8825 0.8759 0.8617 0.8325 0.7643 0.7238 0.6704 0.60846 0.000000000000000765
Proportion of Variance 0.0201 0.0195 0.0192 0.0186 0.0173 0.0146 0.0131 0.0112 0.00926 0.000000000000000000
Cumulative Proportion  0.8773 0.8967 0.9159 0.9345 0.9518 0.9664 0.9795 0.9907 1.00000 1.000000000000000000
                                       PC39                 PC40
Standard deviation     0.000000000000000223 0.000000000000000223
Proportion of Variance 0.000000000000000000 0.000000000000000000
Cumulative Proportion  1.000000000000000000 1.000000000000000000

ฉันคิดว่าฉันจะได้รับพารามิเตอร์ที่สำคัญที่สุดในการใช้ แต่ฉันไม่พบข้อมูลนี้ ทั้งหมดที่ฉันเห็นคือค่าเบี่ยงเบนมาตรฐานและอื่น ๆ บนพีซี แต่ฉันจะใช้สิ่งนี้ในการทำนายได้อย่างไร


2
นอกจากนี้ยังมีห้องสมุด R pls(สแควร์บางส่วนน้อย) ซึ่งมีเครื่องมือสำหรับ PCR ( การถดถอยส่วนประกอบหลัก )
Stepan S. Sushko

คำตอบ:


35

ในขณะที่ฉันไม่แน่ใจว่าธรรมชาติของปัญหาของคุณเป็นอย่างไรฉันสามารถบอกคุณได้ว่าฉันใช้ PCA เป็นวิธีการแยกรูปแบบที่โดดเด่นในกลุ่มของตัวแปรตัวทำนายในการสร้างแบบจำลองในภายหลัง ในตัวอย่างของเหล่านี้จะพบได้ในส่วนประกอบหลักการ (พีซี) และพวกเขาจะขึ้นอยู่กับน้ำหนักของตัวแปรที่พบในPCAAnalysis$x PCAAnalysis$rotationข้อดีอย่างหนึ่งของกระบวนการนี้คือพีซีตั้งฉากและดังนั้นคุณจึงลบปัญหาเรื่องความหลากหลายของความสัมพันธ์ระหว่างตัวทำนายแบบจำลอง อย่างที่สองก็คือคุณอาจจะสามารถระบุเซตย่อยของพีซีที่เล็กลงซึ่งจับความแปรปรวนส่วนใหญ่ในการทำนายของคุณ ข้อมูลเหล่านี้สามารถพบได้ในหรือsummary(PCAAnalysis) PCAAnalysis$sdevสุดท้ายหากคุณสนใจที่จะใช้ชุดย่อยของพีซีเพื่อการคาดการณ์คุณสามารถตั้งค่าtolพารามิเตอร์ได้prcomp ไปยังระดับที่สูงขึ้นเพื่อลบพีซีที่ต่อท้าย

ตอนนี้คุณสามารถ "ฉาย" ข้อมูลใหม่บนพื้นฐานพิกัด PCA โดยใช้predict.prcomp()ฟังก์ชัน เนื่องจากคุณกำลังเรียกชุดข้อมูลของคุณเป็นชุดข้อมูล "การฝึกอบรม" สิ่งนี้อาจสมเหตุสมผลแล้วฉายข้อมูลการตรวจสอบความถูกต้องที่ตั้งอยู่บนพื้นฐาน PCA ของคุณสำหรับการคำนวณพิกัด PC ที่เกี่ยวข้อง ด้านล่างเป็นตัวอย่างของการปรับ PCA ถึง 4 การวัดทางไบโอเมตริกของสายพันธุ์ม่านตาที่แตกต่างกัน (ซึ่งสัมพันธ์กับบางระดับ) หลังจากนี้ฉันคาดการณ์ค่าไบโอเมตริกซ์ของชุดข้อมูลใหม่ของดอกไม้ที่มีการรวมกันของการวัดเหล่านี้คล้ายกันสำหรับม่านตาทั้งสามชนิด คุณจะเห็นจากกราฟสุดท้ายว่าพีซีที่ฉายอยู่ในพื้นที่ที่คล้ายกันของพล็อตเหมือนกับชุดข้อมูลดั้งเดิม

ตัวอย่างการใช้irisชุดข้อมูล:

### pca - calculated for the first 4 columns of the data set that correspond to biometric measurements ("Sepal.Length" "Sepal.Width"  "Petal.Length" "Petal.Width")
data(iris)

# split data into 2 parts for pca training (75%) and prediction (25%)
set.seed(1)
samp <- sample(nrow(iris), nrow(iris)*0.75)
iris.train <- iris[samp,]
iris.valid <- iris[-samp,]

# conduct PCA on training dataset
pca <- prcomp(iris.train[,1:4], retx=TRUE, center=TRUE, scale=TRUE)
expl.var <- round(pca$sdev^2/sum(pca$sdev^2)*100) # percent explained variance

# prediction of PCs for validation dataset
pred <- predict(pca, newdata=iris.valid[,1:4])

###Plot result
COLOR <- c(2:4)
PCH <- c(1,16)

pc <- c(1,2) # principal components to plot

png("pca_pred.png", units="in", width=5, height=4, res=200)
op <- par(mar=c(4,4,1,1), ps=10)
plot(pca$x[,pc], col=COLOR[iris.train$Species], cex=PCH[1], 
 xlab=paste0("PC ", pc[1], " (", expl.var[pc[1]], "%)"), 
 ylab=paste0("PC ", pc[2], " (", expl.var[pc[2]], "%)")
)
points(pred[,pc], col=COLOR[iris.valid$Species], pch=PCH[2])
legend("topright", legend=levels(iris$Species), fill = COLOR, border=COLOR)
legend("topleft", legend=c("training data", "validation data"), col=1, pch=PCH)
par(op)
dev.off()

ป้อนคำอธิบายรูปภาพที่นี่


ขอบคุณที่ให้รายละเอียดมาก ๆ น่าเสียดายที่โค้ดตัวอย่างนั้นเป็นรหัสลับสำหรับฉัน ฉันเห็นคุณกำลังใช้การทำนาย คู่มือสำหรับ prcomp ทำนายอยู่ที่ไหน มันอยู่ที่นี่: stat.ethz.ch/R-manual/R-patched/library/stats/html/prcomp.html ?
ทูซอน

ตอนนี้ฉันได้เพิ่มคำอธิบายเพิ่มเติมลงในคำตอบของฉัน หวังว่าตอนนี้คุณจะชัดเจนขึ้น ใช่คุณถูกต้องในลิงก์ของคุณไปยังความpredict.prcompช่วยเหลือ
Marc ในกล่อง

11

ข้อมูลจากคำสั่งสรุป () ที่คุณแนบไว้กับคำถามช่วยให้คุณเห็นเช่นสัดส่วนของความแปรปรวนแต่ละองค์ประกอบหลักที่จับ (สัดส่วนของความแปรปรวน) นอกจากนี้ยังคำนวณสัดส่วนสะสมกับเอาต์พุต ตัวอย่างเช่นคุณต้องมี 23 พีซีเพื่อจับ 75% ของความแปรปรวนในชุดข้อมูลของคุณ

นี่ไม่ใช่ข้อมูลที่คุณมักใช้เป็นข้อมูลป้อนเข้าในการวิเคราะห์เพิ่มเติม แต่สิ่งที่คุณต้องการโดยทั่วไปคือข้อมูลที่หมุนแล้วซึ่งถูกบันทึกเป็น 'x' ในวัตถุที่สร้างโดย prcomp

การใช้รหัส R เป็นตัวอย่างสั้น ๆ

pr<-prcomp(USArrests, scale = TRUE)
summary(pr) # two PCs for cumulative proportion of >80% 
newdat<-pr$x[,1:2]

จากนั้นคุณสามารถใช้ข้อมูลใน newdat เพื่อทำการวิเคราะห์เพิ่มเติมเช่นป้อนไปยัง SVM หรือแบบจำลองการถดถอยบางแบบ ดูได้เช่น/programming/1805149/how-to-fit-a-linear-regression-model-with-two-principal-components-in-rสำหรับข้อมูลเพิ่มเติม


1
ขอบคุณ @JTT ดังนั้นถ้าตอนนี้ฉันใช้ newdat เพื่อสร้างแบบจำลอง SVM ฉันคิดว่าแบบจำลองของฉันรับอินพุตในจักรวาลหมุนรอบใหม่นี้ซึ่งหมายความว่าฉันจะต้องหมุนข้อมูลทดสอบของฉันก่อนที่จะนำไปใช้กับแบบจำลอง ถูกต้องหรือไม่ และถ้าใช่คุณจะหมุนข้อมูลทดสอบอย่างไรด้วยการหมุนแบบเดียวกัน
ทูซอน

3
วิธีที่ง่ายที่สุดคือการใช้predict()วิธีการสำหรับข้อมูลการทดสอบ ใช้ตัวอย่างข้างต้นจะกลับเมทริกซ์เช่นเดียวกับpredict(pr, USArrests) pr$xสำหรับข้อมูลการทดสอบให้แทนที่ USarrests ด้วยชื่อของข้อมูลการทดสอบ คุณสามารถทำสิ่งเดียวกันได้ด้วยมือ แต่วิธีนี้ง่ายกว่าเนื่องจากวิธีการทำนายจะดูแลมาตราส่วนของชุดข้อมูลทดสอบที่ถูกต้องโดยอัตโนมัติ
JTT

1
ทำนายทำงานอย่างไร มันใช้องค์ประกอบหลักทั้งหมดหรือไม่ ในคำตอบของคุณคุณได้เลือกเพียง 2 ส่วนประกอบเพื่อครอบคลุมความแปรปรวน 80% ทำนายทำอะไร
ทูซอน

1
ฟังก์ชั่นการpredict()ใช้งานโดยค่าเริ่มต้นส่วนประกอบทั้งหมด อย่างไรก็ตามคุณสามารถ จำกัด จำนวนขององค์ประกอบที่ส่งคืนเช่น `ทำนาย (pr, USArrests) [, 1: 2] มันจะใช้ได้ผลกับคุณเหรอ?
JTT

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