Scikit Learn으로 기능 선택 후 필터링 된 기능 식별


10

다음은 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)

그러나 새로운 X (종속 변수-X_new)를 얻은 후이 새로운 업데이트 된 변수에서 어떤 변수가 제거되고 어떤 변수가 고려되는지 어떻게 알 수 있습니까? (하나가 제거되었거나 3 개가 데이터에 있음)

이 식별을 얻는 이유는 새 테스트 데이터에 동일한 필터링을 적용하기위한 것입니다.

답변:


6

할 수있는 두 가지가 있습니다.

  • coef_매개 변수를 확인 하고 무시 된 열을 감지 하십시오.
  • 방법을 사용하여 입력 데이터 변환에 동일한 모델 사용 transform

귀하의 예에 대한 작은 수정

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

보시다시피 방법 transform은 모든 작업을 수행합니다. 또한 coef_행렬 에서 마지막 열이 단지 제로 벡터임을 알 수 있으므로 데이터에서 마지막 열을 무시합니다.


안녕하세요, X_train_new의 열 이름을 어떻게 식별합니까? 기능이 있습니까?
Vignesh Prajapati

1
입력 데이터 세트와 동일한 순서입니다. iris.feature_names
itdxer

예. 이것의. 혼란 스러워요. 같은 순서입니다. 그러나 일부 열이 무시되었으므로 어떻게 이름을 얻습니까? 따라서이 프로세스 중에 선택된 특정 열을 얻을 수 없습니다. 이것 좀 도와주세요!.
Vignesh Prajapati

당신은 방법을 확인 했 feature_names에서 iris변수를? 그것은 나를 위해 잘 작동합니다.
itdxer

12

또는 SVC를 피팅 한 후 기능 선택에 SelectFromModel을 사용하는 경우 인스턴스 메소드를 사용할 수 있습니다 get_support. 각 기능의 선택을 매핑하는 부울 배열을 반환합니다. 그런 다음 이것을 원래 기능 이름 배열과 결합한 다음 부울 상태를 필터링하여 선택한 관련 기능 이름 세트를 생성하십시오.

이는 기능 선택 후 관련 기능 이름을 얻는 가장 좋은 방법을 찾기 위해 애쓰는 미래 독자들에게 도움이되기를 바랍니다.

예:

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
수락해야합니다
user0

5

@chinnychinchin 솔루션을 기반으로 일반적으로 다음을 수행합니다.

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()]) 

다음과 같은 것을 반환합니다 :

Index([u'feature1', u'feature2', u'feature',
  u'feature4'],
  dtype='object')
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.