Ich versuche, eine Python-Klasse zu schreiben, um die .coef_
Attributwerte zu verwenden, um Features in scikit-learn 0.17.1 auszuwählen. Ich möchte nur Merkmale auswählen, deren Werte .coef_
im 10. Perzentil und darüber liegen (10., 11., 12., 13., 14., 15., 16., ...., 94., 95., 96., 97., 98., 99., 100).Scikit-Lernen Feature-Auswahl mit SVC basierend auf Perzentil von .coef_ Werte
Ich konnte dies nicht mit SelectFromModels()
tun, also habe ich versucht, eine benutzerdefinierte Klasse mit dem Namen ChooseCoefPercentile()
für diese Feature-Auswahl zu schreiben. Ich versuche, die folgende Funktion zu verwenden, um die Funktionen nach Perzentil der .coef_
zu wählen:
from sklearn.datasets import load_iris
from sklearn.cross_validation import train_test_split
X_train, X_test, y_train, y_test = train_test_split(load_iris().data,
load_iris().target, test_size=0.33, random_state=42)
def percentile_sep(coefs,p):
from numpy import percentile as pc
gt_p = coefs[coefs>pc(coefs,p)].argsort()
return list(gt_p)
from sklearn.base import BaseEstimator, TransformerMixin
class ChooseCoefPercentile(BaseEstimator, TransformerMixin):
def __init__(self, est_, perc=50):
self.perc = perc
self.est_ = est_
def fit(self, *args, **kwargs):
self.est_.fit(*args, **kwargs)
return self
def transform(self, X):
perc_i = percentile_sep(self.est_.coef_,self.perc)
i_ = self.est_.coef_.argsort()[::-1][perc_i[:]]
X_tr = X[:,i_]
self.coef_ = self.est_.coef_[i_]
return X_tr
# Import modules
from sklearn import svm,ensemble,pipeline,grid_search
# Instantiate feature selection estimator and classifier
f_sel = ChooseCoefPercentile(svm.SVC(kernel='linear'),perc=10)
clf = ensemble.RandomForestClassifier(random_state=42,oob_score=False)
CustPipe = pipeline.Pipeline([("feat_s",f_sel),("Clf",clf)])
bf_est = grid_search.GridSearchCV(CustPipe,cv=2,param_grid={'Clf__n_estimators':[100,200]})
bf_est.fit(X_train, y_train)
Ich erhalte die folgende Fehlermeldung:
Traceback (most recent call last):
File "C:\Python27\test.py", line 35, in <module>
bf_est.fit(X_train, y_train)
File "C:\Python27\lib\site-packages\sklearn\grid_search.py", line 804, in fit
return self._fit(X, y, ParameterGrid(self.param_grid))
File "C:\Python27\lib\site-packages\sklearn\grid_search.py", line 553, in _fit
for parameters in parameter_iterable
File "C:\Python27\lib\site-packages\sklearn\externals\joblib\parallel.py", line 800, in __call__
while self.dispatch_one_batch(iterator):
File "C:\Python27\lib\site-packages\sklearn\externals\joblib\parallel.py", line 658, in dispatch_one_batch
self._dispatch(tasks)
File "C:\Python27\lib\site-packages\sklearn\externals\joblib\parallel.py", line 566, in _dispatch
job = ImmediateComputeBatch(batch)
File "C:\Python27\lib\site-packages\sklearn\externals\joblib\parallel.py", line 180, in __init__
self.results = batch()
File "C:\Python27\lib\site-packages\sklearn\externals\joblib\parallel.py", line 72, in __call__
return [func(*args, **kwargs) for func, args, kwargs in self.items]
File "C:\Python27\lib\site-packages\sklearn\cross_validation.py", line 1531, in _fit_and_score
estimator.fit(X_train, y_train, **fit_params)
File "C:\Python27\lib\site-packages\sklearn\pipeline.py", line 164, in fit
Xt, fit_params = self._pre_transform(X, y, **fit_params)
File "C:\Python27\lib\site-packages\sklearn\pipeline.py", line 145, in _pre_transform
Xt = transform.fit_transform(Xt, y, **fit_params_steps[name])
File "C:\Python27\lib\site-packages\sklearn\base.py", line 458, in fit_transform
return self.fit(X, y, **fit_params).transform(X)
File "C:\Python27\test.py", line 21, in transform
i_ = self.est_.coef_.argsort()[::-1][perc_i[:]]
IndexError: index 6 is out of bounds for axis 0 with size 3
Es scheint, gibt es ein Problem mit der NumPy Reihe von .coef_
Werte in der folgenden Zeile:
i_ = self.est_.coef_.argsort()[::-1][perc_i[:]]
in dieser Linie, ich versuche nur zu wählen diese .coef_
Werte, die über dem 10. Perzentil basierend auf ihrem Index liegen. Der Index wird in einer Liste perc_i
gespeichert. Ich kann nicht scheinen, diese Liste zu verwenden, um das Array .coef_
richtig zu indizieren.
Tritt dieser Fehler auf, weil das Array in Zeilen aufgeteilt werden muss? Oder sollte ich eine andere Methode verwenden, um die .coef_
Werte basierend auf den Perzentilen zu extrahieren?
Das Problem ist in der Tat, dass die .coef_ Array in Reihen für jede Klasse eingeteilt ist. Der Auswahlmechanismus sollte präzisiert werden: Was passiert, wenn ein Merkmal bei einer Klasse über dem Perzentil liegt, bei der anderen nicht? –
Das ist eine gute Frage. Ich hätte das im OP erwähnen sollen - in diesem Fall würde ich das Feature auswählen wollen. Angenommen, dies ist der Fall, gibt es eine Möglichkeit, das Feature auszuwählen? Weißt du auch, wie 'SelectPercentile()' diese Fälle behandelt? http://scikit-learn.org/stable/modules/generated/sklearn.feature_selection.SelectPercentile.html –
FWIW Diese Funktion ist sehr nah an dem, was in https://github.com/scikit-learn/scikit- vorgeschlagen wird. learn/pull/6717, hoffentlich wird scikit-learn das bald in 'SelectFromModel' unterstützen. – joeln