human
I am working on the file "STRUCE/2018/SU-2018-LAB04-0036477171.ipynb".
The first task is:
1. Ansambli (glasovanje)
(a)
Vaš je zadatak napisati razred VotingClassifierDIY koji implementira glasački ansambl. Konstruktor razreda ima dva parametra: clfs koji predstavlja listu klasifikatora (objekata iz paketa sklearn) i voting_scheme koji označava radi li se o glasovanju prebrojavanjem (SCHEME_COUNTING) ili usrednjavanjem (SCHEME_AVERAGING). Glasovanje prebrojavanjem jednostavno vraća najčešću oznaku klase, dok glasovanje usrednjavanjem uprosječuje pouzdanosti klasifikacije u neku klasu (po svim klasifikatorima) te vraća onu s najvećom pouzdanošću. Primijetite da svi klasifikatori imaju jednake težine. O komplementarnosti klasifikatora vodimo računa tako da koristimo jednake klasifikatore s različitim hiperparametrima.
Razred sadržava metode fit(X, y) za učenje ansambla i dvije metode za predikciju: predict(X) i predict_proba(X). Prva vraća predviđene oznake klasa, a druga vjerojatnosti pripadanja svakoj od klasa za svaki od danih primjera iz X.
NB: Jedan od razreda koji bi Vam mogao biti koristan jest collections.Counter. Također vrijedi i za funkcije numpy.argmax i numpy.dstack.
Can you write Python program for it?
 ... Give me a the Python program you requested?
assistant
#Here is the Python program you requested.

from collections import Counter

class VotingClassifierDIY(object):
    
    SCHEME_COUNTING = "counting"
    SCHEME_AVERAGING = "averaging"
    
    def __init__(self, clfs, voting_scheme=SCHEME_COUNTING):
        self.clfs = clfs
        self.voting_scheme = voting_scheme
        
    def fit(self, X, y):
        [ clf.fit(X,y) for clf in self.clfs ]
    
    def predict_proba(self, X):
        if self.voting_scheme == self.SCHEME_AVERAGING:
            pred_avg = []; pred = []; prob = [];
            
            for i in range(0, len(self.clfs)):
                pred.append(self.clfs[i].predict_proba(X))
                
            for i in range(0, shape(pred)[1]):
                prob = [] 
                for j in range(0, len(pred)):
                    prob.append(pred[j][i])
                pred_avg.append(mean(prob, axis = 0))

            return pred_avg
    
        else:
            raise Exception("Nemoze")
    
        
        
    def predict(self, X):
        if self.voting_scheme == self.SCHEME_AVERAGING:
            avg = self.predict_proba(X)
            return [ argmax(a) for a in avg ]
        
        elif self.voting_scheme == self.SCHEME_COUNTING:
            pred_cnt = []; pred = []; predd = [];
            
            predd = [ clf.predict(X) for clf in self.clfs ]
            
            for i in range(0, shape(predd)[1]): # 0 - 1000
                for j in range(0, len(predd)): # 0 - 3
                    pred.append(predd[j][i])
            
            for i in range(0, len(pred), 3):
                pred_cnt.append((Counter(pred[i:i+3]).most_common()[0])[0])
                
            return pred_cnt
        
        else:
            raise Exception("Nemoze")