scikit-learn มีการเลือกล่วงหน้า / อัลกอริทึมการถดถอยแบบขั้นตอนหรือไม่


37

ฉันกำลังทำงานกับปัญหาที่มีคุณสมบัติมากเกินไปและการฝึกอบรมแบบจำลองของฉันใช้เวลานานเกินไป ฉันใช้อัลกอริทึมการเลือกไปข้างหน้าเพื่อเลือกคุณสมบัติ

อย่างไรก็ตามฉันสงสัยว่า scikit-Learn มีการเลือกล่วงหน้า / อัลกอริทึมการถดถอยแบบขั้นตอนหรือไม่


ฉันสร้างชั้นเรียนของฉันเองสำหรับสิ่งนั้น แต่ก็แปลกใจอย่างมากที่ sklearn ไม่มีสิ่งนั้น
Maksud

1
การใช้การทดสอบสมมติฐานเป็นวิธีที่ยอดเยี่ยมในการเลือกคุณสมบัติ คุณจะต้องทำหลายอย่างและแน่นอนคุณจะได้รับผลบวกและเชิงลบที่ผิดพลาดมากมาย
Ricardo Cruz

คำตอบ:


21

ไม่ sklearn ดูเหมือนจะไม่มีอัลกอริทึมการเลือกไปข้างหน้า อย่างไรก็ตามมันมีคุณสมบัติการกำจัดแบบเรียกซ้ำซึ่งเป็นอัลกอริทึมการกำจัดคุณลักษณะที่โลภคล้ายกับการเลือกแบบย้อนกลับตามลำดับ ดูเอกสารที่นี่:

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


3
ข้อเสนอแนะที่ดี แต่ปัญหาที่เกิดขึ้นจากการนำไปใช้ของชุดเครื่องมือคือความสำคัญของคุณลักษณะนั้นถูกวัดโดยสัมประสิทธิ์ของโมเดลนั่นคือถ้าโมเดลนั้นมีcoef_ส่วนต่อประสาน สิ่งนี้จะแยกแยะวิธีที่ยึดตามต้นไม้เป็นต้นอย่างไรก็ตามฉันคิดว่าสิ่งที่ @ Maksud ขอคือสิ่งที่อธิบายไว้ใน "การแนะนำการเรียนรู้เชิงสถิติ" โดย James ซึ่งมีการเพิ่ม / ลบคุณลักษณะซ้ำ ๆ โดยความสำคัญของพวกเขา . สิ่งนี้ช่วยให้สามารถเลือกคุณสมบัติในทุกรุ่นของแบบจำลองได้ไม่ใช่แบบเชิงเส้นเชิงเส้น
eggie5

9

Sklearn DOES มีอัลกอริธึมการเลือกไปข้างหน้าแม้ว่าจะไม่ได้เรียกว่าใน scikit เรียนรู้ วิธีการเลือกคุณสมบัติที่เรียกว่าF_regressionใน scikit-learn จะเรียงตามลำดับรวมถึงคุณลักษณะที่ปรับปรุงโมเดลมากที่สุดจนกว่าจะมีKฟีเจอร์ในโมเดล (K คืออินพุต)

มันเริ่มต้นด้วยการถดถอยเลเบลของแต่ละคุณลักษณะแล้วสังเกตว่าฟีเจอร์ใดที่ปรับปรุงโมเดลให้ดีที่สุดโดยใช้สถิติ F จากนั้นจะรวมคุณสมบัติการชนะเข้ากับโมเดล จากนั้นมันจะทำซ้ำผ่านฟีเจอร์ที่เหลือเพื่อค้นหาฟีเจอร์ถัดไปที่ปรับปรุงโมเดลได้มากที่สุดอีกครั้งโดยใช้การทดสอบ F-statistic หรือ F มันทำเช่นนี้จนกว่าจะมีคุณสมบัติ K ในรูปแบบ

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


1
อย่างไรก็ตามโปรดระวัง: stata.com/support/faqs/statistics/stepwise-regression-problems
Candic3

1
คุณหมายถึงSelect K-bestหรือเปล่า
Nitro

ใช่. นอกจากนี้คุณควรอ่านนี้: stats.stackexchange.com/questions/204141/...
Candic3

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

2
นี่ไม่ใช่ตัวเลือก STEPWISE เนื่องจากแต่ละค่า p ถูกคำนวณสำหรับการถดถอยแบบ univariate โดยไม่ขึ้นกับ covariates อื่นทั้งหมด
David Dale

9

Scikit-Learn แน่นอนไม่สนับสนุนการถดถอยแบบขั้นตอน นั่นเป็นเพราะสิ่งที่เป็นที่รู้จักกันทั่วไปว่า 'การถดถอยแบบขั้นตอน' เป็นอัลกอริทึมที่ขึ้นอยู่กับค่า p ของสัมประสิทธิ์การถดถอยเชิงเส้นและ scikit เรียนรู้จงใจหลีกเลี่ยงวิธีการอนุมานเพื่อการเรียนรู้แบบจำลอง ยิ่งไปกว่านั้น OLS ที่บริสุทธิ์เป็นเพียงหนึ่งในอัลกอริธึมการถดถอยจำนวนมากและจากมุมมองของการเรียนรู้ scikit มันไม่สำคัญมากหรือเป็นหนึ่งในสิ่งที่ดีที่สุด

อย่างไรก็ตามมีคำแนะนำบางอย่างสำหรับผู้ที่ยังต้องการวิธีที่ดีในการเลือกคุณสมบัติด้วยโมเดลเชิงเส้น:

  1. ใช้โมเดลที่เบาบางโดยเนื้อแท้เหมือนหรือElasticNetLasso
  2. ทำให้ปกติคุณสมบัติของคุณเป็นปกติStandardScalerแล้วสั่งซื้อคุณสมบัติของคุณเพียงแค่model.coef_นี้ สำหรับตัวแปรอิสระที่สมบูรณ์แบบมันเทียบเท่ากับการเรียงลำดับตามค่า p ชั้นเรียนsklearn.feature_selection.RFEจะทำเพื่อคุณและRFECVจะประเมินจำนวนคุณลักษณะที่เหมาะสม
  3. R2statsmodels
  4. ทำการเลือกอย่างไร้เดียงสาไปข้างหน้าหรือข้างหลังเพื่อเพิ่มการวัดที่คุณชื่นชอบให้มากที่สุดในการตรวจสอบความถูกต้องไขว้กัน mlxtendแพคเกจที่เข้ากันได้กับ Scikit-Learn รองรับวิธีนี้สำหรับตัวประมาณและตัวชี้วัดใด ๆ
  5. หากคุณยังคงต้องการการถดถอยแบบขั้นตอนของวานิลลามันจะง่ายกว่าstatsmodelsเพราะจะคำนวณตามค่า p สำหรับคุณ การเลือกไปข้างหน้าย้อนกลับขั้นพื้นฐานอาจมีลักษณะเช่นนี้:

`` `

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']

รหัสการถดถอยตามขั้นตอนไปข้างหน้าที่ลงรายการบัญชีทำงานไม่ถูกต้อง มันควรให้ผลลัพธ์ที่เหมือนกันกับการถดถอยแบบขั้นตอนย้อนหลัง แต่ไม่ได้ มันกำลังส่งคืนปัจจัยที่มีค่า p ที่สูงกว่าขีด จำกัด เมื่อคุณรันการถดถอยอีกครั้ง ฉันยังใช้ชุดข้อมูลเดียวกันกับ STATA และเกณฑ์เดียวกันโดยใช้แบบย้อนกลับทีละขั้นและได้ผลลัพธ์ที่แตกต่างอย่างมาก โดยทั่วไปอย่าใช้มัน ฉันจะเขียนโค้ดถดถอยแบบขั้นตอนของตัวเองโดยใช้เทมเพลตของเขา
Michael Corley MBA LSSBB

การถดถอยแบบขั้นตอนไปข้างหน้าและถอยหลังไม่ได้รับประกันว่าจะได้มาบรรจบกันในโซลูชันเดียวกัน และถ้าคุณสังเกตเห็นข้อผิดพลาดในโซลูชันของฉันโปรดแนบรหัสเพื่อทำซ้ำ
David Dale

1

อันที่จริงมีอัลกอริทึมที่ดีที่เรียกว่า "Forward_Select" ที่ใช้ Statsmodels และช่วยให้คุณตั้งค่าการวัดของคุณเอง (AIC, BIC, Adjusted-R-Squared หรืออะไรก็ตามที่คุณต้องการ) เพื่อเพิ่มตัวแปรให้กับโมเดล อัลกอริทึมสามารถพบได้ในส่วนความคิดเห็นของหน้านี้ - เลื่อนลงและคุณจะเห็นมันใกล้ด้านล่างของหน้า

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

ฉันจะเพิ่มว่าอัลกอริทึมยังมีคุณสมบัติที่ดีอย่างหนึ่ง: คุณสามารถใช้มันกับปัญหาการจำแนกหรือการถดถอย! คุณแค่ต้องบอกมัน

ลองและดูด้วยตัวคุณเอง


0

ที่จริงแล้ว sklearn ไม่มีอัลกอริธึมการเลือกไปข้างหน้าคิดว่าการร้องขอแบบดึงพร้อมการใช้งานการเลือกคุณลักษณะล่วงหน้าจะรออยู่ในที่เก็บ Scikit-Learn ตั้งแต่เดือนเมษายน 2017

เป็นทางเลือกที่มีความเป็นไปข้างหน้าและเป็นหนึ่งในขั้นตอนการเลือกข้างหน้าย้อนกลับในmlxtend คุณสามารถค้นหามันเป็นเอกสารในตัวเลือกคุณสมบัติตามลำดับ

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