[Xiaobai] Use Amazon SageMaker para crear aplicaciones de aprendizaje automático [con video de implementación completa]

Cree aplicaciones de aprendizaje automático con Amazon SageMaker

Mire el video de implementación completo aquí. El video original dura aproximadamente 30 minutos y el tiempo de espera se redujo para la experiencia de visualización:

Xiaobai utiliza Amazon SageMaker para crear aplicaciones de aprendizaje automático

1. Cree una instancia de Sagemaker Notebook

Amazon SageMaker: https://aws.amazon.com/cn/sagemaker/Ingrese
inserte la descripción de la imagen aquí
el nombre, seleccione el tipo de instancia y configure el tamaño del disco, como se muestra en la figura a continuación.
inserte la descripción de la imagen aquí
Cree un nuevo rol, seleccione cualquier depósito S3, haga clic en Crear. rol
inserte la descripción de la imagen aquí
inserte la descripción de la imagen aquí
para configurar la red de VPC, y seleccione VPC, subred y grupo de seguridad, y haga clic para crear una instancia de notebook
**INSERTAR DESCRIPCIÓN DE LA IMAGEN AQUÍ**
Espere de 5 a 6 minutos, el estado cambia a inService, haga clic para abrir jupyter
inserte la descripción de la imagen aquí
para crear un nuevo archivo, como se muestra a continuación
inserte la descripción de la imagen aquí

2. Descarga el conjunto de datos

Ingrese el siguiente código para descargar el conjunto de datos y descomprimirlo:

!wget -N https://archive.ics.uci.edu/ml/machine-learning-databases/00222/bank-additional.zip
!unzip -o bank-additional.zip

Después de pegar el código, haga clic en Ejecutar
inserte la descripción de la imagen aquí

Mostrar conjuntos de datos a través de pandas

Use el archivo de conjunto de datos bank-additional-full.csv, léalo y muéstrelo a través de pandas:

import numpy as np  # For matrix operations and numerical processing
import pandas as pd  # For munging tabular data
import os

data = pd.read_csv("./bank-additional/bank-additional-full.csv", sep=";")
pd.set_option("display.max_columns", 500)  # Make sure we can see all of the columns
pd.set_option("display.max_rows", 50)  # Keep the output on one page
data

inserte la descripción de la imagen aquí
Las características se explican a continuación:
inserte la descripción de la imagen aquí

3. Preprocesamiento de datos

La limpieza de datos convierte los datos categóricos en números mediante una codificación one-hot.

data["no_previous_contact"] = np.where(
    data["pdays"] == 999, 1, 0
)  # Indicator variable to capture when pdays takes a value of 999
data["not_working"] = np.where(
    np.in1d(data["job"], ["student", "retired", "unemployed"]), 1, 0
)  # Indicator for individuals not actively employed
model_data = pd.get_dummies(data)  # Convert categorical variables to sets of indicators
model_data

inserte la descripción de la imagen aquí
Eliminar funciones relacionadas y funciones de duración en los datos

model_data = model_data.drop(
["duration", "emp.var.rate", "cons.price.idx", "cons.conf.idx", "euribor3m", "nr.employed"], axis=1)
model_data = model_data.drop(["y_no"], axis=1)
model_data

inserte la descripción de la imagen aquí
Divida el conjunto de datos en conjuntos de datos de entrenamiento (90 %) y de prueba (10 %), y conviértalos al formato correcto que espera el algoritmo. El conjunto de datos de entrenamiento se usa durante el entrenamiento y estos conjuntos de datos de prueba se usarán para evaluar el rendimiento del modelo una vez que se complete el entrenamiento del modelo.
inserte la descripción de la imagen aquí

4. Usa XGBoost para entrenar el modelo

Instalar XGBoost

!pip install xgboost

Usando la API de Python XGBoost

Inicie el entrenamiento del modelo y guarde el modelo cuando termine. Luego, el conjunto de datos de prueba previamente reservado se envía al modelo para la inferencia. Consideramos el resultado de la inferencia mayor que el umbral (0.5) como 1, de lo contrario, es 0, y luego lo comparamos con las etiquetas en el conjunto de prueba para evaluar el modelo. efecto.

import numpy as np
import pandas as pd
import xgboost as xgb
from sklearn.model_selection import train_test_split

# 用sklearn.cross_validation进行训练数据集划分,这里训练集和交叉验证集比例为8:2,可以自己根据需要设置
X, val_X, y, val_y = train_test_split(
    train_x,
    train_y,
    test_size=0.2,
    random_state=2022,
    stratify=train_y
)

# xgb矩阵赋值
xgb_val = xgb.DMatrix(val_X, label=val_y)
xgb_train = xgb.DMatrix(X, label=y)
xgb_test = xgb.DMatrix(test_x)

# xgboost模型 #####################
params = {
    'booster': 'gbtree',
    'objective': 'binary:logistic',
    'eval_metric': 'auc', #logloss
    'gamma': 0.1,  # 用于控制是否后剪枝的参数,越大越保守,一般0.1、0.2
    'max_depth': 8,  # 构建树的深度,越大越容易过拟合
    'alpha': 0,   # L1正则化系数
    'lambda': 10,  # 控制模型复杂度的权重值的L2正则化项参数,参数越大,模型越不容易过拟合
    'subsample': 0.7,  # 随机采样训练样本
    'colsample_bytree': 0.5,  # 生成树时进行的列采样
    'min_child_weight': 3,
    # 这个参数默认是 1,是每个叶子里面 h 的和至少是多少,对正负样本不均衡时的 0-1 分类而言
    # ,假设 h 在 0.01 附近,min_child_weight 为 1 意味着叶子节点中最少需要包含 100 个样本。
    # 这个参数非常影响结果,控制叶子节点中二阶导的和的最小值,该参数值越小,越容易 overfitting。
    'silent': 0,  # 设置成1则没有运行信息输出,最好是设置为0.
    'eta': 0.03,  # 如同学习率
    'seed': 1000,
    'nthread': -1,  # cpu 线程数
    'missing': 1,
    'scale_pos_weight': (np.sum(y==0)/np.sum(y==1))  # 用来处理正负样本不均衡的问题,通常取:sum(negative cases) / sum(positive cases)
}

plst = list(params.items())
num_rounds = 500  # 迭代次数
watchlist = [(xgb_train, 'train'), (xgb_val, 'val')]

# 训练模型并保存
# early_stopping_rounds 当设置的迭代次数较大时,early_stopping_rounds 可在一定的迭代次数内准确率没有提升就停止训练
model = xgb.train(plst, xgb_train, num_rounds, watchlist, early_stopping_rounds=200)
model.save_model('./xgb.model')  # 用于存储训练出的模型

preds = model.predict(xgb_test)

# 导出结果
threshold = 0.5
ypred = np.where(preds > 0.5, 1, 0)

from sklearn import metrics

print ('AUC: %.4f' % metrics.roc_auc_score(test_y,ypred))
print ('ACC: %.4f' % metrics.accuracy_score(test_y,ypred))
print ('Recall: %.4f' % metrics.recall_score(test_y,ypred))
print ('F1-score: %.4f' %metrics.f1_score(test_y,ypred))
print ('Precesion: %.4f' %metrics.precision_score(test_y,ypred))
print(metrics.confusion_matrix(test_y,ypred))

Muestra la importancia de las diferentes características en el modelo, lo que generalmente nos ayuda a comprender mejor el comportamiento del modelo.

from xgboost import plot_importance
from matplotlib import pyplot as plt

plt.rcParams['figure.figsize'] = (10.0, 8.0) #

# 显示重要特征
plot_importance(model)
plt.show()

inserte la descripción de la imagen aquí

5. Use la API de capacitación de SageMaker para llevar a cabo la capacitación de modelos

inicialización

import sagemaker
import boto3

import numpy as np  # For matrix operations and numerical processing
import pandas as pd  # For munging tabular data
from time import gmtime, strftime
import os

region = boto3.Session().region_name
smclient = boto3.Session().client("sagemaker")

role = sagemaker.get_execution_role()

bucket = sagemaker.Session().default_bucket()
prefix = "sagemaker/DEMO-hpo-xgboost-dm"

procesamiento de datos

data = pd.read_csv("./bank-additional/bank-additional-full.csv", sep=";")
pd.set_option("display.max_columns", 500)  # Make sure we can see all of the columns
data["no_previous_contact"] = np.where(
    data["pdays"] == 999, 1, 0
)  # Indicator variable to capture when pdays takes a value of 999
data["not_working"] = np.where(
    np.in1d(data["job"], ["student", "retired", "unemployed"]), 1, 0
)  # Indicator for individuals not actively employed
model_data = pd.get_dummies(data)  # Convert categorical variables to sets of indicators
model_data = model_data.drop(
    ["duration", "emp.var.rate", "cons.price.idx", "cons.conf.idx", "euribor3m", "nr.employed"],
    axis=1,

)

Divida el conjunto de datos en conjuntos de datos de entrenamiento (70 %), validación (20 %) y prueba (10 %), y conviértalos al formato correcto esperado por el algoritmo XGBoost integrado de SageMaker. Usaremos conjuntos de datos de entrenamiento y validación durante el entrenamiento. El conjunto de datos de prueba se utilizará para evaluar el rendimiento del modelo después de implementarse en el punto final.

train_data, validation_data, test_data = np.split(
    model_data.sample(frac=1, random_state=1729),
    [int(0.7 * len(model_data)), int(0.9 * len(model_data))],
)

pd.concat([train_data["y_yes"], train_data.drop(["y_no", "y_yes"], axis=1)], axis=1).to_csv(
    "train.csv", index=False, header=False
)
pd.concat(
    [validation_data["y_yes"], validation_data.drop(["y_no", "y_yes"], axis=1)], axis=1
).to_csv("validation.csv", index=False, header=False)
pd.concat([test_data["y_yes"], test_data.drop(["y_no", "y_yes"], axis=1)], axis=1).to_csv(
    "test.csv", index=False, header=False
)

Cargue el conjunto de datos generado en S3 para usarlo en el siguiente paso del entrenamiento del modelo.

boto3.Session().resource("s3").Bucket(bucket).Object(
    os.path.join(prefix, "train/train.csv")
).upload_file("train.csv")
boto3.Session().resource("s3").Bucket(bucket).Object(
    os.path.join(prefix, "validation/validation.csv")
).upload_file("validation.csv")


from sagemaker.inputs import TrainingInput

s3_input_train = TrainingInput(
    s3_data="s3://{}/{}/train".format(bucket, prefix), content_type="csv"
)
s3_input_validation = TrainingInput(
    s3_data="s3://{}/{}/validation/".format(bucket, prefix), content_type="csv"
)

Genere el informe de entrenamiento del modelo XGBoost, será más lento aquí

from sagemaker.debugger import Rule, rule_configs

rules=[
    Rule.sagemaker(rule_configs.create_xgboost_report())
]

sess = sagemaker.Session()

container = sagemaker.image_uris.retrieve("xgboost", boto3.Session().region_name, "1.2-1")

xgb = sagemaker.estimator.Estimator(
    container,
    role,
    instance_count=1,
    instance_type="ml.m4.xlarge",
    base_job_name="bank-dm-xgboost-report",
    output_path="s3://{}/{}/output".format(bucket, prefix),
    sagemaker_session=sess,
    rules=rules
)

xgb.set_hyperparameters(
    max_depth=5,
    eta=0.2,
    gamma=4,
    min_child_weight=6,
    subsample=0.8,
    objective="binary:logistic",
    num_round=500,
)

xgb.fit({"train": s3_input_train, "validation": s3_input_validation})

El resultado de salida es el siguiente
inserte la descripción de la imagen aquí

6. Gestión de tareas de formación

Encuentre la tarea de entrenamiento de consola de SageMaker
inserte la descripción de la imagen aquí

Informe de capacitación Ubicación de almacenamiento S3
inserte la descripción de la imagen aquí

7. Modelo de entrenamiento AutoGluon

Instalación de AutoGluon

# Install AutoGluon
!pip install -U setuptools wheel
!pip install -U "mxnet<2.0.0"
!pip install autogluon

Entrena el modelo con AutoGluon Tabular

from autogluon.tabular import TabularDataset, TabularPredictor
ag_data = pd.read_csv("./bank-additional/bank-additional-full.csv", sep=";")
label = 'y'
print("Summary of y variable: \n", ag_data[label].describe())

ag_train_data, ag_test_data = np.split(
    ag_data.sample(frac=1, random_state=1729),
    [int(0.9 * len(model_data)),],
)

Con AutoGluon, no necesitamos realizar el procesamiento de datos (procesamiento de valores faltantes, codificación one-hot, etc.), AutoGloun realizará estas tareas automáticamente por nosotros.

ag_test_data_X = ag_test_data.iloc[:,:-1]
ag_test_data_y =ag_test_data.iloc[:,20]

save_path = 'agModels-predictClass'  # specifies folder to store trained models

learner_kwargs = {'ignored_columns':[["duration", "emp.var.rate", "cons.price.idx", "cons.conf.idx", "euribor3m", "nr.employed"]]}

predictor = TabularPredictor(label=label, path=save_path, 
                             eval_metric='recall', learner_kwargs=learner_kwargs
                            ).fit(ag_train_data)
predictor = TabularPredictor.load(save_path)  # unnecessary, just demonstrates how to load previously-trained predictor from file

ag_y_pred = predictor.predict(ag_test_data_X)
ag_y_pred_proa = predictor.predict_proba(ag_test_data_X)

print("Predictions:  \n", ag_y_pred)
perf = predictor.evaluate_predictions(y_true=ag_test_data_y, y_pred=ag_y_pred, auxiliary_metrics=True)
# perf = predictor.evaluate_predictions(y_true=ag_test_data_y, y_pred=ag_y_pred_proa, auxiliary_metrics=True) #when eval_metric='auc' in TabularPredictor()

Una vez que finalice el experimento, recuerde detener la instancia y eliminar todo el contenido relevante, como funciones, políticas, grupos de registros, etc.

8. Resumen

Todo el experimento se implementa con referencia al manual oficial de Amazon y el proceso es relativamente simple. Pero la velocidad de acceso es muy lenta. A veces, la mitad de la ejecución se atasca y es necesario volver a ejecutarla. Espero que Amazon pueda mejorar el problema de la lentitud de la red, lo que afectará un poco la experiencia del usuario. Sagemaker es muy conveniente. Las instancias de Jupyter Notebook y Notebook brindan varios entornos de desarrollo, como PyTorch, Numpy, Pandas, etc., lo que reduce el tiempo y el costo de instalación. Yo, un novato que nunca aprendió el aprendizaje automático, puedo comenzar a construir rápidamente. Reducir el umbral para el aprendizaje automático. He aprendido mucho de este experimento, y la implementación es solo el primer paso. Para obtener más información, necesito leer el manual oficial de implementación varias veces para digerirlo.

9. Referencias

Artículo de referencia: Amazon Cloud Technology [Laboratorio de exploración de la nube] Use Amazon SageMaker para crear aplicaciones de aprendizaje automático, crear aplicaciones de análisis de opiniones detalladas y crear rápidamente su primera aplicación AIGC basada en el modelo Stable Diffusion Artículo de implementación: https://
dev . amazoncloud.cn/column/article/63ff329f4891d26f36585a9c

Supongo que te gusta

Origin blog.csdn.net/qq_54227625/article/details/129866236
Recomendado
Clasificación