2016-07-18 379 views
7

Per quanto ne so, il flusso di lavoro tipico di TDD si basa sul test della scatola nera. Prima definiamo l'interfaccia, quindi scriviamo uno o una serie di test e quindi implementiamo il codice che supera tutti i test. Così guardare l'esempio qui sotto:Vantaggi del TDD nell'apprendimento automatico

from abc import ABCMeta 


class InterfaceCalculator: 
    __metaclass__ = ABCMeta 

    @abstractmethod 
    def calculate_mean(self): 
     pass 

esemplare caso di test

from unittest import TestCase 


class TestInterfaceCalculator(TestCase): 

    def test_should_correctly_calcluate_mean(self): 
     X=[1,1] 
     expected_mean = 1 
     calcluator =Calculator() 
     self.assertAlmostEqual(calculator.calculate_mean(X), expected_mean) 

tralascio implementazione della classe Calcolatrice (InterfaceCalculator), perché è banale.

L'idea seguente è abbastanza facile da capire. Che ne dici di Machine Learning? Considera l'esempio seguente. Vorremmo implementare la classificazione di foto di cani e gatti. Inizia dall'interfaccia.

from abc import ABCMeta 


class InterfaceClassifier: 
    __metaclass__ = ABCMeta 

    @abstractmethod 
    def train_model(self, data): 
     pass 

    @abstractmethod 
    def predict(self, data): 
     pass 

ho preparato insieme molto davanzale delle Unittests

from unittest import TestCase 


class TestInterfaceCalculator(TestCase): 
    def __init__(self): 
     self.model = CatDogClassifier() 

    def test_should_correctly_train_model(self, data): 
     """ 
     How can be implemented? 
     """ 
     self.model.train_model(data) 

    def test_should_correctly_calcluate_mean(self): 
     input ="cat.jpg" 
     expected_result = "cat" 
     calcluator =.assertAlmostEqual(self.model.preditct(input), expected_result) 

E 'il modo per utilizzare TDD per aiutare il lavoro sul modello di apprendimento della macchina? O In questo caso TDD è inutile. Può solo aiutarci a verificare la correttezza dei dati di input e aggiungere un test di livello molto alto del modello addestrato? Come posso creare buoni test automatici?

+0

Non posso dire che ho fatto questo come parte di una suite di test, ma la prima cosa che viene in mente è testando errore di convalida incrociata del classificatore contro un benchmark o classificatore ingenuo. –

risposta

2

Con TDD, si descrive il comportamento previsto sotto forma di test e quindi si crea il codice per soddisfare il test. Sebbene questo possa funzionare bene per alcuni componenti del modello di machine learning, di solito non funziona bene per il comportamento ad alto livello di un modello di machine learning, poiché il comportamento previsto non è noto con precisione in anticipo. Il processo di sviluppo di un modello di apprendimento automatico spesso implica il tentativo di approcci diversi per vedere quale è più efficace. È probabile che il comportamento sia misurato in termini di percentuali, e, g, il riconoscimento è accurato al 95%, piuttosto che assoluto.

0

penso che si potrebbe parlare di due obiettivi distinti: qui

  1. Come posso migliorare le prestazioni del mio algoritmo? Ciò comporterebbe, ad esempio, la correttezza dell'etichettatura per un problema di classificazione. Ma questo potrebbe anche significare molte altre cose, come il numero di parametri che richiede, il runtime e così via. Un particolare problema in questa categoria, ad esempio, è l'ottimizzazione del modello (diciamo un modello di regressione logistica) e può essere eseguito un meccanismo standard di suddivisione dei dati in formazione, convalida e set di test.

  2. Come posso rilevare errori nel mio algoritmo? Questo si concentra sulla ricerca di problemi funzionali. In altre parole, problemi che esistono perché il codice non è stato scritto in base al design. Anche se il design potrebbe essere errato (che cade nel punto 1 sopra), il codice dovrebbe implementarlo correttamente. È qui che TDD ha più valore. Sì, perché questo sia utile, il codice del tester dovrebbe avere parametri specifici da validare e affermare.