Мой пользовательский класс оценщика не работает с sklearn cross_val_score . Оценщик ошибок типа должен иметь «соответствие», но это так

#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. никаких проблем вообще 🙂