การใช้ PCA เพื่อทดสอบข้อมูลเพื่อวัตถุประสงค์ในการจำแนกประเภท


10

ฉันได้เรียนรู้เมื่อเร็ว ๆ นี้เกี่ยวกับ PCA ที่ยอดเยี่ยมและผมเคยทำตัวอย่างที่ระบุไว้ในscikit เรียนรู้เอกสาร

ฉันสนใจที่จะทราบว่าฉันสามารถใช้ PCA กับจุดข้อมูลใหม่เพื่อการจำแนกประเภทได้อย่างไร

หลังจากแสดงภาพ PCA ในระนาบ 2 มิติ (แกน x, y) ฉันเห็นว่าฉันสามารถวาดเส้นเพื่อแยกจุดข้อมูลเพื่อว่าด้านหนึ่งจะเป็นประเภทหนึ่งและอีกประเภทหนึ่ง ฉันจะวาด "ขอบเขต" นี้และนำไปใช้กับจุดข้อมูลใหม่ได้อย่างไร


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

คำตอบ:


16

PCA เป็นเครื่องมือลดขนาดไม่ใช่ตัวแยกประเภท ใน Scikit เรียนรู้, ลักษณนามและประมาณค่าทุกคนมีpredictวิธีการที่PCA ไม่ คุณต้องจัดให้มีลักษณนามบนข้อมูลที่แปลง PCA Scikit-Learn มีตัวแยกประเภทมากมาย นี่คือตัวอย่างของการใช้แผนผังการตัดสินใจบนข้อมูลที่แปลงโดย PCA ฉันเลือกลักษณนามต้นไม้ตัดสินใจเพราะมันทำงานได้ดีสำหรับข้อมูลที่มีมากกว่าสองคลาสซึ่งเป็นกรณีที่มีชุดข้อมูลของม่านตา

from sklearn.decomposition import PCA
from sklearn.tree import DecisionTreeClassifier
from sklearn.datasets import load_iris

# load data
iris = load_iris()

# initiate PCA and classifier
pca = PCA()
classifier = DecisionTreeClassifier()

# transform / fit

X_transformed = pca.fit_transform(iris.data)
classifier.fit(X_transformed, iris.target)

# predict "new" data
# (I'm faking it here by using the original data)

newdata = iris.data

# transform new data using already fitted pca
# (don't re-fit the pca)
newdata_transformed = pca.transform(newdata)

# predict labels using the trained classifier

pred_labels = classifier.predict(newdata_transformed)

SciKit เรียนรู้มีเครื่องมือที่สะดวกเรียกว่าPipelineซึ่งให้คุณเชื่อมโยงหม้อแปลงและตัวแยกประเภทสุดท้ายเข้าด้วยกัน:

# you can make this a lot easier using Pipeline

from sklearn.pipeline import Pipeline

# fits PCA, transforms data and fits the decision tree classifier
# on the transformed data
pipe = Pipeline([('pca', PCA()),
                 ('tree', DecisionTreeClassifier())])

pipe.fit(iris.data, iris.target)

pipe.predict(newdata)

สิ่งนี้มีประโยชน์โดยเฉพาะอย่างยิ่งเมื่อทำการตรวจสอบข้ามซึ่งจะป้องกันคุณจากการปรับขั้นตอนใด ๆ ของท่อในชุดทดสอบของคุณอีกครั้งโดยไม่ได้ตั้งใจ:

from sklearn.cross_validation import cross_val_score
print cross_val_score(pipe, iris.data, iris.target)
# [ 0.96078431  0.90196078  1.        ]

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


6
อาจเป็นเรื่องสำคัญที่จะต้องทราบว่า PCA อาจมีประโยชน์แม้ว่าขนาดจะไม่ลดลง คุณสามารถมีชุดข้อมูลของ dimensionalityและทิศทางการเลือกปฏิบัติเป็นชุดที่สอดคล้องกับความแปรปรวนสูงสุด คุณเก็บมิติ แต่พื้นฐานที่แตกต่างกัน การทำแผนที่ข้อมูลของคุณบนพื้นฐานใหม่เหล่านั้นจะช่วยในการแยกแยะชั้นเรียนได้ดีกว่าเดิม dd
Vladislavs Dovgalecs

@ xeon ฉันไม่รู้
Austin Richardson

อาจเป็นการดีกว่าถ้าคุณคิดว่า PCA เป็นการหมุน ถ้ามันเกิดขึ้นที่ชุดข้อมูลของคุณมีคุณสมบัตินี้เพื่อให้ชั้นเรียนสามารถจำแนกตามความแปรปรวนแล้วการหมุนนี้จะเป็นสิ่งที่คุณต้องการ
Vladislavs Dovgalecs

2
@xeon: เมื่อทุกมิติถูกเก็บรักษาไว้สิ่งเดียวที่ PCA ประสบความสำเร็จนั้นคือการเชื่อมโยงชุดข้อมูล มันอาจเป็นประโยชน์สำหรับตัวแยกประเภทบางอย่างแต่ส่วนใหญ่ไม่สนใจ
อะมีบา

1
@ amoeba ฉันเห็นด้วยอย่างยิ่งนี่เป็นเพียงรายละเอียดเล็ก ๆ ฉันต้องจัดการกับชุดข้อมูลดังกล่าวและจำบทเรียนนั้นเสมอ
Vladislavs Dovgalecs

0

หากคุณต้องการใช้ PCA กับข้อมูลใหม่คุณต้องมีโมเดลให้พอดีกับชุดข้อมูลการฝึกอบรมก่อน รูปแบบที่คุณจะถามคืออะไร? นี่คือค่าเฉลี่ยเวกเตอร์ที่คุณลบออกจากชุดข้อมูลความแปรปรวนที่คุณใช้ในการ "ทำให้ขาว" แต่ละเวกเตอร์ข้อมูลและเมทริกซ์การแมปที่เรียนรู้ ดังนั้นในการแมปชุดข้อมูลใหม่ในพื้นที่เดียวกันกับข้อมูลการฝึกอบรมคุณต้องลบค่าเฉลี่ยแล้วทำให้มันขาวและแผนที่ด้วยเมทริกซ์การทำแผนที่

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