Tính năng quan trọng với Scikit-learn Random Forest cho thấy Độ lệch chuẩn rất cao


13

Tôi đang sử dụng Trình phân loại rừng ngẫu nhiên scikit-learn và tôi muốn vẽ tầm quan trọng của tính năng như trong ví dụ này .

Tuy nhiên, kết quả của tôi là hoàn toàn khác nhau, theo nghĩa là độ lệch chuẩn của tính năng quan trọng hầu như luôn luôn lớn hơn bản thân tầm quan trọng của tính năng (xem hình ảnh đính kèm).

tính năng quan trọng

Có thể có loại hành vi như vậy, hoặc tôi đang làm một số sai lầm khi âm mưu?

Mã của tôi là như sau:

import matplotlib.pyplot as plt
import numpy as np
import pandas as pd
from sklearn.ensemble import RandomForestClassifier

clf = RandomForestClassifier()
clf.fit(predictors.values, outcome.values.ravel())

importance = clf.feature_importances_
importance = pd.DataFrame(importance, index=predictors.columns, 
                          columns=["Importance"])

importance["Std"] = np.std([tree.feature_importances_
                            for tree in clf.estimators_], axis=0)

x = range(importance.shape[0])
y = importance.ix[:, 0]
yerr = importance.ix[:, 1]

plt.bar(x, y, yerr=yerr, align="center")

plt.show()

IIUC, predictorstrả về một numpy arraycái mà bạn đang tham chiếu đến một pandas Dataframeđối tượng bởi các cột không chính xác vì numpy arrayskhông có thuộc tính columns.
Nickil Maveli

Xin lỗi, đó là một lỗi đánh máy trên mã. dự đoán và kết quả là hai pandas DataFramevới hình dạng m x nm x 1. Nó nên được rõ ràng bây giờ.
gc5

2
Tôi đã đi qua những phát hiện tương tự một thời gian trước đây. Có thể điều này là do thực tế là một số tính năng rất quan trọng, nhưng vì các tính năng có thể cao hoặc thấp trong cây quyết định (vì chỉ có một tập hợp con ngẫu nhiên được cung cấp khi phân tách), tầm quan trọng của chúng thay đổi rất nhiều từ cây sang cây, dẫn đến độ lệch chuẩn cao.
Archie

Bài đăng tuyệt vời, tôi đã gặp phải một vấn đề giống hệt như bạn có thể thấy trong hình. Có một gói, tsfreshgiúp tôi xác định các tính năng có liên quan và cắt các tính năng của tôi từ 600+ xuống còn khoảng 400. ! [35 tính năng hàng đầu của tôi ] ( i.stack.imgur.com/0MROZ.png ) Ngay cả khi thuật toán này hoạt động tốt cho tôi. Tôi có một phân loại nhị phân, thành công / thất bại. Tôi hầu như không có thành công sai nhưng tôi bỏ lỡ một phần trăm thành công lớn. Tất cả những dự đoán ở trên có vẻ hợp lý. Nó có thể là trường hợp cần phải có một bộ thử nghiệm và đào tạo lớn hơn. Tôi có ít hơn
siêu anh hùng

Câu trả lời:


3

Bạn đang sử dụng RandomForest với số lượng cây mặc định là 10. Với khoảng 30 tính năng thì điều này là quá ít. Do đó độ lệch chuẩn là lớn. Hãy thử ít nhất 100 hoặc thậm chí 1000 cây, như

clf = RandomForestClassifier(n_estimators=1000)

Để phân tích tinh tế hơn, bạn cũng có thể kiểm tra mức độ tương quan giữa các tính năng của bạn.


Xin lỗi lanenok, số lượng cây không phải là mặc định. Tôi đặt một mã ví dụ (và điều này đúng với tất cả các tham số, ví dụ min_samples_split) bởi vì tôi không thể tiết lộ dữ liệu tôi đang làm việc. Tuy nhiên, có phải do số lượng cây, cộng với các tham số khác, hoặc tôi đang làm một số sai lầm ở đây?
gc5

2

Kết quả của bạn không có gì lạ. Theo lanenok , trong bước đầu tiên, bạn nên tăng số lượng cây để đảm bảo rằng bạn nhận được kết quả 'thống kê' liên quan đến các tính năng quan trọng.

Tuy nhiên, như bài báo này của Genuer et al. (2010) cho thấy, bạn thực sự có thể sử dụng độ lệch chuẩn để loại bỏ các tính năng. Để trích dẫn: " Chúng ta có thể thấy rằng độ lệch chuẩn của các biến thực là lớn so với các biến nhiễu một, gần bằng không. "


Sử dụng độ lệch chuẩn trong ví dụ này để loại bỏ các tính năng sẽ loại bỏ tất cả các tính năng. xD
Jorge Leitao

Haha, tôi không hoàn toàn chắc chắn, tôi nghĩ bạn có thể loại bỏ các tính năng ở xa phải không? Dù sao đi nữa, điểm chính tôi đang cố gắng thực hiện là độ lệch chuẩn cao không có gì lạ và bạn thực sự có thể sử dụng chúng trong chiến lược của mình để loại bỏ các tính năng.
Archie

1

Hãy thử clf = RandomForestClassifier(max_features=None). Các max_featuresmặc định param 'auto'tương đương với sqrt(n_features). max_featuresđược mô tả là "Số lượng tính năng cần xem xét khi tìm kiếm sự phân chia tốt nhất." Chỉ nhìn vào một số lượng nhỏ các tính năng tại bất kỳ điểm nào trong cây quyết định có nghĩa là tầm quan trọng của một tính năng có thể khác nhau trên nhiều cây. Vì vậy, đừng nhìn vào một tập hợp con ngẫu nhiên, chỉ cần nhìn vào tất cả các tính năng ở mọi cấp độ của cây.


1
Lưu ý đây là tương đương với cây đóng gói đồng bằng. "Ngẫu nhiên" trong các khu rừng ngẫu nhiên có nghĩa là xem xét một tập hợp con các tính năng ngẫu nhiên ở mỗi lần phân tách, thường sqrt(n_features)hoặc log2(n_features). max_features=Nonekhông còn xem xét một tập hợp con ngẫu nhiên của các tính năng. Tôi không chắc chắn nếu điều này ảnh hưởng đến giải pháp đề xuất ở trên. Một khả năng là nhiều tính năng đơn giản là có tầm quan trọng lớn và do đó rất khác nhau trên toàn bộ cây. Hoặc có thể không có đủ mẫu và do đó, không phải mọi tính năng đều được xem xét khi bạn chạm một chiếc lá.
Jamis

1

Một lý do phổ biến cho điều này là các tham số bạn cung cấp (hoặc mặc định) RandomForestClassifierkhông phù hợp với tập dữ liệu của bạn.

Một cách phổ biến để giải quyết vấn đề này là tìm kiếm không gian siêu tham số bằng cách sử dụng GridSearchCV:

from sklearn.model_selection import GridSearchCV
from sklearn.metrics import accuracy_score, make_scorer

param_grid = {'n_estimators': [10, 100, 1000], 'max_features': [5, 10, 20, 30]}
clf = GridSearchCV(RandomForestClassifier(), param_grid, cv=5, scoring=make_scorer(accuracy_score))

param_gridđây là hoán vị của các tham số mà bạn muốn tìm kiếm và make_scorer(accuracy_score)là số đo bạn muốn tối ưu hóa.

Lưu ý rằng accuracy_scorephù hợp cho các bộ cân bằng, nhưng không phải cho các bộ không cân bằng. Chọn một số liệu phù hợp với mục tiêu cụ thể của bạn.


0

Có thể có nhiều lý do. Số lượng cây và độ sâu có thể thay đổi kết quả của bạn. Nếu mô hình của bạn không hoạt động tốt sau khi chọn các tham số (xác thực chéo, v.v.), có thể là do các tính năng của bạn không mang tính dự đoán cao, do đó chúng được chọn gần như "ngẫu nhiên" dẫn đến độ lệch chuẩn cao từ cây này sang cây khác. Nhưng có những khả năng khác, ví dụ như các tính năng của bạn có mối tương quan cao. Một chút thông tin sẽ hữu ích.

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.