ТАБЛИЦА №1
Краткое руководство по случайному поиску (или поиску по сетке) с помощью конвейера
Пять шагов с использованием scikit-learn
from sklearn.decomposition import TruncatedSVD from sklearn.feature_extraction.text import TfidfVectorizer from sklearn.metrics import classification_report from sklearn.model_selection import train_test_split, RandomizedSearchCV # or GridSearchCV from sklearn.pipeline import Pipeline
1) Подготовьте наборы данных.
train_df, test_df = train_test_split(df, test_size=0.2, random_state=42, stratify=df["label"]) train_data = train_df["text"] train_target = train_df["label"] test_data = test_df["text"] test_target = test_df["label"]
2) Настройте конвейер обучения с помощью конвейера.
Конвейер должен состоять из серии преобразований и окончательной оценки.
Вызов
fit
в конвейере - это то же самое, что вызовfit
на каждом оценщике по очереди,transform
ввод и передача его следующему шагу. В конвейере есть все методы, которые есть у последнего оценщика в конвейере, т.е. если последний оценщик является классификатором,Pipeline
может использоваться как классификатор. Если последний оценщик - трансформатор, опять же, конвейер.
pipeline = Pipeline( steps=[ ("tfidf", TfidfVectorizer()), ("reduce_dim", TruncatedSVD(n_components=10)), ("classifier", SVC()), # final estimator is a classifier ] )
В любой момент (до или после установки) вы можете получить доступ к любым / всем отдельным оценщикам в конвейере с помощью:
pipeline.named_steps["classifier"] # or just: pipeline[2]
3) Определите диапазоны гиперпараметров, используя любой из ключей параметров созданного конвейера.
# first access the parameter keys of the individual estimators pipeline.get_params().keys()
Я выделил жирным шрифтом параметры, для которых я собираюсь предоставить диапазон значений:
dict_keys(['memory', 'steps', 'verbose', 'tfidf', 'reduce_dim', 'classifier', 'tfidf__analyzer', 'tfidf__binary', 'tfidf__decode_error', 'tfidf__dtype', 'tfidf__encoding', 'tfidf__input', 'tfidf__lowercase', 'tfidf__max_df', 'tfidf__max_features', 'tfidf__min_df', 'tfidf__ngram_range', 'tfidf__norm', 'tfidf__preprocessor', 'tfidf__smooth_idf', 'tfidf__stop_words', 'tfidf__strip_accents', 'tfidf__sublinear_tf', 'tfidf__token_pattern', 'tfidf__tokenizer', 'tfidf__use_idf', 'tfidf__vocabulary', 'reduce_dim__algorithm', 'reduce_dim__n_components', 'reduce_dim__n_iter', 'reduce_dim__random_state', 'reduce_dim__tol', 'classifier__C', 'classifier__cache_size', 'classifier__class_weight', 'classifier__coef0', 'classifier__decision_function_shape', 'classifier__degree', 'classifier__gamma', 'classifier__kernel', 'classifier__max_iter', 'classifier__probability', 'classifier__random_state', 'classifier__shrinking', 'classifier__tol', 'classifier__verbose'])
И это диапазоны значений, для которых будет оцениваться моя модель:
from spacy.lang.en.stop_words import STOP_WORDS svm_param_grid = { "reduce_dim": ["passthrough", TruncatedSVD(10), TruncatedSVD(20)], "tfidf__analyzer": ["word", "char"], "tfidf__smooth_idf": [True, False], "tfidf__ngram_range": [(1, 1), (1, 2)], "tfidf__use_idf": [True, False], "tfidf__stop_words": [None, STOP_WORDS], "classifier__class_weight": [None, "balanced"], "classifier__C": [1, 10, 100, 1000], "classifier__gamma": [0.001, 0.0001], "classifier__kernel": ["linear", "rbf"], } # "passthrough" is if you do NOT want to use "reduce_dim" in one of your runs
4) Подходит для модели рандомизированного поиска или поиска по сетке.
t0 = time() print("Fitting started...") search = RandomizedSearchCV(pipeline, param_distributions=svm_param_grid, verbose=8) search.fit(train_data, train_target) print(f"Fitting took {time() — t0:0.3f}s.")
5) Прогнозировать и сообщать показатели.
y_pred = search.predict(test_data) cr = classification_report(test_target, y_pred) print(cr)
6) (необязательно) Получить ранжированные кандидаты в модели и их параметры.
Вы можете получить доступ к лучшему оценщику и его параметрам с помощью search.best_estimator_
и search.best_params_
, но search.cv_results_
вернет полный список настроек параметров для всех кандидатов в формате словаря. Затем вы можете превратить это в фрейм данных, ранжированный по результатам теста, используя приведенный ниже код.
scores_df = pd.DataFrame(search.cv_results_) scores_df = scores.sort_values(by=['rank_test_score']).reset_index(drop='index') scores_df
Этот подробный отчет может быть полезен, если вы хотите проверить все настройки параметров и выполнить окончательный (т. Е. Более узкий) поиск по сетке с использованием наиболее оптимальных комбинаций обнаруженных параметров / значений.
Другие статьи для разработчиков и специалистов по анализу данных в виде шпаргалки: