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)を取得した後、どの変数が削除され、どの変数がこの新しい更新された変数で考慮されるかをどのようにして知ることができますか?(どれが削除されたか、どれがデータに存在するか。)

この識別情報を取得するのは、新しいテストデータに同じフィルタリングを適用するためです。

回答:


6

できることは2つあります。

  • 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 2015

1
それらは、入力データセットと同じ順序です。iris.feature_names
itdxer 2015

はい。その。私はここで混乱しています。同じ順序です。しかし、一部の列が無視されているため、それらの名前を取得するにはどうすればよいですか。そのため、このプロセス中に選択された特定の列を取得できません。これで私を助けてください!
Vignesh Prajapati

あなたはこの方法確認しましたfeature_namesirisの変数を?それは私にとってはうまくいきます。
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.