स्किटिट लर्न के साथ फीचर सेलेक्शन के बाद फिल्टर्ड फीचर्स की पहचान करना


10

यहाँ पायथन में सुविधा चयन विधि के लिए मेरा कोड है :

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 के कॉलम नामों की पहचान कैसे कर सकता हूं। क्या कोई फंक्शन है?
विग्नेश प्रजापति

1
वे उसी क्रम में हैं जैसे इनपुट डेटा सेट में। iris.feature_names
itdxer

हाँ। आईटी इस। मैं यहाँ उलझन में हूँ। यह उसी क्रम में है। लेकिन मुझे उनके नाम कैसे मिलते हैं क्योंकि कुछ स्तंभों को अनदेखा किया गया है। इसलिए, मैं उन विशिष्ट स्तंभों को प्राप्त करने में सक्षम नहीं हूं जो इस प्रक्रिया के दौरान चयनित हुए। क्या आप कृपया इस पर मेरी मदद कर सकते हैं!
विग्नेश प्रजापति

क्या आपने चर feature_namesमें विधि की जांच की iris? यह मेरे लिए ठीक काम करता है।
itdxer

12

वैकल्पिक रूप से, यदि आप अपने SVC को फिट करने के बाद फीचर चयन के लिए SelectFromModel का उपयोग करते हैं, तो आप उदाहरण विधि का उपयोग कर सकते हैं 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 समाधान के आधार पर, मैं आमतौर पर करता हूं:

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')
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.