Что не так с моим кодом Наивного Байеса вариации Гаусиана?
Код такой:
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
То есть очень плохо работает предсказание - хуже, чем случайно. Хотя вроде и правильно все сделал. Где ошибся?