Когда я тренирую модель локально с помощью файла script.py, кажется, что все работает нормально. Но когда я создаю оценщик из sagemaker.sklearn.estimator.SKlearn, моя учебная работа каждый раз терпит неудачу. Вот учебный сценарий, а также аргументы, которые я передаю при создании оценщика. Любое понимание того, что не так с учебным сценарием, было бы полезно (почти наверняка проблема в этом есть).
%%writefile script.py
import argparse
import os
import numpy as np
import pandas as pd
from sklearn.ensemble import RandomForestRegressor
from sklearn.externals import joblib
from sklearn.impute import SimpleImputer
# inference functions ---------------
def model_fn(model_dir):
clf = joblib.load(os.path.join(model_dir, "model.joblib"))
return clf
if __name__ =='__main__':
print('extracting arguments')
parser = argparse.ArgumentParser()
# hyperparameters sent by the client are passed as command-line arguments to the script.
# to simplify the demo we don't use all sklearn RandomForest hyperparameters
parser.add_argument('--n-estimators', type=int, default=10)
parser.add_argument('--min-samples-leaf', type=int, default=3)
# Data, model, and output directories
parser.add_argument('--model-dir', type=str, default=os.environ.get('SM_MODEL_DIR'))
parser.add_argument('--train', type=str, default=os.environ.get('SM_CHANNEL_TRAIN'))
parser.add_argument('--test', type=str, default=os.environ.get('SM_CHANNEL_TEST'))
parser.add_argument('--train-file', type=str, default=os.environ.get('train'))
parser.add_argument('--test-file', type=str, default=os.environ.get('test'))
parser.add_argument('--features', type=str)
parser.add_argument('--target', type=str) # in this script we ask user to explicitly name the target
args, _ = parser.parse_known_args()
print('reading data')
print(args)
train_df = pd.read_csv(os.path.join(args.train, args.train_file))
test_df = pd.read_csv(os.path.join(args.test, args.test_file))
#dropping rows with NaN's
#train_df = train_df.dropna()
#test_df = test_df.dropna()
print('building training and testing datasets')
X_train = train_df[args.features.split()]
X_test = test_df[args.features.split()]
y_train = train_df[args.target]
y_test = test_df[args.target]
print(X_train)
print(y_train)
# train
print('training model')
model = RandomForestRegressor(
n_estimators=args.n_estimators,
min_samples_leaf=args.min_samples_leaf,
n_jobs=-1)
model.fit(X_train, y_train)
# print abs error
print('validating model')
abs_err = np.abs(model.predict(X_test) - y_test)
# print couple perf metrics
for q in [10, 50, 90]:
print('AE-at-' + str(q) + 'th-percentile: '
+ str(np.percentile(a=abs_err, q=q)))
# persist model
path = os.path.join(args.model_dir, "model.joblib")
joblib.dump(model, path)
print('model persisted at ' + path)
print(args.min_samples_leaf)
Тогда вот моя местная учебная работа, которая, кажется, работает над этим сценарием:
! python script.py --n-estimators 500 \
--min-samples-leaf 2 \
--model-dir /home/ec2-user/SageMaker \
--train 's3://ee-random-forest/data/' \
--test 's3://ee-random-forest/data/' \
--train-file 'ee_60_train.csv' \
--test-file 'ee_60_test.csv' \
--features 'balance estimatedvalue homeequitypercentage hhsize owned_mortage rented households nonfamilyhhper households_estimate_medianincome pop within15m BK NS S' \
--target target
И вот где я создаю оценщик SKlearn, для которого учебная работа всегда терпит неудачу:
from sagemaker.sklearn.estimator import SKLearn
sklearn_estimator = SKLearn(
entry_point='script.py',
role = get_execution_role(),
train_instance_count=1,
train_instance_type='ml.c5.xlarge',
framework_version='0.20.0',
metric_definitions=[
{'Name': 'median-AE',
'Regex': "AE-at-50th-percentile: ([0-9.]+).*$"}],
hyperparameters = {'n-estimators': 500,
'min-samples-leaf': 3,
'features': 'balance estimatedvalue homeequitypercentage hhsize owned_mortage rented households nonfamilyhhper households_estimate_medianincome pop within15m BK NS S',
'target': 'target'})
# launch training job, with asynchronous call
sklearn_estimator.fit({'train':trainpath, 'test': testpath}, wait=False)
Заранее спасибо.