xgboost
This commit is contained in:
@@ -3,11 +3,11 @@ import csv
|
||||
import json
|
||||
import math
|
||||
import os
|
||||
import random
|
||||
import joblib
|
||||
import numpy as np
|
||||
|
||||
from xgboost import XGBRegressor
|
||||
from sklearn.model_selection import train_test_split
|
||||
from sklearn.preprocessing import StandardScaler
|
||||
from sklearn.metrics import mean_absolute_error
|
||||
|
||||
@@ -15,7 +15,9 @@ from sklearn.metrics import mean_absolute_error
|
||||
# Hyper Parameters
|
||||
# =========================================================
|
||||
|
||||
TEST_SIZE = 0.2
|
||||
TRAIN_SIZE = 0
|
||||
VALID_SIZE = 0
|
||||
|
||||
RANDOM_STATE = 42
|
||||
|
||||
N_ESTIMATORS = 500
|
||||
@@ -27,7 +29,7 @@ COLSAMPLE_BYTREE = 0.8
|
||||
CONTINUE_TRAINING = True
|
||||
|
||||
# 예측 성공으로 간주할 허용 오차
|
||||
ERROR_TOLERANCE = 0.2
|
||||
ERROR_TOLERANCE = 0.1
|
||||
|
||||
# =========================================================
|
||||
# 파일명
|
||||
@@ -50,6 +52,10 @@ IGNORE_KEYS = {
|
||||
}
|
||||
|
||||
|
||||
# =========================================================
|
||||
# safe float
|
||||
# =========================================================
|
||||
|
||||
def safe_float(value):
|
||||
if value is None:
|
||||
return 0.0
|
||||
@@ -62,10 +68,16 @@ def safe_float(value):
|
||||
return x
|
||||
|
||||
|
||||
# =========================================================
|
||||
# train
|
||||
# =========================================================
|
||||
|
||||
def train_model(
|
||||
working_dir: str,
|
||||
data_dir: str
|
||||
):
|
||||
random.seed(RANDOM_STATE)
|
||||
|
||||
# =====================================================
|
||||
# path
|
||||
# =====================================================
|
||||
@@ -129,14 +141,14 @@ def train_model(
|
||||
])
|
||||
|
||||
# =====================================================
|
||||
# measure.csv
|
||||
# dataset build
|
||||
# =====================================================
|
||||
|
||||
X = []
|
||||
y = []
|
||||
dataset = []
|
||||
|
||||
with open(measure_path, "r", encoding="utf-8") as f:
|
||||
reader = csv.reader(f)
|
||||
|
||||
next(reader, None)
|
||||
|
||||
for row in reader:
|
||||
@@ -163,29 +175,59 @@ def train_model(
|
||||
for k in feature_names
|
||||
]
|
||||
|
||||
X.append(features)
|
||||
y.append(measure)
|
||||
dataset.append((
|
||||
features,
|
||||
measure
|
||||
))
|
||||
|
||||
if len(X) == 0:
|
||||
raise ValueError("No training data")
|
||||
# =====================================================
|
||||
# shuffle
|
||||
# =====================================================
|
||||
|
||||
X = np.array(X, dtype=np.float32)
|
||||
y = np.array(y, dtype=np.float32)
|
||||
random.shuffle(dataset)
|
||||
|
||||
print(f"Dataset Size: {len(X)}")
|
||||
print(f"Feature Count: {len(feature_names)}")
|
||||
required_size = TRAIN_SIZE + VALID_SIZE
|
||||
|
||||
if len(dataset) < required_size:
|
||||
raise ValueError(
|
||||
f"Not enough dataset "
|
||||
f"({len(dataset)} < {required_size})"
|
||||
)
|
||||
|
||||
# =====================================================
|
||||
# split
|
||||
# =====================================================
|
||||
|
||||
X_train, X_valid, y_train, y_valid = train_test_split(
|
||||
X,
|
||||
y,
|
||||
test_size=TEST_SIZE,
|
||||
random_state=RANDOM_STATE
|
||||
train_dataset = dataset[:TRAIN_SIZE]
|
||||
valid_dataset = dataset[
|
||||
TRAIN_SIZE:
|
||||
TRAIN_SIZE + VALID_SIZE
|
||||
]
|
||||
|
||||
X_train = np.array(
|
||||
[x for x, _ in train_dataset],
|
||||
dtype=np.float32
|
||||
)
|
||||
|
||||
y_train = np.array(
|
||||
[y for _, y in train_dataset],
|
||||
dtype=np.float32
|
||||
)
|
||||
|
||||
X_valid = np.array(
|
||||
[x for x, _ in valid_dataset],
|
||||
dtype=np.float32
|
||||
)
|
||||
|
||||
y_valid = np.array(
|
||||
[y for _, y in valid_dataset],
|
||||
dtype=np.float32
|
||||
)
|
||||
|
||||
print(f"Train Size: {len(X_train)}")
|
||||
print(f"Valid Size: {len(X_valid)}")
|
||||
print(f"Feature Count: {len(feature_names)}")
|
||||
|
||||
# =====================================================
|
||||
# scaler
|
||||
# =====================================================
|
||||
@@ -251,6 +293,7 @@ def train_model(
|
||||
accuracy = correct / len(y_valid)
|
||||
|
||||
print(f"\nMAE: {mae:.4f}")
|
||||
|
||||
print(
|
||||
f"Accuracy "
|
||||
f"(±{ERROR_TOLERANCE}): "
|
||||
@@ -304,8 +347,21 @@ if __name__ == "__main__":
|
||||
"--dataDir",
|
||||
required=True
|
||||
)
|
||||
|
||||
parser.add_argument(
|
||||
"--trainSize",
|
||||
required=True
|
||||
)
|
||||
|
||||
parser.add_argument(
|
||||
"--validSize",
|
||||
required=True
|
||||
)
|
||||
|
||||
args = parser.parse_args()
|
||||
|
||||
TRAIN_SIZE = int(args.trainSize)
|
||||
VALID_SIZE = int(args.validSize)
|
||||
|
||||
train_model(
|
||||
args.workingDir,
|
||||
|
||||
@@ -3,11 +3,11 @@ import csv
|
||||
import json
|
||||
import math
|
||||
import os
|
||||
import random
|
||||
import joblib
|
||||
import numpy as np
|
||||
|
||||
from xgboost import XGBRegressor
|
||||
from sklearn.model_selection import train_test_split
|
||||
from sklearn.preprocessing import StandardScaler
|
||||
from sklearn.metrics import mean_absolute_error
|
||||
|
||||
@@ -15,9 +15,7 @@ from sklearn.metrics import mean_absolute_error
|
||||
# Hyper Parameters
|
||||
# =========================================================
|
||||
|
||||
TRAIN_SIZE = 0
|
||||
VALID_SIZE = 0
|
||||
|
||||
TEST_SIZE = 0.2
|
||||
RANDOM_STATE = 42
|
||||
|
||||
N_ESTIMATORS = 500
|
||||
@@ -29,7 +27,7 @@ COLSAMPLE_BYTREE = 0.8
|
||||
CONTINUE_TRAINING = True
|
||||
|
||||
# 예측 성공으로 간주할 허용 오차
|
||||
ERROR_TOLERANCE = 0.5
|
||||
ERROR_TOLERANCE = 0.1
|
||||
|
||||
# =========================================================
|
||||
# 파일명
|
||||
@@ -52,10 +50,6 @@ IGNORE_KEYS = {
|
||||
}
|
||||
|
||||
|
||||
# =========================================================
|
||||
# safe float
|
||||
# =========================================================
|
||||
|
||||
def safe_float(value):
|
||||
if value is None:
|
||||
return 0.0
|
||||
@@ -68,16 +62,10 @@ def safe_float(value):
|
||||
return x
|
||||
|
||||
|
||||
# =========================================================
|
||||
# train
|
||||
# =========================================================
|
||||
|
||||
def train_model(
|
||||
working_dir: str,
|
||||
data_dir: str
|
||||
):
|
||||
random.seed(RANDOM_STATE)
|
||||
|
||||
# =====================================================
|
||||
# path
|
||||
# =====================================================
|
||||
@@ -141,14 +129,14 @@ def train_model(
|
||||
])
|
||||
|
||||
# =====================================================
|
||||
# dataset build
|
||||
# measure.csv
|
||||
# =====================================================
|
||||
|
||||
dataset = []
|
||||
X = []
|
||||
y = []
|
||||
|
||||
with open(measure_path, "r", encoding="utf-8") as f:
|
||||
reader = csv.reader(f)
|
||||
|
||||
next(reader, None)
|
||||
|
||||
for row in reader:
|
||||
@@ -175,59 +163,29 @@ def train_model(
|
||||
for k in feature_names
|
||||
]
|
||||
|
||||
dataset.append((
|
||||
features,
|
||||
measure
|
||||
))
|
||||
X.append(features)
|
||||
y.append(measure)
|
||||
|
||||
# =====================================================
|
||||
# shuffle
|
||||
# =====================================================
|
||||
if len(X) == 0:
|
||||
raise ValueError("No training data")
|
||||
|
||||
random.shuffle(dataset)
|
||||
X = np.array(X, dtype=np.float32)
|
||||
y = np.array(y, dtype=np.float32)
|
||||
|
||||
required_size = TRAIN_SIZE + VALID_SIZE
|
||||
|
||||
if len(dataset) < required_size:
|
||||
raise ValueError(
|
||||
f"Not enough dataset "
|
||||
f"({len(dataset)} < {required_size})"
|
||||
)
|
||||
print(f"Dataset Size: {len(X)}")
|
||||
print(f"Feature Count: {len(feature_names)}")
|
||||
|
||||
# =====================================================
|
||||
# split
|
||||
# =====================================================
|
||||
|
||||
train_dataset = dataset[:TRAIN_SIZE]
|
||||
valid_dataset = dataset[
|
||||
TRAIN_SIZE:
|
||||
TRAIN_SIZE + VALID_SIZE
|
||||
]
|
||||
|
||||
X_train = np.array(
|
||||
[x for x, _ in train_dataset],
|
||||
dtype=np.float32
|
||||
X_train, X_valid, y_train, y_valid = train_test_split(
|
||||
X,
|
||||
y,
|
||||
test_size=TEST_SIZE,
|
||||
random_state=RANDOM_STATE
|
||||
)
|
||||
|
||||
y_train = np.array(
|
||||
[y for _, y in train_dataset],
|
||||
dtype=np.float32
|
||||
)
|
||||
|
||||
X_valid = np.array(
|
||||
[x for x, _ in valid_dataset],
|
||||
dtype=np.float32
|
||||
)
|
||||
|
||||
y_valid = np.array(
|
||||
[y for _, y in valid_dataset],
|
||||
dtype=np.float32
|
||||
)
|
||||
|
||||
print(f"Train Size: {len(X_train)}")
|
||||
print(f"Valid Size: {len(X_valid)}")
|
||||
print(f"Feature Count: {len(feature_names)}")
|
||||
|
||||
# =====================================================
|
||||
# scaler
|
||||
# =====================================================
|
||||
@@ -293,7 +251,6 @@ def train_model(
|
||||
accuracy = correct / len(y_valid)
|
||||
|
||||
print(f"\nMAE: {mae:.4f}")
|
||||
|
||||
print(
|
||||
f"Accuracy "
|
||||
f"(±{ERROR_TOLERANCE}): "
|
||||
@@ -347,21 +304,8 @@ if __name__ == "__main__":
|
||||
"--dataDir",
|
||||
required=True
|
||||
)
|
||||
|
||||
parser.add_argument(
|
||||
"--trainSize",
|
||||
required=True
|
||||
)
|
||||
|
||||
parser.add_argument(
|
||||
"--validSize",
|
||||
required=True
|
||||
)
|
||||
|
||||
args = parser.parse_args()
|
||||
|
||||
TRAIN_SIZE = int(args.trainSize)
|
||||
VALID_SIZE = int(args.validSize)
|
||||
|
||||
train_model(
|
||||
args.workingDir,
|
||||
Reference in New Issue
Block a user