Машинное обучение с Python: часть 3 | Кодементор
В предыдущем посте мы видели различные этапы создания модели машинного обучения (ML). Вы могли заметить, что в разделе «Построение модели машинного обучения» мы рассматриваем несколько алгоритмов в конвейере, а затем настраиваем гиперпараметры для всех моделей. Вам не кажется, что было бы проще, если бы были какие-то автоматизированные инструменты, облегчающие бремя повторяющихся и трудоемких задач проектирования конвейера машинного обучения и оптимизации гиперпараметров.
А вот и AutoML, берущий на себя процесс построения модели машинного обучения: как только набор данных будет в относительно чистом формате, система AutoML сможет спроектировать и оптимизировать конвейер машинного обучения быстрее, чем 99% людей.
Доступно много таких инструментов AutoML, и наиболее популярными из них являются:
- ТРОТ
- Н2О
- Автообучение
- Azure AutoML и т. д.
Ниже мы увидим пример TPOT, остальные тоже работают над похожей идеей. TPOT работает поверх scikit-learn и автоматизирует наиболее утомительную часть машинного обучения, интеллектуально исследуя тысячи возможных конвейеров, чтобы найти лучший для ваших данных.
Я использую ту же постановку задачи и тот же набор данных, что и в части 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 —
- ‘sklearn.naive_bayes.BernoulliNB’: { ‘альфа’: [1e-3, 1e-2, 1e-1, 1., 10., 100.]’подгонка_приор’: [True, False] }
- ‘sklearn.naive_bayes.MultinomialNB’: { ‘альфа’: [1e-3, 1e-2, 1e-1, 1., 10., 100.]’подгонка_приор’: [True, False] }
- ‘sklearn.tree.DecisionTreeClassifier’: { ‘критерий’: [‘gini’, ‘entropy’]’max_depth’: диапазон (1, 11), ‘min_samples_split’: диапазон (2, 21), ‘min_samples_leaf’: диапазон (1, 21) }
- ‘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] }
- ‘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] }
- ‘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)}
- ‘sklearn.neighbors.KNeighborsClassifier’: { ‘n_neighbors’: диапазон (1, 101), ‘веса’: [‘uniform’, ‘distance’]’п’: [1, 2] }
- ‘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.] }
- ‘sklearn.linear_model.LogisticRegression’: { ‘штраф’: [‘l1’, ‘l2′]’С’: [1e-4, 1e-3, 1e-2, 1e-1, 0.5, 1., 5., 10., 15., 20., 25.]«двойной»: [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 —
- ‘sklearn.preprocessing.Binarizer’: {‘порог’: np.arange(0.0, 1.01, 0.05)}
- ‘sklearn.decomposition.FastICA’: {‘tol’: np.arange(0.0, 1.01, 0.05)}
- ‘sklearn.cluster.FeatureAgglomeration’: { ‘связь’: [‘ward’, ‘complete’, ‘average’]«близость»: [‘euclidean’, ‘l1’, ‘l2’, ‘manhattan’, ‘cosine’] }
- ‘sklearn.preprocessing.MaxAbsScaler’: { }
- ‘sklearn.preprocessing.MinMaxScaler’: {}
- ‘sklearn.preprocessing.Normalizer’: { ‘норма’: [‘l1’, ‘l2’, ‘max’] }
- ‘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)
} - ‘sklearn.decomposition.PCA’: {
‘svd_solver’: [‘randomized’],
‘iterated_power’: диапазон (1, 11) } - ‘sklearn.preprocessing.PolynomialFeatures’: { ‘степень’: [2]’include_bias’: [False]’только взаимодействие’: [False] }
- ‘sklearn.kernel_compiler.RBFSampler’: {‘гамма’: np.arange(0.0, 1.01, 0.05)},
- ‘sklearn.preprocessing.RobustScaler’: {},
- ‘sklearn.preprocessing.StandardScaler’: {},
- ‘tpot.builtins.ZeroCount’: {},
- ‘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 разработаны для поддержки специалистов по данным, а не для их замены. Такие методы могут освободить исследователя данных от сложных задач, которые лучше решаются машинами. Но анализировать и делать выводы по-прежнему должны специалисты по данным, которые также знают предметную область.