Tính năng quan trọng với các biến giả


17

Tôi đang cố gắng hiểu làm thế nào tôi có thể có được tầm quan trọng tính năng của một biến phân loại đã được chia thành các biến giả. Tôi đang sử dụng scikit-learn không xử lý các biến phân loại cho bạn theo cách R hoặc h2o làm.

Nếu tôi chia một biến phân loại thành các biến giả, tôi sẽ nhận được các tính năng quan trọng riêng biệt cho mỗi lớp trong biến đó.

Câu hỏi của tôi là, nó có ý nghĩa để kết hợp lại các quan trọng biến giả đó thành một giá trị quan trọng cho một biến phân loại bằng cách đơn giản là tóm tắt chúng?

Từ trang 368 của Các yếu tố của học thống kê:

Tầm quan trọng tương đối bình phương của biến là tổng của các cải tiến bình phương như vậy đối với tất cả các nút bên trong mà nó được chọn làm biến táchX

Điều này khiến tôi nghĩ rằng vì giá trị quan trọng đã được tạo bằng cách tính tổng số liệu ở mỗi nút, biến được chọn, nên tôi có thể kết hợp các giá trị quan trọng của biến giả để "phục hồi" tầm quan trọng cho biến phân loại. Tất nhiên tôi không mong đợi nó chính xác, nhưng những giá trị này thực sự là giá trị chính xác vì chúng được tìm thấy thông qua một quá trình ngẫu nhiên.

Tôi đã viết mã python sau đây (trong jupyter) như một cuộc điều tra:

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from matplotlib import animation, rc
from sklearn.datasets import load_diabetes
from sklearn.ensemble import RandomForestClassifier
import re

#%matplotlib inline
from IPython.display import HTML
from IPython.display import set_matplotlib_formats

plt.rcParams['figure.autolayout'] = False
plt.rcParams['figure.figsize'] = 10, 6
plt.rcParams['axes.labelsize'] = 18
plt.rcParams['axes.titlesize'] = 20
plt.rcParams['font.size'] = 14
plt.rcParams['lines.linewidth'] = 2.0
plt.rcParams['lines.markersize'] = 8
plt.rcParams['legend.fontsize'] = 14

# Get some data, I could not easily find a free data set with actual categorical variables, so I just created some from continuous variables
data = load_diabetes()
df = pd.DataFrame(data.data, columns=[data.feature_names])
df = df.assign(target=pd.Series(data.target))

# Functions to plot the variable importances
def autolabel(rects, ax):
    """
    Attach a text label above each bar displaying its height
    """
    for rect in rects:
        height = rect.get_height()
        ax.text(rect.get_x() + rect.get_width()/2.,
                1.05*height,
                f'{round(height,3)}',
                ha='center',
                va='bottom')

def plot_feature_importance(X,y,dummy_prefixes=None, ax=None, feats_to_highlight=None):

    # Find the feature importances by fitting a random forest
    forest = RandomForestClassifier(n_estimators=100)
    forest.fit(X,y)
    importances_dummy = forest.feature_importances_

    # If there are specified dummy variables, combing them into a single categorical 
    # variable by summing the importances. This code assumes the dummy variables were
    # created using pandas get_dummies() method names the dummy variables as
    # featurename_categoryvalue
    if dummy_prefixes is None:
        importances_categorical = importances_dummy
        labels = X.columns
    else:
        dummy_idx = np.repeat(False,len(X.columns))
        importances_categorical = []
        labels = []

        for feat in dummy_prefixes:
            feat_idx = np.array([re.match(f'^{feat}_', col) is not None for col in X.columns])
            importances_categorical = np.append(importances_categorical,
                                                sum(importances_dummy[feat_idx]))
            labels = np.append(labels,feat)
            dummy_idx = dummy_idx | feat_idx
        importances_categorical = np.concatenate((importances_dummy[~dummy_idx],
                                                  importances_categorical))
        labels = np.concatenate((X.columns[~dummy_idx], labels))

    importances_categorical /= max(importances_categorical)
    indices = np.argsort(importances_categorical)[::-1]

    # Plotting

    if ax is None:
        fig, ax = plt.subplots()

    plt.title("Feature importances")
    rects = ax.bar(range(len(importances_categorical)),
                   importances_categorical[indices],
                   tick_label=labels[indices],
                   align="center")
    autolabel(rects, ax)

    if feats_to_highlight is not None:
        highlight = [feat in feats_to_highlight for feat in labels[indices]]
        rects2 = ax.bar(range(len(importances_categorical)),
                       importances_categorical[indices]*highlight,
                       tick_label=labels[indices],
                       color='r',
                       align="center")
        rects = [rects,rects2]
    plt.xlim([-0.6, len(importances_categorical)-0.4])
    ax.set_ylim((0, 1.125))
    return rects

# Create importance plots leaving everything as categorical variables. I'm highlighting bmi and age as I will convert those into categorical variables later
X = df.drop('target',axis=1)
y = df['target'] > 140.5

plot_feature_importance(X,y, feats_to_highlight=['bmi', 'age'])
plt.title('Feature importance with bmi and age left as continuous variables')

#Create an animation of what happens to variable importance when I split bmi and age into n (n equals 2 - 25) different classes
# %%capture

fig, ax = plt.subplots()

def animate(i):
    ax.clear()

    # Split one of the continuous variables up into a categorical variable with i balanced classes
    X_test = X.copy()
    n_categories = i+2
    X_test['bmi'] = pd.cut(X_test['bmi'],
                           np.percentile(X['bmi'], np.linspace(0,100,n_categories+1)),
                           labels=[chr(num+65) for num in range(n_categories)])
    X_test['age'] = pd.cut(X_test['age'],
                           np.percentile(X['age'], np.linspace(0,100,n_categories+1)),
                           labels=[chr(num+65) for num in range(n_categories)])
    X_test = pd.get_dummies(X_test, drop_first=True)

    # Plot the feature importances
    rects = plot_feature_importance(X_test,y,dummy_prefixes=['bmi', 'age'],ax=ax, feats_to_highlight=['bmi', 'age'])
    plt.title(f'Feature importances for {n_categories} bmi and age categories')
    ax.spines['top'].set_visible(False)
    ax.spines['right'].set_visible(False)
    ax.spines['bottom'].set_visible(False)
    ax.spines['left'].set_visible(False)

    return [rects,]

anim = animation.FuncAnimation(fig, animate, frames=24, interval=1000)

HTML(anim.to_html5_video())

Dưới đây là một số kết quả:

nhập mô tả hình ảnh ở đây

nhập mô tả hình ảnh ở đây

Chúng ta có thể quan sát rằng tầm quan trọng của biến chủ yếu phụ thuộc vào số lượng danh mục, điều này khiến tôi đặt câu hỏi về tiện ích của các biểu đồ này nói chung. Đặc biệt là tầm quan trọng của việc age đạt được giá trị cao hơn nhiều so với đối tác liên tục của nó.

Và cuối cùng, một ví dụ nếu tôi để chúng là các biến giả (chỉ bmi):

# Split one of the continuous variables up into a categorical variable with i balanced classes
X_test = X.copy()
n_categories = 5
X_test['bmi'] = pd.cut(X_test['bmi'],
                       np.percentile(X['bmi'], np.linspace(0,100,n_categories+1)),
                       labels=[chr(num+65) for num in range(n_categories)])
X_test = pd.get_dummies(X_test, drop_first=True)

# Plot the feature importances
rects = plot_feature_importance(X_test,y, feats_to_highlight=['bmi_B','bmi_C','bmi_D', 'bmi_E'])
plt.title(f"Feature importances for {n_categories} bmi categories")

nhập mô tả hình ảnh ở đây

Câu trả lời:


8

Khi làm việc với "tầm quan trọng của tính năng" nói chung, sẽ hữu ích khi nhớ rằng trong hầu hết các trường hợp, phương pháp chính quy hóa thường là một lựa chọn tốt. Nó sẽ tự động "chọn các tính năng quan trọng nhất" cho vấn đề hiện tại. Bây giờ, nếu chúng ta không muốn theo khái niệm chính quy hóa (thường là trong bối cảnh hồi quy), các phân loại rừng ngẫu nhiên và khái niệm kiểm tra hoán vị tự nhiên cho vay một giải pháp cho tầm quan trọng của nhóm biến. Điều này thực sự đã được hỏi trước đây: " Tầm quan trọng tương đối của một nhóm các yếu tố dự báo trong phân loại rừng ngẫu nhiên trong R " một vài năm trước. Các cách tiếp cận chặt chẽ hơn như Gregorutti và cộng sự: " Tầm quan trọng của biến được nhóm với các khu rừng ngẫu nhiên và ứng dụng để phân tích dữ liệu chức năng đa biến". Chakraborty & Pal's Chọn các nhóm tính năng hữu ích trong Khung kết nối xem xét nhiệm vụ này trong bối cảnh của Perceptionron nhiều lớp. Quay trở lại bài báo của Gregorutti và cộng sự, phương pháp của họ có thể áp dụng trực tiếp cho bất kỳ loại thuật toán phân loại / hồi quy nào Tóm lại, chúng tôi sử dụng một phiên bản được cho phép ngẫu nhiên trong mỗi mẫu túi được sử dụng trong quá trình đào tạo.

Đã nói ở trên, trong khi các bài kiểm tra hoán vị cuối cùng là một heuristic, điều đã được giải quyết chính xác trong quá khứ là hình phạt của các biến giả trong bối cảnh hồi quy chính quy. Câu trả lời cho câu hỏi đó là Group-LASSO , Group-LARSGroup-Garotte . Các bài báo chuyên đề trong tác phẩm đó là Yuan và Lin: " Lựa chọn và ước lượng mô hình trong hồi quy với các biến được nhóm " (2006) và Meier và cộng sự: " Nhóm lasso cho hồi quy logistic " (2008). Phương pháp này cho phép chúng tôi làm việc trong tình huống: " mỗi yếu tố có thể có một số cấp độ và có thể được thể hiện thông qua một nhóm các biến giả " (Y & L 2006). Hiệu quả là như vậy "l1Kjj={1,,J}Jpyglmnetnhóm chính quy Lasso .]

Nói chung, không có ý nghĩa gì khi chỉ đơn giản là "cộng" tầm quan trọng của biến từ các biến giả bởi vì nó sẽ không nắm bắt được mối liên hệ giữa chúng cũng như dẫn đến kết quả vô nghĩa. Điều đó nói rằng, cả hai phương pháp bị phạt theo nhóm cũng như các phương pháp quan trọng của biến số hoán vị đều cho một sự thống nhất và (đặc biệt là trong trường hợp các thủ tục quan trọng hoán vị) thường áp dụng khung để làm như vậy.

Cuối cùng để nêu rõ ràng: không bin dữ liệu liên tục . Đó là thực tế xấu, có một chủ đề tuyệt vời về vấn đề này ở đây (và ở đây ). Việc chúng tôi quan sát kết quả giả sau khi rời rạc biến liên tục, như age, không đáng ngạc nhiên. Frank Harrell cũng đã viết mở rộng về các vấn đề gây ra bằng cách phân loại các biến liên tục .


Bạn liên kết tầm quan trọng tương đối của một nhóm các yếu tố dự đoán trong phân loại rừng ngẫu nhiên trong R trả lời trực tiếp câu hỏi. Tôi rất vui lòng chấp nhận nếu bạn chuyển tham chiếu đến liên kết đó ngay từ đầu vì tôi không nghĩ phần còn lại có liên quan trực tiếp và liên kết có thể dễ dàng bị mất trong câu trả lời.
Dan

Không vấn đề gì. Tôi đã thực hiện một số chỉnh sửa có liên quan. Không bỏ qua khái niệm hồi quy chính quy, như tôi đã đề cập đến văn bản, các phương pháp tiếp cận chính quy hóa cung cấp một sự thay thế hoàn toàn hợp lệ cho tầm quan trọng / xếp hạng.
usεr11852 nói Phục hồi Monic

Hồi quy thường xuyên không phải là một câu trả lời cho câu hỏi này, nó có thể trả lời một câu hỏi khác, tức là các lựa chọn thay thế cho tính năng quan trọng nhưng câu hỏi này là về việc tổng hợp các tính năng ohe thành một tính năng phân loại duy nhất trong một biểu đồ quan trọng của tính năng. Tôi thực sự nghĩ rằng bạn nên di chuyển liên kết thực sự trả lời câu hỏi để bắt đầu.
Dan

2

Câu hỏi là:

Liệu nó có ý nghĩa để kết hợp lại các quan trọng biến giả đó thành một giá trị quan trọng cho một biến phân loại bằng cách đơn giản là tổng hợp chúng?

Câu trả lời ngắn gọn:

Importance(Xl)=I
(I)2=t=1J1i2I(v(t)=)
I=t=1J1i2I(v(t)=)

Câu trả lời dài hơn, thực tế hơn ..

Bạn không thể đơn giản tổng hợp các giá trị quan trọng của từng biến cho các biến giả vì bạn có nguy cơ

việc che dấu các biến quan trọng của những biến khác mà chúng có mối tương quan cao. (trang 368)

Các vấn đề như đa cộng tuyến có thể có thể làm sai lệch các giá trị và thứ hạng quan trọng khác nhau.

Đây thực sự là một vấn đề rất thú vị để hiểu tầm quan trọng của biến số bị ảnh hưởng bởi các vấn đề như đa cộng đồng. Bài viết Xác định tầm quan trọng của dự đoán trong nhiều hồi quy theo các điều kiện phân phối và tương quan đa dạng thảo luận về các phương pháp khác nhau để tính toán tầm quan trọng của biến số và so sánh hiệu suất của dữ liệu vi phạm các giả định thống kê điển hình. Các tác giả thấy rằng

Mặc dù tính đa hướng đã ảnh hưởng đến hiệu suất của các phương pháp có tầm quan trọng tương đối, nhưng tính không biến đổi đa biến thì không. (WHITTAKER p366)


Tôi không nghĩ rằng trích dẫn thứ hai của bạn là có liên quan. Đây không phải là các biến có tương quan cao, chúng là cùng một biến và việc thực hiện tốt một cây quyết định sẽ không yêu cầu OHE nhưng coi chúng là một biến duy nhất. Nếu bất cứ điều gì, đa tuyến được OHE giới thiệu một cách giả tạo.
Dan

Về điểm đầu tiên của bạn, nó đối với tôi như con số quan trọng tương đối được đề xuất bởi Breiman là giá trị bình phương. Vì vậy, tôi không tin rằng sklearn lấy căn bậc hai như bạn đã đề xuất. Ngoài ra, nếu chúng, trước tiên tôi không nên bình phương các giá trị, thêm chúng và sau đó căn bậc hai tổng? Tôi không chắc chắn tôi đã hiểu đề xuất của bạn để lấy căn bậc hai trước.
Dan

@ecedavis Ý của sách giáo khoa là gì? Bạn có thể cung cấp một liên kết hoặc trích dẫn đầy đủ hơn xin vui lòng.
xem 24

Xin chào, cảm ơn bạn đã phê bình và cho upvote đầu tiên của tôi như là một thành viên mới. Nhận xét của bạn chỉ ra chi tiết cụ thể mà tôi sẽ giải quyết trong bản sửa đổi của mình, nhưng tôi cũng có thể có ý kiến ​​của bạn về chất lượng chung của câu trả lời của tôi không? Đây là bài viết đầu tiên của tôi và tôi dự định trở thành một người đóng góp thường xuyên. Ở mức tối thiểu, tôi hy vọng rằng câu trả lời của tôi nói chung là hữu ích và theo phong cách tốt. Quan điểm của bạn là gì?
ecedavis

Phong cách trả lời của bạn là tốt nhưng một số thông tin và nội dung dường như không hoàn toàn chính xác. Bài báo bạn liên kết là về tầm quan trọng của người dự đoán trong hồi quy bội trong khi câu hỏi là về tầm quan trọng trong Rừng ngẫu nhiên. Tôi cũng thấy việc trích dẫn trích dẫn của bạn có vấn đề vì câu đầy đủ là "Ngoài ra, do sự co lại (Mục 10.12.1), việc che dấu các biến quan trọng bởi những người khác mà chúng có mối tương quan cao ít xảy ra vấn đề hơn." trong đó có một ý nghĩa rất khác nhau.
xem
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.