การระบุคุณสมบัติที่กรองหลังจากการเลือกคุณสมบัติด้วย scikit เรียนรู้


10

นี่คือรหัสของฉันสำหรับวิธีการเลือกคุณสมบัติใน Python:

from sklearn.svm import LinearSVC
from sklearn.datasets import load_iris
iris = load_iris()
X, y = iris.data, iris.target
X.shape
(150, 4)
X_new = LinearSVC(C=0.01, penalty="l1", dual=False).fit_transform(X, y)
X_new.shape
(150, 3)

แต่หลังจากได้ X ใหม่ (ตัวแปรตาม - X_new) ใหม่ฉันจะรู้ได้อย่างไรว่าตัวแปรใดที่ถูกลบและตัวแปรใดที่ถูกพิจารณาในตัวแปรที่อัพเดทใหม่นี้ (อันใดอันหนึ่งที่ถูกลบหรือที่สามอยู่ในข้อมูล)

เหตุผลในการรับรหัสนี้คือการใช้การกรองแบบเดียวกันกับข้อมูลการทดสอบใหม่

คำตอบ:


6

มีสองสิ่งที่คุณสามารถทำได้:

  • ตรวจสอบcoef_พารามิเตอร์และตรวจสอบว่าคอลัมน์ใดถูกละเว้น
  • ใช้รูปแบบเดียวกันสำหรับการแปลงข้อมูลเข้าโดยใช้วิธีการ transform

การปรับเปลี่ยนเล็กน้อยสำหรับตัวอย่างของคุณ

>>> from sklearn.svm import LinearSVC
>>> from sklearn.datasets import load_iris
>>> from sklearn.cross_validation import train_test_split
>>>
>>> iris = load_iris()
>>> x_train, x_test, y_train, y_test = train_test_split(
...     iris.data, iris.target, train_size=0.7
... )
>>>
>>> svc = LinearSVC(C=0.01, penalty="l1", dual=False)
>>>
>>> X_train_new = svc.fit_transform(x_train, y_train)
>>> print(X_train_new.shape)
(105, 3)
>>>
>>> X_test_new = svc.transform(x_test)
>>> print(X_test_new.shape)
(45, 3)
>>>
>>> print(svc.coef_)
[[ 0.          0.10895557 -0.20603044  0.        ]
 [-0.00514987 -0.05676593  0.          0.        ]
 [ 0.         -0.09839843  0.02111212  0.        ]]

ตามที่คุณเห็นวิธีการtransformทำงานทั้งหมดให้คุณ และจากcoef_เมทริกซ์คุณจะเห็นว่าคอลัมน์สุดท้ายเป็นเวกเตอร์ศูนย์ดังนั้นคุณทำแบบนั้นละเว้นคอลัมน์สุดท้ายจากข้อมูล


สวัสดีฉันจะระบุชื่อคอลัมน์ของ X_train_new ได้อย่างไร มีฟังก์ชั่นอะไรบ้าง?
Vignesh Prajapati

1
พวกเขาอยู่ในลำดับเดียวกันกับในชุดข้อมูลอินพุต iris.feature_names
itdxer

ใช่. ของมัน ฉันสับสนที่นี่ มันอยู่ในลำดับเดียวกัน แต่ฉันจะหาชื่อพวกเขาได้อย่างไรเพราะบางคอลัมน์ถูกเพิกเฉย ดังนั้นฉันไม่สามารถรับคอลัมน์เฉพาะที่เลือกไว้ในระหว่างกระบวนการนี้ คุณช่วยฉันด้วยเรื่องนี้ได้ไหม!.
Vignesh Prajapati

คุณตรวจสอบวิธีการfeature_namesในirisตัวแปรหรือไม่? มันใช้งานได้ดีสำหรับฉัน
itdxer

12

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

หวังว่านี่จะช่วยผู้อ่านในอนาคตที่พยายามหาวิธีที่ดีที่สุดในการรับชื่อคุณลักษณะที่เกี่ยวข้องหลังจากการเลือกคุณสมบัติ

ตัวอย่าง:

lsvc = LinearSVC(C=0.01, penalty="l1", dual=False,max_iter=2000).fit(X, y) 
model = sk.SelectFromModel(lsvc, prefit=True) 
X_new = model.transform(X) 
print(X_new.shape) 
print(model.get_support()) 

5
สิ่งนี้ควรได้รับการยอมรับ
user0

5

จาก @chinnychinchin solution ฉันมักจะทำ:

lsvc = LinearSVC(C=0.01, penalty="l1", dual=False,max_iter=2000).fit(X, y) 
model = sk.SelectFromModel(lsvc, prefit=True) 
X_new = model.transform(X) 
print(X.columns[model.get_support()]) 

ซึ่งส่งคืนสิ่งที่ชอบ:

Index([u'feature1', u'feature2', u'feature',
  u'feature4'],
  dtype='object')
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.