ТАБЛИЦА №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

Этот подробный отчет может быть полезен, если вы хотите проверить все настройки параметров и выполнить окончательный (т. Е. Более узкий) поиск по сетке с использованием наиболее оптимальных комбинаций обнаруженных параметров / значений.

Другие статьи для разработчиков и специалистов по анализу данных в виде шпаргалки: