Scikit-learn có lựa chọn chuyển tiếp / thuật toán hồi quy từng bước không?


37

Tôi đang giải quyết vấn đề với quá nhiều tính năng và việc đào tạo các mô hình của tôi mất quá nhiều thời gian. Tôi thực hiện thuật toán lựa chọn chuyển tiếp để chọn các tính năng.

Tuy nhiên, tôi đã tự hỏi liệu scikit-learn có lựa chọn chuyển tiếp / thuật toán hồi quy từng bước không?


Tôi đã tạo ra lớp học của riêng mình cho điều đó nhưng rất ngạc nhiên khi sklearn không có điều đó.
Maksud

1
Sử dụng các bài kiểm tra giả thuyết là một phương pháp lựa chọn tính năng khủng khiếp. Bạn sẽ phải làm rất nhiều trong số họ và tất nhiên, bạn sẽ nhận được rất nhiều mặt tích cực và tiêu cực.
Ricardo Cruz

Câu trả lời:


21

Không, sklearn dường như không có thuật toán lựa chọn chuyển tiếp. Tuy nhiên, nó cung cấp loại bỏ tính năng đệ quy, là thuật toán loại bỏ tính năng tham lam tương tự như lựa chọn lùi tuần tự. Xem tài liệu ở đây:

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


3
Đề xuất tốt, nhưng vấn đề với việc triển khai bộ khoa học là tầm quan trọng của tính năng được định lượng bằng các hệ số mô hình, tức là nếu mô hình có coef_giao diện. Điều này sẽ loại trừ phương pháp dựa trên cây, v.v. Tuy nhiên, tôi nghĩ những gì @Maksud yêu cầu là những gì được mô tả trong "Giới thiệu về học thống kê" của James, trong đó các tính năng được thêm / xóa theo mức độ quan trọng của chúng mà độ chính xác của nó được định lượng bằng xác thực . Điều này cho phép lựa chọn tính năng trên tất cả các loại mô hình, không chỉ các kiểu tham số tuyến tính.
eggie5

9

Sklearn DOES có một thuật toán lựa chọn chuyển tiếp, mặc dù nó không được gọi là trong scikit-learn. Phương pháp lựa chọn tính năng được gọi là F_regression trong scikit-learn sẽ tuần tự bao gồm các tính năng cải thiện mô hình nhiều nhất, cho đến khi có Kcác tính năng trong mô hình (K là đầu vào).

Nó bắt đầu bằng cách hồi quy các nhãn trên từng tính năng riêng lẻ và sau đó quan sát tính năng nào đã cải thiện mô hình nhiều nhất bằng cách sử dụng thống kê F. Sau đó, nó kết hợp các tính năng chiến thắng vào mô hình. Sau đó, nó lặp lại thông qua các tính năng còn lại để tìm tính năng tiếp theo giúp cải thiện mô hình nhiều nhất, một lần nữa bằng cách sử dụng thử nghiệm thống kê F hoặc F. Nó làm điều này cho đến khi có các tính năng K trong mô hình.

Lưu ý rằng các tính năng còn lại tương quan với các tính năng được tích hợp vào mô hình có thể sẽ không được chọn, vì chúng không tương quan với phần dư (mặc dù chúng có thể tương quan tốt với nhãn). Điều này giúp bảo vệ chống lại đa cộng đồng.



1
Ý bạn là Chọn K-best ?
Nitro

Vâng. Ngoài ra, bạn nên đọc cái này: stats.stackexchange.com/questions/204141/ .
Candic3

2
Đó là loại lựa chọn về phía trước. Nhưng nó không chung chung - nó đặc trưng cho mô hình hồi quy tuyến tính, trong khi lựa chọn chuyển tiếp thông thường có thể hoạt động với bất kỳ mô hình nào (mô hình bất khả tri) như RFE và có thể xử lý các vấn đề phân loại hoặc hồi quy. Nhưng tôi nghi ngờ hầu hết mọi người đang tìm kiếm trường hợp sử dụng này và chắc chắn sẽ tốt khi đề cập đến nó ở đây.
Simon

2
Đây không phải là lựa chọn STEPWISE, vì mỗi giá trị p được tính cho hồi quy đơn biến, độc lập với tất cả các hiệp phương sai khác.
David Dale

9

Scikit-learn thực sự không hỗ trợ hồi quy từng bước. Đó là bởi vì cái thường được gọi là 'hồi quy từng bước' là một thuật toán dựa trên giá trị p của các hệ số của hồi quy tuyến tính, và scikit-learn cố tình tránh cách tiếp cận suy luận để học mô hình (kiểm tra ý nghĩa, v.v.). Hơn nữa, OLS thuần túy chỉ là một trong vô số thuật toán hồi quy, và theo quan điểm học scikit, nó không quan trọng lắm, cũng không phải là một trong những thuật toán tốt nhất.

Tuy nhiên, có một số lời khuyên cho những người vẫn cần một cách tốt để lựa chọn tính năng với các mô hình tuyến tính:

  1. Sử dụng các mô hình thưa thớt như ElasticNethoặc Lasso.
  2. Bình thường hóa các tính năng của bạn với StandardScaler, và sau đó đặt hàng các tính năng của bạn chỉ bằng cách model.coef_. Đối với các hiệp phương thức hoàn toàn độc lập, nó tương đương với việc sắp xếp theo giá trị p. Lớp học sklearn.feature_selection.RFEsẽ làm điều đó cho bạn, và RFECVthậm chí sẽ đánh giá số lượng tính năng tối ưu.
  3. R2statsmodels
  4. Thực hiện lựa chọn chuyển tiếp hoặc lùi để tối đa hóa số liệu yêu thích của bạn khi xác thực chéo (có thể mất khoảng thời gian bậc hai về số lượng hiệp phương sai). mlxtendGói tương thích scikit-learn hỗ trợ phương pháp này cho bất kỳ công cụ ước tính và bất kỳ số liệu nào.
  5. Nếu bạn vẫn muốn hồi quy từng bước vanilla, thì việc căn cứ vào nó sẽ dễ dàng hơn statsmodels, vì gói này tính toán giá trị p cho bạn. Một lựa chọn tiến lùi cơ bản có thể trông như thế này:

`` `

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)

Ví dụ này sẽ in đầu ra sau:

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

Mã hồi quy từng bước được đăng không hoạt động chính xác. Nó sẽ cho kết quả giống hệt nhau để hồi quy từng bước, nhưng không. Đó là các yếu tố trả về với giá trị p cao hơn ngưỡng khi bạn chạy lại hồi quy. Tôi cũng đã chạy cùng một tập dữ liệu với STATA và các ngưỡng tương tự bằng cách sử dụng ngược từng bước và thu được các kết quả khác nhau về mặt vật chất. Về cơ bản, không sử dụng nó. Tôi sẽ viết mã hồi quy ngược của riêng mình bằng cách sử dụng mẫu của mình.
Michael Corley MBA LSSBB

Hồi quy tiến và lùi từng bước không có nghĩa là được đảm bảo để hội tụ vào cùng một giải pháp. Và nếu bạn nhận thấy một lỗi trong giải pháp của tôi, vui lòng đính kèm mã để sao chép nó.
David Dale

1

Trong thực tế, có một thuật toán hay gọi là "Forward_Select" sử dụng Statsmodels và cho phép bạn đặt số liệu của riêng bạn (AIC, BIC, Điều chỉnh-R-Squared hoặc bất cứ điều gì bạn muốn) để thêm dần một biến vào mô hình. Thuật toán có thể được tìm thấy trong phần bình luận của trang này - cuộn xuống và bạn sẽ thấy nó ở gần cuối trang.

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

Tôi sẽ thêm rằng thuật toán cũng có một tính năng hay: bạn có thể áp dụng nó cho các vấn đề phân loại hoặc hồi quy! Bạn chỉ cần nói với nó.

Hãy thử và cảm nhận bản thân mình.


0

Trên thực tế sklearn không có thuật toán lựa chọn chuyển tiếp, nghĩ rằng một yêu cầu kéo với việc triển khai lựa chọn tính năng chuyển tiếp chờ trong kho lưu trữ Scikit-Learn kể từ tháng 4 năm 2017.

Thay thế, có lựa chọn lùi và tiến một bước về phía trước trong mlxtend . Bạn có thể tìm thấy tài liệu của nó trong Bộ chọn tính năng tuần tự

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.