счастливая пятница.
Я пытаюсь создать конвейер для нескольких классификаторов.
Я начал с поиска this
К сожалению, это так немного выше моего уровня навыков прямо сейчас, и я не мог заставить его работать должным образом, в итоге я пошел более многословным и длинным путем:
def multi_tester(X_train, y_train):
pipe_1 = Pipeline([
('vect', CountVectorizer(tokenizer=tokenize)),
('tfidf', TfidfTransformer()),
('clf', MultiOutputClassifier(RandomForestClassifier()))
])
pipe_2 = Pipeline([
('vect', CountVectorizer(tokenizer=tokenize)),
('tfidf', TfidfTransformer()),
('clf', ExtraTreesClassifier())
])
pipe_3 = Pipeline([
('vect', CountVectorizer(tokenizer=tokenize)),
('tfidf', TfidfTransformer()),
('clf', AdaBoostClassifier())
])
pipe_4 = Pipeline([
('vect', CountVectorizer(tokenizer=tokenize)),
('tfidf', TfidfTransformer()),
('clf', GradientBoostingClassifier())
])
pars = [
{'clf': [MultiOutputClassifier()]},
{'clf': [ExtraTreesClassifier()]},
{'clf': [AdaBoostClassifier()]},
{'clf': [GradientBoostingClassifier()]}
]
pips = [pipe_1, pipe_2, pipe_3, pipe_4]
pip_names = ['MultiOutputClassifier', 'ExtraTreesClassifier', 'AdaBoostClassifier', 'GradientBoostingClassifier']
scoring = {'AUC': 'roc_auc',
'F1': metrics.make_scorer(metrics.f1_score),
'recall': metrics.make_scorer(metrics.recall_score),
'precision': metrics.make_scorer(metrics.precision_score)}
print ("starting Gridsearch")
for i in range(len(pars)):
gs = GridSearchCV(pips[i], pars[i], scoring = scoring,
cv = 5, verbose=2, refit=False, n_jobs=-1, return_train_score = True)
gs = gs.fit(X_train, y_train)
print ("finished Gridsearch for: ", pip_names[i])
print (gs.best_score_)
К сожалению, я думаю, что я объявил либо оценки, либо параметры неправильно, потому что, когда я запускаю это:
multi_tester(X_train, y_train)
я получаю следующую ошибку:
TypeError Traceback (most recent call last)
<ipython-input-32-fd713f1ef4da> in <module>
----> 1 multi_tester(X_train, y_train)
<ipython-input-30-287aec48dbda> in multi_tester(X_train, y_train)
25
26 pars = [
---> 27 {'clf__estimator': [MultiOutputClassifier()]},
28 {'clf__estimator': [ExtraTreesClassifier()]},
29 {'clf__estimator': [AdaBoostClassifier()]},
TypeError: __init__() missing 1 required positional argument: 'estimator'
Я просмотрел документацию и думал, как я его создал он охватывал параметры по умолчанию, но я явно ошибся.
Если у вас есть какие-либо предложения или предложения о том, как я могу с этим справиться, это будет очень признательно.
- #### ################################################## ############################################### -
Также для дальнейшего использования в случае, если вы обнаружите, что переполнение стека выполняется для попытки кода Дэвида Батисты, это как далеко Я получил:
и вот несколько ТАК вопросов, которые я считаю действительно полезными:
1
2
Пока я не могу устранить неполадки, но похоже, что определение параметров таким образом, что они представляют собой список, решит проблемы.
class ClfSwitcher(BaseEstimator):
def __init__(self, estimator = SGDClassifier(),):
"""
A Custom BaseEstimator that can switch between classifiers.
:param estimator: sklearn object - The classifier
"""
self.estimator = estimator
def fit(self, X, y=None, **kwargs):
self.estimator.fit(X, y)
return self
def predict(self, X, y=None):
return self.estimator.predict(X)
def predict_proba(self, X):
return self.estimator.predict_proba(X)
def score(self, X, y):
return self.estimator.score(X, y)
И затем я определил некоторые параметры для моделей, на которые я хочу посмотреть следующим образом:
search_space = [{
'ExtraTreesClassifier': { 'n_estimators': [200] },
'RandomForestClassifier': { 'n_estimators': [200] },
'AdaBoostClassifier': { 'n_estimators': [200] },
'GradientBoostingClassifier': { 'n_estimators': [200], 'learning_rate': [0.8, 1.0] },
'SVC': [{'kernel': ['linear'], 'C': [1, 10]}, {'kernel': ['rbf'], 'C': [1, 10], 'gamma': [0.001, 0.0001]}],
'MultiOutputClassifier': { 'n_estimators': [200] }
}]
наконец, конвейер был определен следующим образом:
pipeline = Pipeline([
('vect', CountVectorizer(tokenizer=tokenize)),
('tfidf', TfidfTransformer()),
('clf', ClfSwitcher())
])
и соответствующий выигрыш:
scoring = {'AUC': 'roc_auc',
'F1': metrics.make_scorer(metrics.f1_score),
'recall': metrics.make_scorer(metrics.recall_score),
'precision': metrics.make_scorer(metrics.precision_score)}
но когда я запускаю поиск по сетке, он возвращает ошибку:
grid = GridSearchCV(estimator = pipeline, param_grid = search_space, cv = 10, scoring = scoring, return_train_score = True,
n_jobs = -1, refit = 'AUC')
---------------------------------------------------------------------------
ValueError Traceback (most recent call last)
<ipython-input-26-7b76d42489a9> in <module>
1 grid = GridSearchCV(estimator = pipeline, param_grid = search_space, cv = 10, scoring = scoring, return_train_score = True,
----> 2 n_jobs = -1, refit = 'AUC')
C:\ProgramData\Anaconda3\lib\site-packages\sklearn\model_selection\_search.py in __init__(self, estimator, param_grid, scoring, n_jobs, iid, refit, cv, verbose, pre_dispatch, error_score, return_train_score)
1143 return_train_score=return_train_score)
1144 self.param_grid = param_grid
-> 1145 _check_param_grid(param_grid)
1146
1147 def _run_search(self, evaluate_candidates):
C:\ProgramData\Anaconda3\lib\site-packages\sklearn\model_selection\_search.py in _check_param_grid(param_grid)
369 raise ValueError("Parameter values for parameter ({0}) need "
370 "to be a sequence(but not a string) or"
--> 371 " np.ndarray.".format(name))
372
373 if len(v) == 0:
ValueError: Parameter values for parameter (ExtraTreesClassifier) need to be a sequence(but not a string) or np.ndarray.