예제 #1
0
class Classifier:
    def __init__(self, model_type, **kwargs):
        self.model_type = model_type

        if model_type == 'LR':  # Logistic Regression
            # modeling
            self.model = LogisticRegression(**kwargs)
        elif model_type == 'DT':  # Decision Tree
            # modeling
            self.model = DecisionTreeClassifier(**kwargs)
        elif model_type == 'RF':  # Random Forest
            # modeling
            self.model = RandomForestClassifier(**kwargs)
        elif model_type == 'XGB':  # XGboost
            # default
            kwargs['objective'] = "binary:logistic"
            # modeling
            self.model = XGBClassifier(**kwargs)
        elif model_type == 'DNN':  # Deep Neural Network
            # default params
            nb_features = kwargs['nb_features'] if 'nb_features' in kwargs.keys(
            ) else NameError("name 'nb_features' is not defined")
            nb_class = kwargs['nb_class'] if 'nb_class' in kwargs.keys(
            ) else NameError("name 'nb_class' is not defined")
            nb_layers = kwargs['nb_layers'] if 'nb_layers' in kwargs.keys(
            ) else NameError("name 'nb_layers' is not defiend")
            loss = 'categorical_crossentropy' if nb_class > 2 else 'binary_crossentropy'
            act_func = 'softmax' if nb_class > 2 else 'sigmoid'

            # modeling
            input_ = tf.keras.layers.Input(shape=(nb_features, ))
            x = input_
            for i in range(len(nb_layers)):
                x = tf.keras.layers.Dense(nb_layers[i], activation='relu')(x)
            output = tf.keras.layers.Dense(nb_class, activation=act_func)(x)
            self.model = tf.keras.models.Model(input_, output)

            # complie
            self.model.compile(optimizer=kwargs['optimizer'],
                               loss=loss,
                               metrics=['acc'])

    def train(self, X, y, savedir=None, **kwargs):
        # set evaluation dataset when model selected as XGB
        if self.model_type == 'XGB':
            kwargs['eval_set'] = [(X, y)]

        # model training
        self.model.fit(X, y, **kwargs)

        # save model
        if savedir != None:
            # check save directory
            if not os.path.isdir('../saved_models'):
                os.mkdir('../saved_models')
            # model save to pickle except DNN
            if self.model_type == 'DNN':
                self.model.save(savedir)
            else:
                pickle.dump(self.model, open(savedir, "wb"))