Машинное обучение с Python: часть 3 | Кодементор

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

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

Доступно много таких инструментов AutoML, и наиболее популярными из них являются:

  • ТРОТ
  • Н2О
  • Автообучение
  • Azure AutoML и т. д.

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

tpotFlow.JPG

Я использую ту же постановку задачи и тот же набор данных, что и в части 2. Но для простоты я разбавлю некоторые этапы предварительной обработки, ss TPOT также применил несколько этапов предварительной обработки (списки приведены ниже). Файл Jupyter Notebook и обучающие/тестовые файлы также можно загрузить с моего 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()
    
    rand_age = np.random.randint(mean - std, mean + std, size = is_null)
    
    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.BernoulliNB’: { ‘альфа’: [1e-3, 1e-2, 1e-1, 1., 10., 100.]’подгонка_приор’: [True, False] }
  2. ‘sklearn.naive_bayes.MultinomialNB’: { ‘альфа’: [1e-3, 1e-2, 1e-1, 1., 10., 100.]’подгонка_приор’: [True, False] }
  3. ‘sklearn.tree.DecisionTreeClassifier’: { ‘критерий’: [‘gini’, ‘entropy’]’max_depth’: диапазон (1, 11), ‘min_samples_split’: диапазон (2, 21), ‘min_samples_leaf’: диапазон (1, 21) }
  4. ‘sklearn.ensemble.ExtraTreesClassifier’: { ‘n_estimators’: [100]’критерий’: [‘gini’, ‘entropy’]«max_features»: np.arange (0,05, 1,01, 0,05), «min_samples_split»: диапазон (2, 21), «min_samples_leaf»: диапазон (1, 21), «начальная загрузка»: [True, False] }
  5. ‘sklearn.ensemble.RandomForestClassifier’: { ‘n_estimators’: [100]’критерий’: [‘gini’, ‘entropy’]«max_features»: np.arange (0,05, 1,01, 0,05), «min_samples_split»: диапазон (2, 21), «min_samples_leaf»: диапазон (1, 21), «начальная загрузка»: [True, False] }
  6. ‘sklearn.ensemble.GradientBoostingClassifier’: { ‘n_estimators’: [100]’скорость_обучения’: [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. ‘sklearn.neighbors.KNeighborsClassifier’: { ‘n_neighbors’: диапазон (1, 101), ‘веса’: [‘uniform’, ‘distance’]’п’: [1, 2] }
  8. ‘sklearn.svm.LinearSVC’: { ‘штраф’: [‘l1’, ‘l2′]’потеря’: [‘hinge’, ‘squared_hinge’]«двойной»: [True, False]’тол’: [1e-5, 1e-4, 1e-3, 1e-2, 1e-1]’С’: [1e-4, 1e-3, 1e-2, 1e-1, 0.5, 1., 5., 10., 15., 20., 25.] }
  9. ‘sklearn.linear_model.LogisticRegression’: { ‘штраф’: [‘l1’, ‘l2′]’С’: [1e-4, 1e-3, 1e-2, 1e-1, 0.5, 1., 5., 10., 15., 20., 25.]«двойной»: [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. ‘sklearn.preprocessing.Binarizer’: {‘порог’: np.arange(0.0, 1.01, 0.05)}
  2. ‘sklearn.decomposition.FastICA’: {‘tol’: np.arange(0.0, 1.01, 0.05)}
  3. ‘sklearn.cluster.FeatureAgglomeration’: { ‘связь’: [‘ward’, ‘complete’, ‘average’]«близость»: [‘euclidean’, ‘l1’, ‘l2’, ‘manhattan’, ‘cosine’] }
  4. ‘sklearn.preprocessing.MaxAbsScaler’: { }
  5. ‘sklearn.preprocessing.MinMaxScaler’: {}
  6. ‘sklearn.preprocessing.Normalizer’: { ‘норма’: [‘l1’, ‘l2’, ‘max’] }
  7. ‘sklearn.kernel_приближение.Nystroem’: {
    «ядро»: [‘rbf’, ‘cosine’, ‘chi2’, ‘laplacian’, ‘polynomial’, ‘poly’, ‘linear’, ‘additive_chi2’, ‘sigmoid’],
    «гамма»: np.arange (0,0, 1,01, 0,05), «n_components»: диапазон (1, 11)
    }
  8. ‘sklearn.decomposition.PCA’: {
    ‘svd_solver’: [‘randomized’],
    ‘iterated_power’: диапазон (1, 11) }
  9. ‘sklearn.preprocessing.PolynomialFeatures’: { ‘степень’: [2]’include_bias’: [False]’только взаимодействие’: [False] }
  10. ‘sklearn.kernel_compiler.RBFSampler’: {‘гамма’: np.arange(0.0, 1.01, 0.05)},
  11. ‘sklearn.preprocessing.RobustScaler’: {},
  12. ‘sklearn.preprocessing.StandardScaler’: {},
  13. ‘tpot.builtins.ZeroCount’: {},
  14. ‘tpot.builtins.OneHotEncoder’: { ‘минимальная_фракция’: [0.05, 0.1, 0.15, 0.2, 0.25]«разреженный»: [False] } (выделено мной)
Y_prediction = tpot.predict(X_test)
submission = pd.DataFrame({
        "PassengerId": test_df["PassengerId"],
        "Survived": Y_prediction
    })

Запустить TPOT не так просто, как подогнать одну модель к набору данных. Он рассматривает несколько алгоритмов машинного обучения (случайные леса, линейные модели, SVM и т. д.) в конвейере с многочисленными этапами предварительной обработки (вменение пропущенных значений, масштабирование, PCA, выбор признаков и т. д.), гиперпараметры для всех модели и этапы предварительной обработки, а также несколько способов объединения или объединения алгоритмов в конвейере. Вот почему выполнение обычно занимает много времени и невыполнимо для больших наборов данных.

Все методы AutoML разработаны для поддержки специалистов по данным, а не для их замены. Такие методы могут освободить исследователя данных от сложных задач, которые лучше решаются машинами. Но анализировать и делать выводы по-прежнему должны специалисты по данным, которые также знают предметную область.

Похожие записи

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *