PCA และแยกรถไฟ / ทดสอบ / ตรวจสอบความถูกต้อง

Aug 19 2020

ฉันมีปัญหาการจัดประเภทไบนารีที่มีการสังเกต 1149 และตัวทำนาย 13,454 ตัว ฉันต้องการที่จะใช้วิธีการอธิบายโดยcbeleites ไม่มีความสุขกับ SXในPCA และรถไฟ / ทดสอบแยก

ในบริบทนี้ฉันมีคำถามสองข้อ:

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

(ii) การใช้ชุดพักสายถูกต้องกว่าหรือไม่? เช่นแรกใช้การตรวจสอบความถูกต้องข้าม 10 เท่าเพื่อค้นหาจำนวนพีซีที่เหมาะสมโดยใช้ 90% ของข้อมูลตามที่อธิบายไว้โดยcbeleites ไม่พึงพอใจกับ SXจากนั้นจึงติดตั้งเครื่องมือประมาณค่าใหม่โดยใช้พีซีจำนวนที่เหมาะสมที่สุดโดยใช้ข้อมูลทั้งหมดที่ใช้ใน ขั้นตอนแรกทำนายความน่าจะเป็นของชั้นเรียนของชุดการระงับ?

แก้ไขเพื่อให้ชัดเจนยิ่งขึ้นรหัสของฉันมีลักษณะดังนี้:

tests=[]
pps=[]
pcs=[]
skf=model_selection.StratifiedKFold(n_splits=10,random_state=61,shuffle=True)

for i in (2,5,10,25,50,100,114):

    tmp_pps=[]
    tmp_tests=[]

    for train_index, test_index in skf.split(X, y):
    
        estimator = SVC(probability=True)
        pca = PCA(i, svd_solver='arpack')
        scaler= StandardScaler()
    
        X_train, X_test = X[train_index], X[test_index]
        y_train, y_test = y[train_index], y[test_index]
    
        fScaler = scaler.fit(X_train)
        X_train_scaled = fScaler.transform(X_train)
        X_test_scaled = fScaler.transform(X_test)
    
        fpca = pca.fit(X_train_scaled)
        X_train_PCA = pca.transform(X_train_scaled)
        X_test_PCA = pca.transform(X_test_scaled)
    
        ft = estimator.fit(X_train_PCA, y_train)
        pp = estimator.predict_proba(X_test_PCA)[:, 1]
    
        tmp_tests.append(y_test)
        tmp_pps.append(pp)
    
    tests.append(tmp_tests)
    pps.append(tmp_pps)
    pcs.append(i)

for i in range(len(pcs)):
    pp = np.concatenate(res[i]).ravel()
    y_test = np.concatenate(tests[i]).ravel()
    score = roc_auc_score(y_test, pp)
    print(pcs[i],score)

นี่เป็นแนวทางที่ไม่ถูกต้อง / มีอคติหรือไม่?

คำตอบ

gunes Aug 19 2020 at 01:30

i) ใช่จำนวนพีซีควรน้อยกว่าหรือเท่ากับจำนวนการสังเกตเนื่องจากเมทริกซ์ข้อมูล (ถือว่าเป็นค่ามาตรฐานโดยไม่สูญเสียความเป็นทั่วไป) $X_{n\times p}$, มีอันดับ $\leq \min(n,p)=n$, ในกรณีนี้. $X^TX$ จะมีอันดับ $\leq n$ เช่นกันเพราะ $\text{rank}(AB)\leq \text{rank}(A)$.

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