Exemplo n.º 1
0
class SVM:

    def __init__(self, db, ratio_split, lbd, kernel="raw_kernel", k=None, C=1, nkp=False):
        self.n = int(len(db)*ratio_split)
        self.lbd = lbd
        self.k = Kernel(self.lbd,k)
        self.ker = getattr(self.k, kernel)
        self.X, self.y = db[:,0], db[:,1]#shuffle(db[:,0], db[:,1])
        self.X_train, self.X_test, self.y_train, self.y_test = train_test_split(db[:,0], db[:,1], train_size=ratio_split, random_state=42, stratify=db[:,1])
        self.svc = SVC(kernel='precomputed', C=1)
        self.nkp = nkp

    def learn(self):
        self.kernel_train = self.k.build_gram_matrix(self.X_train, self.ker)
        self.svc.fit(self.kernel_train, self.y_train)
        return self.k.comp_time

    def score(self):
        #check is matrice dans bon sens
        self.kernel_test = self.k.build_gram_matrix_nonsq(self.X_test, self.X_train.T, self.ker)
        self.y_pred = self.svc.predict(self.kernel_test)
        return 1-zero_one_loss(self.y_test,self.y_pred)

    def cross_val_score(self, k):
        start = time()
        self.kernel = self.k.build_gram_matrix(self.X, self.ker, nkp=self.nkp)
        end = time() - start
        score = cross_val_score(self.svc, self.kernel, self.y, cv=k)
        return { "accuracy": sum(score)/len(score), "time": end, "stddev": np.std(score)}

    def display_heatmap(self, categ = "traintest"):
        #revoir labels
        if "train" in categ.lower():
            plt.figure()
            sns.heatmap(self.kernel_train,xticklabels=self.y_train,yticklabels=self.y_train).set_title("Train")
        if "test" in categ.lower():
            plt.figure()
            sns.heatmap(self.kernel_test,xticklabels=self.y_train,yticklabels=self.y_train).set_title("Test")