Module minder_utils.models.classifiers

Expand source code
from .classifiers import *

__all__ = ['Classifiers']

Sub-modules

minder_utils.models.classifiers.classifiers
minder_utils.models.classifiers.torch_classifiers

Classes

class Classifiers (model_type='nn', boosting=True)
Expand source code
class Classifiers:
    def __init__(self, model_type='nn', boosting=True):
        self.boosting = boosting
        self.model_type = model_type
        self.model = getattr(self, model_type)()
        self.callbacks = [EarlyStopping(monitor='loss', patience=3)]
        self.epochs = 50
        self.batch_size = 10

    def reset(self):
        self.model = getattr(self, self.model_type)()

    @property
    def methods(self):
        return {
            # 'nn': 'neural network',
            # 'lstm': 'LSTM',
            'lr': 'logistic regression',
            'bayes': 'naive bayesian',
            'dt': 'decision tree',
            'knn': 'KNN'
        }

    def get_info(self, verbose=False):
        if verbose:
            print('Available methods:')
            for idx, key in enumerate(self.methods):
                print(str(idx).ljust(10, ' '), key.ljust(10, ' '), self.methods[key].ljust(10, ' '))
        return self.methods

    @staticmethod
    def nn():
        model = Sequential()
        model.add(Dense(256, activation='relu'))
        model.add(Dense(2, activation='softmax'))
        model.compile(loss='categorical_crossentropy', optimizer='Adam', metrics=['accuracy'])
        return model

    @staticmethod
    def lstm():
        model = Sequential()
        model.add(LSTM(256, dropout=0.1, recurrent_dropout=0.1))
        model.add(Dense(2, activation='softmax'))
        model.compile(loss='categorical_crossentropy', optimizer='Adam', metrics=['accuracy'])
        return model

    def fit(self, data, targets, cat=False):
        data = data.reshape(data.shape[0], -1)
        if self.model_type in ['pnn', 'nn', 'lstm']:
            if self.model_type in ['lstm', 'pnn']:
                data = data.reshape(data.shape[0], 24, -1)
            self.model.fit(data, targets, epochs=self.epochs, batch_size=self.batch_size, callbacks=self.callbacks,
                           verbose=0)
        else:
            targets = y_to_categorical(targets) if cat else targets
            targets = np.argmax(targets, axis=1) if targets.ndim > 1 else targets
            self.model.fit(data, targets)

    def predict(self, data):
        data = data.reshape(data.shape[0], -1)
        if self.model_type in ['pnn', 'nn', 'lstm']:
            if self.model_type in ['lstm', 'pnn']:
                data = data.reshape(data.shape[0], 24, -1)
            return np.argmax(self.model.predict(data), axis=1)
        else:
            return self.model.predict(data)

    def predict_probs(self, data):
        data = data.reshape(data.shape[0], -1)
        if self.model_type in ['pnn', 'nn', 'lstm']:
            if self.model_type in ['lstm', 'pnn']:
                data = data.reshape(data.shape[0], 24, -1)
            return self.model.predict(data)
        else:
            return self.model.predict_proba(data)

    def lr(self):
        if self.boosting:
            return AdaBoostClassifier(LogisticRegression(max_iter=1000), n_estimators=100, random_state=0)
        return LogisticRegression(max_iter=1000)

    def bayes(self):
        if self.boosting:
            return AdaBoostClassifier(GaussianNB(), n_estimators=100, random_state=0)
        return GaussianNB()

    def dt(self):
        if self.boosting:
            return AdaBoostClassifier(tree.DecisionTreeClassifier(), n_estimators=100, random_state=0)
        return tree.DecisionTreeClassifier()

    def knn(self):
        return KNeighborsClassifier(n_neighbors=4)

    def __name__(self):
        return self.model_type

Static methods

def lstm()
Expand source code
@staticmethod
def lstm():
    model = Sequential()
    model.add(LSTM(256, dropout=0.1, recurrent_dropout=0.1))
    model.add(Dense(2, activation='softmax'))
    model.compile(loss='categorical_crossentropy', optimizer='Adam', metrics=['accuracy'])
    return model
def nn()
Expand source code
@staticmethod
def nn():
    model = Sequential()
    model.add(Dense(256, activation='relu'))
    model.add(Dense(2, activation='softmax'))
    model.compile(loss='categorical_crossentropy', optimizer='Adam', metrics=['accuracy'])
    return model

Instance variables

var methods
Expand source code
@property
def methods(self):
    return {
        # 'nn': 'neural network',
        # 'lstm': 'LSTM',
        'lr': 'logistic regression',
        'bayes': 'naive bayesian',
        'dt': 'decision tree',
        'knn': 'KNN'
    }

Methods

def bayes(self)
Expand source code
def bayes(self):
    if self.boosting:
        return AdaBoostClassifier(GaussianNB(), n_estimators=100, random_state=0)
    return GaussianNB()
def dt(self)
Expand source code
def dt(self):
    if self.boosting:
        return AdaBoostClassifier(tree.DecisionTreeClassifier(), n_estimators=100, random_state=0)
    return tree.DecisionTreeClassifier()
def fit(self, data, targets, cat=False)
Expand source code
def fit(self, data, targets, cat=False):
    data = data.reshape(data.shape[0], -1)
    if self.model_type in ['pnn', 'nn', 'lstm']:
        if self.model_type in ['lstm', 'pnn']:
            data = data.reshape(data.shape[0], 24, -1)
        self.model.fit(data, targets, epochs=self.epochs, batch_size=self.batch_size, callbacks=self.callbacks,
                       verbose=0)
    else:
        targets = y_to_categorical(targets) if cat else targets
        targets = np.argmax(targets, axis=1) if targets.ndim > 1 else targets
        self.model.fit(data, targets)
def get_info(self, verbose=False)
Expand source code
def get_info(self, verbose=False):
    if verbose:
        print('Available methods:')
        for idx, key in enumerate(self.methods):
            print(str(idx).ljust(10, ' '), key.ljust(10, ' '), self.methods[key].ljust(10, ' '))
    return self.methods
def knn(self)
Expand source code
def knn(self):
    return KNeighborsClassifier(n_neighbors=4)
def lr(self)
Expand source code
def lr(self):
    if self.boosting:
        return AdaBoostClassifier(LogisticRegression(max_iter=1000), n_estimators=100, random_state=0)
    return LogisticRegression(max_iter=1000)
def predict(self, data)
Expand source code
def predict(self, data):
    data = data.reshape(data.shape[0], -1)
    if self.model_type in ['pnn', 'nn', 'lstm']:
        if self.model_type in ['lstm', 'pnn']:
            data = data.reshape(data.shape[0], 24, -1)
        return np.argmax(self.model.predict(data), axis=1)
    else:
        return self.model.predict(data)
def predict_probs(self, data)
Expand source code
def predict_probs(self, data):
    data = data.reshape(data.shape[0], -1)
    if self.model_type in ['pnn', 'nn', 'lstm']:
        if self.model_type in ['lstm', 'pnn']:
            data = data.reshape(data.shape[0], 24, -1)
        return self.model.predict(data)
    else:
        return self.model.predict_proba(data)
def reset(self)
Expand source code
def reset(self):
    self.model = getattr(self, self.model_type)()