#python #scikit-learn #cross-validation
#python #scikit-learn #перекрестная проверка
Вопрос:
Я пытаюсь реализовать пользовательский класс оценщика и использовать его с помощью sklearn cross_val_score() . У меня есть функции «fit», «get_params» и «predict», но python выдает следующую ошибку:
Ошибка типа: оценщик должен быть оценщиком, реализующим метод «fit», был передан «multigaussclassify».
Вот как я называю своего оценщика:
multigaussclassify = MultiGaussClassify(k_Boston, d_Boston, diag=False)
sklearn.model_selection.cross_val_score('multigaussclassify',XBoston50,yBoston50,cv=5,scoring="accuracy")
Я уже несколько дней ищу решения в Google, но, похоже, не могу найти ничего, что объясняет проблему здесь. Любая помощь будет очень признательна!
class MultiGaussClassify:
def __init__(self, k, d, diag):
self.k = k
self.d = d
self.diag = diag
self.PCi = (1/k) * np.ones((k,1))
self.Mean = np.zeros((d,k))
self.Cov = np.dstack([np.identity(d)]*k)
def get_params(self, deep=True):
return {"k": self.k, "d": self.d, 'diag': self.diag}
def fit(self, X, y):
# Formatting Data
d = self.d
k = self.k
unique, counts = np.unique(y, return_counts=True)
N = np.sum(counts)
X = X.reshape((N,d))
y = y.reshape((N,1))
# Estimating Prior
self.PCi = counts/N
self.PCi = self.PCi.reshape((k,1))
# Estimating Mean
data = np.hstack((X,y))
for i in range(0,k):
mtemp = data[np.where(data[:,-1] == i)]
mtemp = mtemp.sum(axis=0)[:-1]
mtemp = mtemp/counts[i]
self.Mean[:,i] = mtemp.T
# Estimating Covariance Matrix
for i in range(0,k):
Xtemp = data[np.where(data[:,-1] == i)]
Xtemp = Xtemp[:,0:d]
self.Cov[:,:,i] = ((Xtemp-self.Mean[:,i]).T@(Xtemp-self.Mean[:,i]))/counts[i]
if d > 2:
self.Cov = self.Cov np.dstack([0.01*np.identity(d)]*k)
return self
def predict(self, X):
k = self.k
d = self.d
N = np.shape(X)[0]
X = X.reshape((N,d))
YPred = np.zeros((N,1))
for j in range(0,len(X)):
g = np.zeros((k,1))
for i in range(0,k):
if self.diag == False:
S_inv = np.linalg.inv(self.Cov[:,:,i])
S_det = np.linalg.det(self.Cov[:,:,i])
W = -(1/2) * S_inv
w = S_inv @ self.Mean[:,i]
w0 = -(1/2) * self.Mean[:,i].T @ S_inv @ self.Mean[:,i] - (1/2) * np.log(S_det) np.log(self.PCi[i])
g[i] = np.transpose(X[j,:].reshape(d,1)) @ W @ X[j,:].reshape(d,1) w.T @ X[j,:].reshape(d,1) w0
else:
summedTot = 0
for l in range(0,d):
summed = ((X[j,l] - self.Mean[l,i])/self.Cov[l,l,i])**2
summedTot = summedTot summed
g[i] = -(1/2) * summedTot np.log(self.PCi[i])
gmax = np.ndarray.max(g)
for i in range(0,k):
if g[i] == gmax:
YPred[j] = i
return YPred
Комментарии:
1. Вы передали строку multigaussclassify вместо объекта multigaussclassify
2. ВАУ, ты понятия не имеешь, насколько глупым, но пережитым я себя чувствую! Большое вам спасибо, что нашли это для меня.
3. никаких проблем вообще 🙂