Автор оригинала: DhananjayKumar.
В предыдущем посте мы видели различные шаги, связанные с созданием модели машинного обучения (ML). Возможно, вы заметили, что при построении модели ML мы рассматриваем несколько алгоритмов в конвейере, а затем настраиваем гиперпараметр для всех моделей. Не кажется ли вам, что было бы проще, если бы существовали некоторые автоматизированные инструменты, облегчающие бремя повторяющихся и трудоемких задач проектирования конвейеров машинного обучения и оптимизации гиперпараметров.
Вот и AutoML берет на себя процесс построения моделей машинного обучения: как только набор данных будет в относительно чистом формате, система AutoML сможет проектировать и оптимизировать конвейер машинного обучения быстрее, чем 99% людей.
Существует множество таких инструментов AutoML, и наиболее популярными из них являются,
- ТПОТ
- H2O
- Auto-sklearn
- Azure AutoML и т. Д.
Ниже мы увидим пример TPOT, остальные также работают над аналогичной идеей. POT работает поверх scikit-изучайте и автоматизируйте самую утомительную часть машинного обучения, разумно исследуя тысячи возможных конвейеров, чтобы найти лучший для ваших данных.
Я использую ту же постановку задачи и набор данных, что и в части 2. Но для простоты я разбавляю некоторые шаги предварительной обработки, ss POT также применил несколько шагов предварительной обработки (списки приведены ниже). Файл записной книжки Jupyter и обучающие/тестовые файлы также можно загрузить из моего репозитория git .
Хорошо, давайте начнем –
import numpy as np import pandas as pd from tpot import TPOTClassifier
test_df = pd.read_csv("test.csv") train_df = pd.read_csv("train.csv")
train_df = train_df.drop(['PassengerId'], axis=1) train_df = train_df.drop(['Cabin'], axis=1) test_df = test_df.drop(['Cabin'], axis=1) train_df = train_df.drop(['Ticket'], axis=1) test_df = test_df.drop(['Ticket'], axis=1) train_df = train_df.drop(['Name'], axis=1) test_df = test_df.drop(['Name'], axis=1)
data = [train_df, test_df] for dataset in data: mean = train_df["Age"].mean() std = test_df["Age"].std() is_null = dataset["Age"].isnull().sum() # compute random numbers between the mean, std and is_null rand_age = np.random.randint(mean - std, mean + std, size = is_null) # fill NaN values in Age column with random values generated age_slice = dataset["Age"].copy() age_slice[np.isnan(age_slice)] = rand_age dataset["Age"] = age_slice dataset["Age"] = train_df["Age"].astype(int)
data = [train_df, test_df] for dataset in data: dataset['Embarked'] = dataset['Embarked'].fillna('S')
Преобразование функций:
data = [train_df, test_df] for dataset in data: dataset['Fare'] = dataset['Fare'].fillna(0) dataset['Fare'] = dataset['Fare'].astype(int)
genders = {"male": 0, "female": 1} data = [train_df, test_df] for dataset in data: dataset['Sex'] = dataset['Sex'].map(genders)
ports = {"S": 0, "C": 1, "Q": 2} data = [train_df, test_df] for dataset in data: dataset['Embarked'] = dataset['Embarked'].map(ports)
data = [train_df, test_df] for dataset in data: dataset['Age'] = dataset['Age'].astype(int) dataset.loc[ dataset['Age'] <= 11, 'Age'] = 0 dataset.loc[(dataset['Age'] > 11) & (dataset['Age'] <= 18), 'Age'] = 1 dataset.loc[(dataset['Age'] > 18) & (dataset['Age'] <= 22), 'Age'] = 2 dataset.loc[(dataset['Age'] > 22) & (dataset['Age'] <= 27), 'Age'] = 3 dataset.loc[(dataset['Age'] > 27) & (dataset['Age'] <= 33), 'Age'] = 4 dataset.loc[(dataset['Age'] > 33) & (dataset['Age'] <= 40), 'Age'] = 5 dataset.loc[(dataset['Age'] > 40) & (dataset['Age'] <= 66), 'Age'] = 6 dataset.loc[ dataset['Age'] > 66, 'Age'] = 6
data = [train_df, test_df] for dataset in data: dataset.loc[ dataset['Fare'] <= 7.91, 'Fare'] = 0 dataset.loc[(dataset['Fare'] > 7.91) & (dataset['Fare'] <= 14.454), 'Fare'] = 1 dataset.loc[(dataset['Fare'] > 14.454) & (dataset['Fare'] <= 31), 'Fare'] = 2 dataset.loc[(dataset['Fare'] > 31) & (dataset['Fare'] <= 99), 'Fare'] = 3 dataset.loc[(dataset['Fare'] > 99) & (dataset['Fare'] <= 250), 'Fare'] = 4 dataset.loc[ dataset['Fare'] > 250, 'Fare'] = 5 dataset['Fare'] = dataset['Fare'].astype(int)
X_train = train_df.drop("Survived", axis=1) Y_train = train_df["Survived"] X_test = test_df.drop("PassengerId", axis=1).copy() tpot = TPOTClassifier(generations=5, population_size=20, verbosity=2) tpot.fit(X_train, Y_train)
Результат:
Generation 1 - Current best internal CV score: 0.8327578288714715 Generation 2 - Current best internal CV score: 0.8327578288714715 Generation 3 - Current best internal CV score: 0.8327578288714715 Generation 4 - Current best internal CV score: 0.833931853718029 Generation 5 - Current best internal CV score: 0.8395310000365276 Best pipeline: RandomForestClassifier(MultinomialNB(input_matrix, alpha=0.1, fit_prior=True), bootstrap=True, criterion=gini, max_features=0.5, min_samples_leaf=4, min_samples_split=17, n_estimators=100) TPOTClassifier(config_dict=None, crossover_rate=0.1, cv=5, disable_update_check=False, early_stop=None, generations=5, max_eval_time_mins=5, max_time_mins=None, memory=None, mutation_rate=0.9, n_jobs=1, offspring_size=None, periodic_checkpoint_folder=None, population_size=20, random_state=None, scoring=None, subsample=1.0, template=None, use_dask=False, verbosity=2, warm_start=False)
Выше вы можете видеть, что TPOT выбрал RandomForestClassifier как наиболее подходящий трубопровод.
Алгоритмы классификации и параметры, которые выбирает TPOT –
- ‘sklearn.naive_bayes.Бернуллин’: { ‘альфа’: [1e-3, 1e-2, 1e-1, 1., 10., 100.], ‘fit_prior’: [True, False] }
- ‘sklearn.naive_bayes.MultinomialNB’: { ‘alpha’: [1e-3, 1e-2, 1e-1, 1., 10., 100.], ‘fit_prior’: [True, False] }
- -склеарн,дерево.DecisionTreeClassifier’: { ‘критерий’: [‘джини’, ‘энтропия’], ‘max_depth’: диапазон(1, 11), ‘min_samples_split’: диапазон(2, 21), ‘min_samples_leaf’: диапазон(1, 21) }
- -склеарн,ансамбль.ExtraTreesClassifier’: {‘n_estimators’: [100], ‘criterion’: [‘gini’, ‘entropy’], ‘max_features’: np.arange(0.05, 1.01, 0.05), ‘min_samples_split’: диапазон(2, 21), ‘min_samples_leaf’: диапазон(1, 21), ‘bootstrap’: [True, False] }
- -склеарн,ансамбль.RandomForestClassifier’: { ‘n_estimators’: [100], ‘criterion’: [‘gini’, ‘entropy’], ‘max_features’: np.arange(0.05, 1.01, 0.05), ‘min_samples_split’: диапазон(2, 21), ‘min_samples_leaf’: диапазон(1, 21), ‘bootstrap’: [True, False] }
- -склеарн,ансамбль.GradientBoostingClassifier’: { ‘n_estimators’: [100], ‘learning_rate’: [1e-3, 1e-2, 1e-1, 0.5, 1.], ‘max_depth’: диапазон(1, 11), ‘min_samples_split’: диапазон(2, 21), ‘min_samples_leaf’: диапазон(1, 21), ‘подвыборка’: np.arange(0.05, 1.01, 0.05), ‘max_features’: np.arange(0.05, 1.01, 0.05) }
- -склирн,соседи.KNeighborsClassifier’: {‘n_neighbors’: диапазон(1, 101), ‘weights’: [‘uniform’, ‘distance’], ‘p’: [1, 2] }
- ‘sklearn.svm.LinearSVC’: { ‘штраф’: [‘l1’, ‘l2’], ‘потеря’: [‘шарнир’, ‘squared_hinge’], ‘двойной’: [True, False], ‘tol’: [1e-5, 1e-4, 1e-3, 1e-2, 1e-1], ‘C’: [1e-4, 1e-3, 1e-2, 1e-1, 0.5, 1., 5., 10., 15., 20., 25.] }
- “sklearn.linear_model.Логистическая регрессия’: { ‘штраф’: [‘l1’, ‘l2’], ‘C’: [1e-4, 1e-3, 1e-2, 1e-1, 0.5, 1., 5., 10., 15., 20., 25.], ‘dual’: [True, False] }
- ‘xgboost.XGBClassifier’: { ‘n_estimators’: [100], ‘max_depth’: диапазон(1, 11), ‘learning_rate’: [1e-3, 1e-2, 1e-1, 0.5, 1.], ‘подвыборка’: np.arange(0.05, 1.01, 0.05), ‘min_child_weight’: диапазон(1, 21), ‘nthread’: [1] }
Препроцессоры, которые могут быть применены TPOT –
- -склеарн,предварительная обработка.Binarizer’: { ‘порог’: np.arange(0.0, 1.01, 0.05) }
- -склеарн,разложение.FastICA’: { ‘tol’: np.arange(0.0, 1.01, 0.05) }
- “склеарн.Агломерация признаков”: {“связь”: [“уорд”, “полный”, “средний”], “сродство”: [“евклидово”, “l1”, “l2”, “манхэттен”, “косинус”] }
- -склеарн,предварительная обработка.MaxAbsScaler’: { }
- -склеарн,предварительная обработка.MinMaxScaler’: { }
- -склеарн,предварительная обработка.Нормализатор’: { ‘норма’: [‘l1’, ‘l2’, ‘max’] }
- ‘sklearn.kernel_approximation.Nystroem’: { ‘ядро’: [‘rbf’, ‘косинус’, ‘chi2’, ‘лапласиан’, ‘полином’, ‘поли’, ‘линейный’, ‘additive_chi2’, ‘сигмоид’], ‘гамма’: np.arange(0.0, 1.01, 0.05), ‘n_компоненты’: диапазон(1, 11) }
- -склеарн,разложение.PCA’: { ‘svd_solver’: [‘randomized’], ‘iterated_power’: диапазон(1, 11) }
- -склеарн,предварительная обработка.PolynomialFeatures’: { ‘степень’: [2], ‘include_bias’: [False], ‘interaction_only’: [False] }
- ‘sklearn.kernel_approximation.RBFSampler’: { ‘gamma’: np.arange(0.0, 1.01, 0.05) },
- -склеарн,предварительная обработка.Робастскейлер’: { },
- -склеарн,предварительная обработка.Стандартный скейлер’: { },
- -тпот.Нулевой счет’: { },
- -тпот.OneHotEncoder’: { ‘minimum_fraction’: [0.05, 0.1, 0.15, 0.2, 0.25], ‘sparse’: [False] } (курсив мой)
Y_prediction = tpot.predict(X_test) submission = pd.DataFrame({ "PassengerId": test_df["PassengerId"], "Survived": Y_prediction })
Запуск POT не так прост, как установка одной модели в набор данных. Он рассматривает несколько алгоритмов машинного обучения (случайные леса, линейные модели, SVM и т. Д.) В конвейере с многочисленными этапами предварительной обработки (вменение отсутствующих значений, масштабирование, PCA, выбор функций и т. Д.), гиперпараметрами для всех моделей и этапов предварительной обработки, а также несколькими способами объединения или стекирования алгоритмов в конвейере. Вот почему его выполнение обычно занимает много времени и нецелесообразно для больших наборов данных.
Все методы AutoML разработаны для поддержки исследователей данных, а не для их замены. Такие методы могут освободить специалиста по обработке данных от сложных задач, которые могут быть лучше решены машинами. Но анализ и выводы все еще должны быть сделаны учеными, занимающимися данными, которые также знают область применения.