-
Notifications
You must be signed in to change notification settings - Fork 4
Expand file tree
/
Copy pathtrain.py
More file actions
111 lines (78 loc) · 3.72 KB
/
train.py
File metadata and controls
111 lines (78 loc) · 3.72 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
# The data set used in this example is from http://archive.ics.uci.edu/ml/datasets/Wine+Quality
# P. Cortez, A. Cerdeira, F. Almeida, T. Matos and J. Reis.
# Modeling wine preferences by data mining from physicochemical properties. In Decision Support Systems, Elsevier, 47(4):547-553, 2009.
# Obtained from mlflow repository
import os
import argparse
import warnings
import pandas as pd
import numpy as np
from sklearn.metrics import mean_squared_error, mean_absolute_error, r2_score
from sklearn.model_selection import train_test_split
from sklearn.linear_model import ElasticNet
import joblib
def eval_metrics(actual, pred):
rmse = np.sqrt(mean_squared_error(actual, pred))
mae = mean_absolute_error(actual, pred)
r2 = r2_score(actual, pred)
return rmse, mae, r2
def do_train(alpha, l1_ratio, train_x, train_y, test_x, test_y):
en = ElasticNet(alpha=alpha, l1_ratio=l1_ratio, random_state=42)
en.fit(train_x, train_y)
predicted_qualities = en.predict(test_x)
rmse, mae, r2 = eval_metrics(test_y, predicted_qualities)
print("Elasticnet model (alpha=%f, l1_ratio=%f):" % (alpha, l1_ratio))
print(" RMSE: %s" % rmse)
print(" MAE: %s" % mae)
print(" R2: %s" % r2)
return rmse, mae, r2, en
def mlflow_run (alpha, l1_ratio, train_x, train_y, test_x, test_y):
from lightex.mulogger import MLFlowLogger, MultiLogger
logger = MLFlowLogger('sk')
mlflow = logger.mlflow
print (f'tracking: {mlflow.tracking.get_tracking_uri()}')
with mlflow.start_run():
rmse, mae, r2, en = do_train(alpha, l1_ratio, train_x, train_y, test_x, test_y)
mlflow.log_param("alpha", alpha)
mlflow.log_param("l1_ratio", l1_ratio)
mlflow.log_metric("rmse", rmse)
mlflow.log_metric("r2", r2)
mlflow.log_metric("mae", mae)
print (mlflow.get_artifact_uri())
#mlflow.sklearn.log_model(en, "model")
def logger_run (alpha, l1_ratio, train_x, train_y, test_x, test_y, output_dir):
from lightex.mulogger import MultiLogger
logger = MultiLogger()
logger.start_run()
rmse, mae, r2, en = do_train(alpha, l1_ratio, train_x, train_y, test_x, test_y)
logger.log('*', ltype='hpdict', value={'alpha': alpha, 'l1_ratio': l1_ratio})
logger.log('*', ltype='scalardict', value={'mae': mae, 'rmse': rmse, 'r2': r2}, step=1)
#logger.log('*', ltype='scalardict', value={'mae': mae, 'rmse': rmse, 'r2': r2+1}, step=2)
joblib.dump(en, f'{output_dir}/model.joblib')
logger.end_run()
if __name__ == "__main__":
warnings.filterwarnings("ignore")
np.random.seed(40)
parser = argparse.ArgumentParser()
parser.add_argument('--data-dir', type=str, required=True)
parser.add_argument('--output-dir', type=str, required=True)
parser.add_argument('--alpha', required=True)
parser.add_argument('--l1_ratio', required=True)
args = parser.parse_args()
# Read the wine-quality csv file (make sure you're running this from the root of MLflow!)
wine_path = os.path.join(args.data_dir, "wine-quality.csv")
data = pd.read_csv(wine_path)
# Split the data into training and test sets. (0.75, 0.25) split.
train, test = train_test_split(data)
# The predicted column is "quality" which is a scalar from [3, 9]
train_x = train.drop(["quality"], axis=1)
test_x = test.drop(["quality"], axis=1)
train_y = train[["quality"]]
test_y = test[["quality"]]
# alpha = float(args['alpha'])
# l1_ratio = float(args['l1_ratio'])
alpha = float(args.alpha)
l1_ratio = float(args.l1_ratio)
#do_train(alpha, l1_ratio, train_x, train_y, test_x, test_y)
#mlflow_run (alpha, l1_ratio, train_x, train_y, test_x, test_y)
logger_run (alpha, l1_ratio, train_x, train_y, test_x, test_y, args.output_dir)