Что не так с моим кодом Наивного Байеса вариации Гаусиана?

Код такой:

class GaussianNB(object):
    def __init__(self):
        pass

    def fit(self, X, y):           

        separated = [[x for x, t in zip(X, y) if t == c] for c in np.unique(y)]
        self.model = np.array([np.c_[np.mean(i, axis=0), np.std(i, axis=0)]
                    for i in separated])
        return self

    def _prob(self, x, mean, std):

        exponent = np.exp(- ((x - mean)**2 / (2 * std**2)))
        return (1.0 / ((np.sqrt(2 * np.pi) * std) * exponent))


    def predict_log_proba(self, X):

        return [[sum(self._prob(i, *s) for s, i in zip(summaries, x))
                for summaries in self.model] for x in X]

    def predict(self, X):
        return np.argmax(self.predict_log_proba(X), axis=1)

    def score(self, X, y):
        return sum(self.predict(X) == y) / len(y)

а результат выдает такой:

gnb = GaussianNB()
gnb.fit(X_train.values, y_train)

gnb_predictions = gnb.predict(X_test.values)
gnb_score_train = gnb.score(X_train.values, y_train)
gnb_score_test = gnb.score(X_test.values, y_test)

[1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1] 0.215 0.28

То есть очень плохо работает предсказание - хуже, чем случайно. Хотя вроде и правильно все сделал. Где ошибся?


Ответы (0 шт):