Xác định các tính năng được lọc sau khi chọn tính năng với scikit learn


10

Đây là Mã của tôi cho phương pháp chọn tính năng trong Python:

from sklearn.svm import LinearSVC
from sklearn.datasets import load_iris
iris = load_iris()
X, y = iris.data, iris.target
X.shape
(150, 4)
X_new = LinearSVC(C=0.01, penalty="l1", dual=False).fit_transform(X, y)
X_new.shape
(150, 3)

Nhưng sau khi nhận được X mới (biến phụ thuộc - X_new), làm thế nào để tôi biết biến nào bị loại bỏ và biến nào được xem xét trong biến cập nhật mới này? (cái nào bị loại bỏ hoặc cái nào có ba trong dữ liệu.)

Lý do nhận được nhận dạng này là để áp dụng cùng một bộ lọc trên dữ liệu thử nghiệm mới.

Câu trả lời:


6

Có hai điều bạn có thể làm:

  • Kiểm tra coef_param và phát hiện cột nào bị bỏ qua
  • Sử dụng cùng một mô hình để chuyển đổi dữ liệu đầu vào bằng phương thức transform

Sửa đổi nhỏ cho ví dụ của bạn

>>> from sklearn.svm import LinearSVC
>>> from sklearn.datasets import load_iris
>>> from sklearn.cross_validation import train_test_split
>>>
>>> iris = load_iris()
>>> x_train, x_test, y_train, y_test = train_test_split(
...     iris.data, iris.target, train_size=0.7
... )
>>>
>>> svc = LinearSVC(C=0.01, penalty="l1", dual=False)
>>>
>>> X_train_new = svc.fit_transform(x_train, y_train)
>>> print(X_train_new.shape)
(105, 3)
>>>
>>> X_test_new = svc.transform(x_test)
>>> print(X_test_new.shape)
(45, 3)
>>>
>>> print(svc.coef_)
[[ 0.          0.10895557 -0.20603044  0.        ]
 [-0.00514987 -0.05676593  0.          0.        ]
 [ 0.         -0.09839843  0.02111212  0.        ]]

Như bạn thấy phương pháp transformlàm tất cả công việc cho bạn. Và cũng từ coef_ma trận bạn có thể thấy cột cuối cùng chỉ là một vectơ không, vì vậy bạn mô hình bỏ qua cột cuối cùng khỏi dữ liệu


Xin chào, Làm cách nào tôi có thể xác định tên Cột của X_train_new. Có chức năng nào không?
Vignesh Prajapati

1
Chúng theo thứ tự như trong tập dữ liệu đầu vào. iris.feature_names
itdxer

Đúng. Nó là. Tôi bối rối ở đây. Đó là theo thứ tự tương tự. Nhưng làm thế nào để tôi có được tên của họ vì một số cột đã bị bỏ qua. Vì vậy, tôi không thể có được các cột cụ thể đã được chọn trong quá trình này. Bạn có thể vui lòng giúp tôi về điều này!.
Vignesh Prajapati

Bạn đã kiểm tra phương thức feature_namestrong irisbiến? Việc này ổn với tôi.
itdxer

12

Ngoài ra, nếu bạn sử dụng SelectFromModel để chọn tính năng sau khi lắp SVC, bạn có thể sử dụng phương thức thể hiện get_support. Điều này trả về một mảng boolean ánh xạ lựa chọn của từng tính năng. Tiếp theo, nối phần này với một mảng tên tính năng gốc, sau đó lọc các trạng thái boolean để tạo ra tập hợp các tên của các tính năng được chọn có liên quan.

Hy vọng điều này sẽ giúp những độc giả tương lai, những người cũng đấu tranh để tìm ra cách tốt nhất để có được các tên tính năng có liên quan sau khi lựa chọn tính năng.

Thí dụ:

lsvc = LinearSVC(C=0.01, penalty="l1", dual=False,max_iter=2000).fit(X, y) 
model = sk.SelectFromModel(lsvc, prefit=True) 
X_new = model.transform(X) 
print(X_new.shape) 
print(model.get_support()) 

5
Điều này nên được chấp nhận
user0

5

Dựa trên giải pháp @chinnychinchin, tôi thường làm:

lsvc = LinearSVC(C=0.01, penalty="l1", dual=False,max_iter=2000).fit(X, y) 
model = sk.SelectFromModel(lsvc, prefit=True) 
X_new = model.transform(X) 
print(X.columns[model.get_support()]) 

trong đó trả về một cái gì đó như:

Index([u'feature1', u'feature2', u'feature',
  u'feature4'],
  dtype='object')
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.