क्या स्किट-लर्न में फॉरवर्ड सिलेक्शन / स्टेप वाइज रिग्रेशन अल्गोरिथम है?


37

मैं बहुत अधिक सुविधाओं के साथ समस्या पर काम कर रहा हूं और मेरे मॉडल को प्रशिक्षित करने में बहुत लंबा समय लगता है। मैंने सुविधाओं को चुनने के लिए आगे के चयन एल्गोरिथ्म को लागू किया।

हालाँकि, मैं सोच रहा था कि भविष्य में चयन / स्टेप वाइज रिग्रेशन अल्गोरिद्म सीखता है?


मैंने उसके लिए अपनी खुद की क्लास बनाई लेकिन बहुत आश्चर्य हुआ कि स्केलेर के पास ऐसा नहीं है।
मकसूद

1
परिकल्पना परीक्षणों का उपयोग करना सुविधा चयन की एक भयानक विधि है। आपको उनमें से बहुत कुछ करना होगा और निश्चित रूप से, आपको बहुत सी झूठी सकारात्मक और नकारात्मक बातें मिलेंगी।
रिकार्डो क्रूज़

जवाबों:


21

नहीं, स्केलेरन के पास फॉरवर्ड सिलेक्शन एल्गोरिदम नहीं है। हालांकि, यह पुनरावर्ती सुविधा उन्मूलन प्रदान करता है, जो अनुक्रमिक पिछड़े चयन के समान एक लालची सुविधा उन्मूलन एल्गोरिदम है। दस्तावेज यहाँ देखें:

http://scikit-learn.org/stable/modules/generated/sklearn.feature_selection.RFE.html


3
अच्छा सुझाव है, लेकिन समस्या डब्ल्यू / विज्ञान-किट के कार्यान्वयन की विशेषता है कि मॉडल के गुणांक द्वारा मॉडल के महत्व को निर्धारित किया जाता है, अर्थात यदि मॉडल में coef_इंटरफ़ेस है। यह वृक्ष आधारित विधि आदि पर शासन करेगा। हालाँकि, मुझे लगता है कि जेम्स ने @Maksud ने जो पूछा है वह "सांख्यिकीय शिक्षा के लिए एक परिचय" में वर्णित है, जिसमें सुविधाओं को उनके महत्व द्वारा पुन: जोड़ा / हटा दिया जाता है, जो सत्यापन द्वारा उनकी सटीकता निर्धारित करता है। । यह सभी प्रकार के मॉडलों में सुविधा चयन की अनुमति देता है, न कि केवल रैखिक पैरामीट्रिक वाले।
eggie5

9

Sklearn DOES में एक आगे का चयन एल्गोरिथ्म है, हालांकि इसे scikit-learn में नहीं कहा जाता है। स्किकिट- लर्न में F_regression नामक फीचर चयन पद्धति में क्रमिक रूप से वे विशेषताएं शामिल होंगी जो मॉडल में सबसे अधिक सुधार करती हैं, जब तक Kकि मॉडल में विशेषताएं नहीं होती हैं (K एक इनपुट है)।

यह व्यक्तिगत रूप से प्रत्येक सुविधा पर लेबल को प्रतिगमन द्वारा शुरू करता है, और फिर यह देखते हुए कि किस विशेषता ने मॉडल को एफ-स्टेटिस्टिक का उपयोग करते हुए सबसे अधिक सुधार किया। फिर यह मॉडल में जीतने की सुविधा को शामिल करता है। फिर यह शेष सुविधाओं के माध्यम से पुन: प्रदर्शित करता है कि अगली विशेषता को ढूंढें जो मॉडल को सबसे अधिक सुधारता है, फिर से एफ-स्टेटिस्टिक या एफ परीक्षण का उपयोग कर। यह ऐसा तब तक करता है जब तक मॉडल में के फीचर्स नहीं होते।

ध्यान दें कि मॉडल में शामिल सुविधाओं में सहसंबद्ध शेष विशेषताएं संभवतः चयनित नहीं होंगी, क्योंकि वे अवशिष्टों के साथ सहसंबंध नहीं रखते हैं (हालांकि वे लेबल के साथ अच्छी तरह से सहसंबंधित हो सकते हैं)। यह बहु-कोलिनियरिटी के खिलाफ गार्ड की मदद करता है।


1
हालाँकि, जागरूक रहें: stata.com/support/faqs/statistics/stepwise-regression-problems
Candic3


हाँ। इसके अलावा, आपको इसे पढ़ना चाहिए: आंकड़े . stackexchange.com/questions/204141/…
कैंडिक 3

2
वह आगे के चयन का एक प्रकार है। लेकिन यह सामान्य नहीं है - यह एक रैखिक प्रतिगमन मॉडल के लिए विशिष्ट है, जबकि आम तौर पर आगे का चयन किसी भी मॉडल (मॉडल अज्ञेयवादी) के साथ काम कर सकता है जैसा कि RFE है और वर्गीकरण या प्रतिगमन समस्याओं को संभाल सकता है। लेकिन मुझे संदेह है कि ज्यादातर लोग इस उपयोग के मामले की तलाश कर रहे हैं और यहां इसका उल्लेख करना निश्चित रूप से अच्छा है।
साइमन

2
यह एक STEPWISE चयन नहीं है, क्योंकि प्रत्येक पी-मूल्य की गणना एक अविभाजित प्रतिगमन के लिए की जाती है, स्वतंत्र रूप से अन्य सभी सहसंयोजकों की।
डेविड डेल

9

स्किकिट-लर्न वास्तव में स्टेप वाइज रिग्रेशन का समर्थन नहीं करता है। ऐसा इसलिए है क्योंकि आमतौर पर जिसे 'स्टेप वाइज रिग्रेशन' के रूप में जाना जाता है, वह लीनियर रिग्रेशन के गुणांकों के पी-मूल्यों पर आधारित एक एल्गोरिथ्म है, और स्किकिट-लर्न जानबूझकर मॉडल लर्निंग (महत्व परीक्षण आदि) के लिए हीन दृष्टिकोण से बचा जाता है। इसके अलावा, शुद्ध ओएलएस केवल कई प्रतिगमन एल्गोरिदम में से एक है, और दृश्य-सीखने के दृष्टिकोण से यह न तो बहुत महत्वपूर्ण है, और न ही सर्वश्रेष्ठ में से एक है।

हालांकि, उन लोगों के लिए सलाह के कुछ टुकड़े हैं जिन्हें अभी भी रैखिक मॉडल के साथ सुविधा चयन के लिए एक अच्छे तरीके की आवश्यकता है:

  1. ElasticNetया जैसे स्वाभाविक रूप से विरल मॉडल का उपयोग करें Lasso
  2. के साथ अपनी सुविधाओं को सामान्य करें StandardScaler, और फिर बस अपनी सुविधाओं को ऑर्डर करें model.coef_। पूरी तरह से स्वतंत्र covariates के लिए यह पी-मूल्यों द्वारा छँटाई के बराबर है। वर्ग sklearn.feature_selection.RFEइसे आपके लिए RFECVकरेगा , और सुविधाओं की अधिकतम संख्या का मूल्यांकन भी करेगा।
  3. आर2statsmodels
  4. क्रॉस-वेलिडेशन पर अपने पसंदीदा मीट्रिक को अधिकतम करने के लिए ब्रूट-फोर्स को आगे या पीछे के चयन के लिए करें (यह कोवरिएट की संख्या में लगभग द्विघात समय ले सकता है)। एक स्कोर-लर्न संगत mlxtendपैकेज किसी भी अनुमानक और किसी भी मीट्रिक के लिए इस दृष्टिकोण का समर्थन करता है
  5. यदि आप अभी भी वैनिला स्टेप वाइज रिग्रेशन चाहते हैं, तो इसे आधार बनाना आसान है statsmodels, क्योंकि यह पैकेज आपके लिए पी-वैल्यू की गणना करता है। एक बुनियादी आगे-पिछड़े चयन इस तरह दिख सकता है:

`` `

from sklearn.datasets import load_boston
import pandas as pd
import numpy as np
import statsmodels.api as sm

data = load_boston()
X = pd.DataFrame(data.data, columns=data.feature_names)
y = data.target


def stepwise_selection(X, y, 
                       initial_list=[], 
                       threshold_in=0.01, 
                       threshold_out = 0.05, 
                       verbose=True):
    """ Perform a forward-backward feature selection 
    based on p-value from statsmodels.api.OLS
    Arguments:
        X - pandas.DataFrame with candidate features
        y - list-like with the target
        initial_list - list of features to start with (column names of X)
        threshold_in - include a feature if its p-value < threshold_in
        threshold_out - exclude a feature if its p-value > threshold_out
        verbose - whether to print the sequence of inclusions and exclusions
    Returns: list of selected features 
    Always set threshold_in < threshold_out to avoid infinite looping.
    See https://en.wikipedia.org/wiki/Stepwise_regression for the details
    """
    included = list(initial_list)
    while True:
        changed=False
        # forward step
        excluded = list(set(X.columns)-set(included))
        new_pval = pd.Series(index=excluded)
        for new_column in excluded:
            model = sm.OLS(y, sm.add_constant(pd.DataFrame(X[included+[new_column]]))).fit()
            new_pval[new_column] = model.pvalues[new_column]
        best_pval = new_pval.min()
        if best_pval < threshold_in:
            best_feature = new_pval.argmin()
            included.append(best_feature)
            changed=True
            if verbose:
                print('Add  {:30} with p-value {:.6}'.format(best_feature, best_pval))

        # backward step
        model = sm.OLS(y, sm.add_constant(pd.DataFrame(X[included]))).fit()
        # use all coefs except intercept
        pvalues = model.pvalues.iloc[1:]
        worst_pval = pvalues.max() # null if pvalues is empty
        if worst_pval > threshold_out:
            changed=True
            worst_feature = pvalues.argmax()
            included.remove(worst_feature)
            if verbose:
                print('Drop {:30} with p-value {:.6}'.format(worst_feature, worst_pval))
        if not changed:
            break
    return included

result = stepwise_selection(X, y)

print('resulting features:')
print(result)

यह उदाहरण निम्नलिखित आउटपुट को प्रिंट करेगा:

Add  LSTAT                          with p-value 5.0811e-88
Add  RM                             with p-value 3.47226e-27
Add  PTRATIO                        with p-value 1.64466e-14
Add  DIS                            with p-value 1.66847e-05
Add  NOX                            with p-value 5.48815e-08
Add  CHAS                           with p-value 0.000265473
Add  B                              with p-value 0.000771946
Add  ZN                             with p-value 0.00465162
resulting features:
['LSTAT', 'RM', 'PTRATIO', 'DIS', 'NOX', 'CHAS', 'B', 'ZN']

पोस्ट फ़ॉरवर्ड स्टेप वाइज रिग्रेशन कोड सही से काम नहीं करता है। यह बैकवर्ड स्टेपवाइज रिग्रेशन के समान परिणाम देगा, लेकिन ऐसा नहीं है। यह पी-मानों के साथ कारकों को वापस कर रहा है जो कि प्रतिगमन को फिर से शुरू करने पर सीमा से अधिक है। मैंने उसी डेटासेट को STATA और उसी थ्रेसहोल्ड के साथ पीछे की ओर स्टेप वाइज इस्तेमाल किया और भौतिक रूप से अलग-अलग परिणाम प्राप्त किए। मूल रूप से, इसका उपयोग न करें। मैं अपने टेम्पलेट का उपयोग करके अपना स्वयं का बैकवर्ड स्टेपवाइज रिग्रेशन कोड लिखने जा रहा हूं।
माइकल कोरले MBA LSSBB

फॉरवर्ड और बैकवर्ड स्टेपवाइज रिग्रेशन उसी उपाय के अनुसार परिवर्तित करने की गारंटी नहीं है। और अगर आपने मेरे समाधान में बग देखा है, तो कृपया इसे पुन: पेश करने के लिए कोड संलग्न करें।
डेविड डेल

1

वास्तव में "फॉरवर्ड_सेलेट" नामक एक अच्छा एल्गोरिथ्म है जो स्टैट्समॉडल का उपयोग करता है और आपको अपने स्वयं के मीट्रिक (एआईसी, बीआईसी, एडजस्टेड-आर-स्क्वायर्ड, या जो भी आप पसंद करते हैं) को उत्तरोत्तर मॉडल में एक चर जोड़ने की अनुमति देता है। एल्गोरिथ्म इस पृष्ठ के टिप्पणी अनुभाग में पाया जा सकता है - नीचे स्क्रॉल करें और आप इसे पृष्ठ के नीचे के पास देखेंगे।

https://planspace.org/20150423-forward_selection_with_statsmodels/

मुझे लगता है कि एल्गोरिथ्म में भी एक अच्छी सुविधा है: आप इसे या तो वर्गीकरण या प्रतिगमन समस्याओं पर लागू कर सकते हैं! आपको बस इसे बताना है।

प्रयास करें और खुद देखें।


0

वास्तव में स्केलेर में एक आगे का चयन एल्गोरिथ्म नहीं है, अप्रैल 2017 से स्किट-लर्न रिपॉजिटरी में फॉरवर्ड फीचर चयन के कार्यान्वयन के साथ एक पुल अनुरोध को सोचा गया था ।

एक विकल्प के रूप में, एमएलएक्स्टेंड में आगे और एक-कदम-आगे पिछड़ा चयन है । आप यह देख सकते हैं कि यह अनुक्रमिक फीचर चयनकर्ता में दस्तावेज़ है

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