2016-07-18 2 views
7

Насколько я знаю, типичный рабочий процесс TDD основан на тестировании черного ящика. Сначала мы определяем интерфейс, затем пишем один или набор тестов, а затем реализуем код, который передает все тесты. Так что смотрите на примере ниже:Преимущества TDD в машинном обучении

from abc import ABCMeta 


class InterfaceCalculator: 
    __metaclass__ = ABCMeta 

    @abstractmethod 
    def calculate_mean(self): 
     pass 

Образцовый тест

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) 

я пропускаю реализацию класса Calculator (InterfaceCalculator), потому что это тривиально.

Следующая идея довольно проста для понимания. Как насчет машинного обучения? Рассмотрим следующий пример. Мы хотели бы внедрить классификатор кошек, собак. Начните с интерфейса.

from abc import ABCMeta 


class InterfaceClassifier: 
    __metaclass__ = ABCMeta 

    @abstractmethod 
    def train_model(self, data): 
     pass 

    @abstractmethod 
    def predict(self, data): 
     pass 

Я подготовил очень подоконника набор из 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) 

ли способ использовать TDD, чтобы помочь работе над машиной обучения модели? Или в этом случае TDD бесполезен. Это может помочь нам проверить правильность входных данных и добавить очень высокий уровень тестовой модели? Как я могу создать хорошие автоматические тесты?

+0

Не могу сказать, что я сделал это как часть тестового набора, но первое, что приходит на ум, - это проверить ошибку перекрестной проверки классификатора по сравнению с эталоном или наивным классификатором. –

ответ

2

С TDD вы описываете ожидаемое поведение в форме теста, а затем создаете код для проверки. Хотя это может хорошо работать для некоторых компонентов вашей модели машинного обучения, обычно это плохо работает для поведения на высоком уровне модели машинного обучения, поскольку ожидаемое поведение заранее не известно. Процесс разработки модели машинного обучения часто предполагает использование разных подходов, чтобы увидеть, какой из них наиболее эффективен. Поведение, вероятно, будет измеряться в процентах, e, g, признание на 95% точнее, а не абсолюты.

0

Я думаю, вы могли бы говорить о двух различных целей здесь:

  1. Как я могу улучшить производительность моего алгоритма? Это приведет к правильности маркировки для проблемы классификации, например. Но это также может означать много других вещей, таких как количество гиперпараметров, которые требуются, какова продолжительность выполнения и т. Д. Одной из конкретных проблем в этой категории является настройка вашей модели (скажем, модель логистической регрессии), и это может быть сделано стандартным механизмом разделения данных на обучение, проверку и набор тестов.

  2. Как я могу поймать ошибки в моем алгоритме? Это фокусируется на поиске функциональных проблем. Другими словами, существуют проблемы, связанные с тем, что код не был написан в соответствии с проектом. Несмотря на то, что дизайн может быть плохим (что относится к пункту 1 выше), код должен правильно его реализовать. Здесь TDD имеет наибольшую ценность. Да, для того, чтобы это было полезно, код тестера должен иметь определенные параметры для проверки и утверждения.

Смежные вопросы