Рубрики
Без рубрики

ML с Python: Часть 3

В предыдущем посте мы видели различные шаги, связанные с созданием модели машинного обучения (ML). Возможно, вы заметили, что при построении модели ML мы рассматриваем несколько алгоритмов в конвейере, а затем настраиваемся…

Автор оригинала: DhananjayKumar.

В предыдущем посте мы видели различные шаги, связанные с созданием модели машинного обучения (ML). Возможно, вы заметили, что при построении модели ML мы рассматриваем несколько алгоритмов в конвейере, а затем настраиваем гиперпараметр для всех моделей. Не кажется ли вам, что было бы проще, если бы существовали некоторые автоматизированные инструменты, облегчающие бремя повторяющихся и трудоемких задач проектирования конвейеров машинного обучения и оптимизации гиперпараметров.

Вот и AutoML берет на себя процесс построения моделей машинного обучения: как только набор данных будет в относительно чистом формате, система AutoML сможет проектировать и оптимизировать конвейер машинного обучения быстрее, чем 99% людей.

Существует множество таких инструментов AutoML, и наиболее популярными из них являются,

  • ТПОТ
  • H2O
  • Auto-sklearn
  • Azure AutoML и т. Д.

Ниже мы увидим пример TPOT, остальные также работают над аналогичной идеей. POT работает поверх scikit-изучайте и автоматизируйте самую утомительную часть машинного обучения, разумно исследуя тысячи возможных конвейеров, чтобы найти лучший для ваших данных.

Ниже мы увидим пример 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 –

  1. ‘sklearn.naive_bayes.Бернуллин’: { ‘альфа’: [1e-3, 1e-2, 1e-1, 1., 10., 100.], ‘fit_prior’: [True, False] }
  2. ‘sklearn.naive_bayes.MultinomialNB’: { ‘alpha’: [1e-3, 1e-2, 1e-1, 1., 10., 100.], ‘fit_prior’: [True, False] }
  3. -склеарн,дерево.DecisionTreeClassifier’: { ‘критерий’: [‘джини’, ‘энтропия’], ‘max_depth’: диапазон(1, 11), ‘min_samples_split’: диапазон(2, 21), ‘min_samples_leaf’: диапазон(1, 21) }
  4. -склеарн,ансамбль.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] }
  5. -склеарн,ансамбль.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] }
  6. -склеарн,ансамбль.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) }
  7. -склирн,соседи.KNeighborsClassifier’: {‘n_neighbors’: диапазон(1, 101), ‘weights’: [‘uniform’, ‘distance’], ‘p’: [1, 2] }
  8. ‘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.] }
  9. “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] }
  10. ‘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 –

  1. -склеарн,предварительная обработка.Binarizer’: { ‘порог’: np.arange(0.0, 1.01, 0.05) }
  2. -склеарн,разложение.FastICA’: { ‘tol’: np.arange(0.0, 1.01, 0.05) }
  3. “склеарн.Агломерация признаков”: {“связь”: [“уорд”, “полный”, “средний”], “сродство”: [“евклидово”, “l1”, “l2”, “манхэттен”, “косинус”] }
  4. -склеарн,предварительная обработка.MaxAbsScaler’: { }
  5. -склеарн,предварительная обработка.MinMaxScaler’: { }
  6. -склеарн,предварительная обработка.Нормализатор’: { ‘норма’: [‘l1’, ‘l2’, ‘max’] }
  7. ‘sklearn.kernel_approximation.Nystroem’: { ‘ядро’: [‘rbf’, ‘косинус’, ‘chi2’, ‘лапласиан’, ‘полином’, ‘поли’, ‘линейный’, ‘additive_chi2’, ‘сигмоид’], ‘гамма’: np.arange(0.0, 1.01, 0.05), ‘n_компоненты’: диапазон(1, 11) }
  8. -склеарн,разложение.PCA’: { ‘svd_solver’: [‘randomized’], ‘iterated_power’: диапазон(1, 11) }
  9. -склеарн,предварительная обработка.PolynomialFeatures’: { ‘степень’: [2], ‘include_bias’: [False], ‘interaction_only’: [False] }
  10. ‘sklearn.kernel_approximation.RBFSampler’: { ‘gamma’: np.arange(0.0, 1.01, 0.05) },
  11. -склеарн,предварительная обработка.Робастскейлер’: { },
  12. -склеарн,предварительная обработка.Стандартный скейлер’: { },
  13. -тпот.Нулевой счет’: { },
  14. -тпот.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 разработаны для поддержки исследователей данных, а не для их замены. Такие методы могут освободить специалиста по обработке данных от сложных задач, которые могут быть лучше решены машинами. Но анализ и выводы все еще должны быть сделаны учеными, занимающимися данными, которые также знают область применения.