ความสำคัญของคุณลักษณะกับป่าสุ่มเรียนรู้ scikit แสดงค่าเบี่ยงเบนมาตรฐานที่สูงมาก


13

ฉันกำลังใช้ตัวจำแนกประเภทฟอเรสต์แบบสุ่มของ scikitและฉันต้องการพล็อตความสำคัญของคุณลักษณะเช่นในตัวอย่างนี้

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

ความสำคัญของคุณสมบัติ

เป็นไปได้ไหมที่จะมีพฤติกรรมเช่นนี้หรือฉันทำผิดพลาดบางอย่างเมื่อวางแผนมัน?

รหัสของฉันคือ:

import matplotlib.pyplot as plt
import numpy as np
import pandas as pd
from sklearn.ensemble import RandomForestClassifier

clf = RandomForestClassifier()
clf.fit(predictors.values, outcome.values.ravel())

importance = clf.feature_importances_
importance = pd.DataFrame(importance, index=predictors.columns, 
                          columns=["Importance"])

importance["Std"] = np.std([tree.feature_importances_
                            for tree in clf.estimators_], axis=0)

x = range(importance.shape[0])
y = importance.ix[:, 0]
yerr = importance.ix[:, 1]

plt.bar(x, y, yerr=yerr, align="center")

plt.show()

IIUC, predictorsผลตอบแทนnumpy arrayที่คุณจะอ้างอิงไปยังpandas Dataframeวัตถุตามคอลัมน์มันซึ่งไม่ถูกต้องตามที่ไม่ได้มีแอตทริบิวต์numpy arrays columns
Nickil Maveli

ขออภัยมันเป็นรหัสที่พิมพ์ผิด พยากรณ์และผลสองpandas DataFrameที่มีรูปร่างและm x n m x 1มันควรจะชัดเจนในขณะนี้
gc5

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

โพสต์ยอดเยี่ยมฉันพบเจอปัญหาเดียวกันกับที่คุณเห็นในภาพ มีแพ็คเกจtsfreshที่ช่วยให้ฉันระบุคุณสมบัติที่เกี่ยวข้องและลดฟีเจอร์ของฉันจาก 600+ เป็น 400 !! [คุณสมบัติ 35 อันดับแรกของฉัน ] ( i.stack.imgur.com/0MROZ.png ) แม้อัลกอริทึมนี้จะทำงานได้ดี สำหรับฉัน. ฉันมีการจำแนกประเภทไบนารีสำเร็จ / ล้มเหลว ฉันไม่ได้รับความสำเร็จที่ผิดพลาด แต่ฉันพลาดความสำเร็จไปได้ร้อยเปอร์เซ็นต์ การเดาทั้งหมดข้างต้นดูเหมือนสมเหตุสมผล อาจเป็นกรณีที่ต้องมีชุดฝึกอบรมและทดสอบที่ใหญ่กว่า ฉันมีน้อยลง
ซูเปอร์ฮีโร่

คำตอบ:


3

คุณกำลังใช้ RandomForest ด้วยจำนวนต้นไม้เริ่มต้นซึ่งก็คือ 10 สำหรับคุณลักษณะราว 30 รายการมันน้อยเกินไป ดังนั้นส่วนเบี่ยงเบนมาตรฐานจึงมีขนาดใหญ่ ลองต้นไม้อย่างน้อย 100 หรือ 1,000 ต้น

clf = RandomForestClassifier(n_estimators=1000)

สำหรับการวิเคราะห์ที่ละเอียดยิ่งขึ้นคุณสามารถตรวจสอบว่าความสัมพันธ์ระหว่างคุณลักษณะของคุณมีขนาดใหญ่เพียงใด


ขออภัย lanenok จำนวนต้นไม้ไม่ได้เป็นค่าเริ่มต้น ฉันใส่โค้ดตัวอย่าง (และนี่เป็นจริงสำหรับพารามิเตอร์ทั้งหมดเช่นmin_samples_split) เพราะฉันไม่สามารถเปิดเผยข้อมูลที่ฉันกำลังทำงานอยู่ได้ อย่างไรก็ตามมันเป็นเพราะจำนวนต้นไม้รวมถึงพารามิเตอร์อื่น ๆ หรือฉันทำผิดพลาดที่นี่?
gc5

2

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

อย่างไรก็ตามเนื่องจากบทความนี้โดย Genuer และคณะ (2010) แสดงว่าคุณสามารถใช้ส่วนเบี่ยงเบนมาตรฐานเพื่อกำจัดคุณลักษณะต่างๆได้ ในการอ้างอิง: " เราจะเห็นว่าค่าเบี่ยงเบนมาตรฐานของตัวแปรที่แท้จริงนั้นมีขนาดใหญ่เมื่อเทียบกับตัวแปรที่มีเสียงดังซึ่งอยู่ใกล้กับศูนย์ "


การใช้ค่าเบี่ยงเบนมาตรฐานในตัวอย่างนี้เพื่อกำจัดคุณลักษณะจะกำจัดคุณลักษณะทั้งหมด xD
Jorge Leitao

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

1

ลองclf = RandomForestClassifier(max_features=None)ดู max_featuresพระรามค่าเริ่มต้นซึ่งเทียบเท่ากับ'auto' อธิบายว่า "จำนวนคุณลักษณะที่ควรพิจารณาเมื่อค้นหาการแยกที่ดีที่สุด" การดูที่ฟีเจอร์จำนวนน้อย ณ จุดใด ๆ ในแผนผังการตัดสินใจหมายถึงความสำคัญของฟีเจอร์เดียวอาจแตกต่างกันไปตามต้นไม้หลายต้น ดังนั้นอย่าดูเซ็ตย่อยแบบสุ่มเพียงแค่ดูฟีเจอร์ทั้งหมดในทุกระดับของทรีsqrt(n_features)max_features


1
หมายเหตุนี่เทียบเท่ากับต้นไม้ที่มีถุงธรรมดา "การสุ่ม" ในป่าสุ่มหมายถึงการพิจารณาเซตสุ่มของคุณสมบัติที่แต่ละแยกมักหรือsqrt(n_features) ไม่พิจารณาคุณลักษณะย่อยอีกต่อไปแบบสุ่ม ฉันไม่แน่ใจว่านี่จะส่งผลกระทบต่อโซลูชั่นที่เสนอข้างต้นหรือไม่ ความเป็นไปได้ทางหนึ่งคือคุณสมบัติหลายอย่างมีความสำคัญเป็นจำนวนมากและแตกต่างกันไปตามต้นไม้ หรืออาจมีตัวอย่างไม่เพียงพอดังนั้นจึงไม่มีการพิจารณาทุกคุณลักษณะตามเวลาที่คุณกดปุ่ม log2(n_features)max_features=None
jamis

1

สาเหตุทั่วไปสำหรับสิ่งนี้คือพารามิเตอร์ที่คุณระบุ (หรือผิดนัด) RandomForestClassifierไม่เหมาะกับชุดข้อมูลของคุณ

วิธีทั่วไปในการแก้ไขปัญหานี้คือการค้นหาพื้นที่ hyperparameter โดยใช้เช่นGridSearchCV:

from sklearn.model_selection import GridSearchCV
from sklearn.metrics import accuracy_score, make_scorer

param_grid = {'n_estimators': [10, 100, 1000], 'max_features': [5, 10, 20, 30]}
clf = GridSearchCV(RandomForestClassifier(), param_grid, cv=5, scoring=make_scorer(accuracy_score))

param_gridนี่คือการเรียงสับเปลี่ยนของพารามิเตอร์ที่คุณต้องการค้นหาและmake_scorer(accuracy_score)เป็นตัวชี้วัดที่คุณต้องการเพิ่มประสิทธิภาพ

โปรดทราบว่าaccuracy_scoreเหมาะสำหรับชุดที่สมดุล แต่ไม่ใช่สำหรับชุดที่ไม่สมดุล เลือกเมตริกที่เหมาะสมกับวัตถุประสงค์เฉพาะของคุณ


0

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

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