Перекрестный контроль

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

Обычно эта процедура выполняется несколько раз, причем при каждом прогоне данные разбиваются на два набора по-разному. Как правило, в тестовый набор включается небольшая доля всех данных, скажем 5%, а оставшиеся 95% составляют обучающий набор. Начнем с создания функции dividedata, которая разбивает набор данных на две части в соответствии с заданным коэффициентом:

def dividedata(data,test=0.05): trainset=[] testset=[] for row in data: if random( )<test:

testset.append(row) else:

trainset.append(row) return trainset,testset

Следующий шаг – тестирование алгоритма. Для этого мы передаем ему обучающий набор, а затем вызываем его для каждого образца из тестового набора. Функция тестирования вычисляет разности между ответами и, каким-то образом комбинируя их, получает конечную оценку отклонения от идеала. Обычно в качестве оценки берется сумма квадратов разностей.

Добавьте функцию testalgorithm в файл numpredict.py:

def testalgorithm(algf,trainset,testset): error=0.0

for row in testset: guess=algf(trainset,row[‘input’]) error+=(row[‘result’]-guess)**2 return error/len(testset)

Этой функции передается алгоритм algf, который принимает набор данных и запрос. Она перебирает в цикле все строки из тестового набора и получает от алгоритма прогноз для каждой из них. Полученное значение вычитается из известного результата.

Суммирование квадратов разностей – это общепринятая техника, поскольку чем больше разность, тем сильнее она влияет на сумму, причем ее вклад зависит от величины разности нелинейно. Это означает, что алгоритм, который в большинстве случаев дает очень близкие результаты, но иногда продуцирует большие отклонения, будет считаться хуже алгоритма, который во всех случаях дает умеренно близкие результаты. Зачастую такое поведение желательно, но бывают ситуации, когда можно смириться с крупной ошибкой, если она возникает редко, а в большинстве случаев точность очень высока. Если вы столкнетесь с таким случаем, то можно модифицировать функцию, заменив квадраты разностей на их абсолютные значения.

Последний шаг – это создание функции, которая выполняет несколько разбиений набора данных, прогоняет testalgorithm для каждого разбиения и суммирует результаты для получения окончательной оценки. Добавьте ее в файл numpredict.py:

def crossvalidate(algf,data,trials=100,test=0.05): error=0.0

for i in range(trials): trainset,testset=dividedata(data,test) error+=testalgorithm(algf,trainset,testset) return error/trials

Написанный код можно варьировать различными способами. Например, можно протестировать функцию knnestimate с различными значениями k.

>>> reload(numpredict)

<module ‘numpredict’ from ‘numpredict.py’> >>> numpredict.crossvalidate(numpredict.knnestimate,data)

254.06864176819553

>>> def knn3(d,v): return numpredict.knnestimate(d,v,k=3)

>>> numpredict.crossvalidate(knn3,data)

166.97339783733005

>>> def knn1(d,v): return numpredict.knnestimate(d,v,k=1)

>>> numpredict.crossvalidate(knn1,data)

209.54500183486215

Как и следовало ожидать, при слишком малом и слишком большом количестве соседей результаты получаются неудовлетворительными. В данном случае значение 3 оказывается лучше, чем 1 или 5. Можно также попробовать различные весовые функции, которые мы написали для взвешенного алгоритма kNN, и посмотреть, какая даст наилучшие результаты:

>>> numpredict.crossvalidate(numpredict.weightedknn,data)

200.34187674254176 >>> def knninverse(d,v): return numpredict.weightedknn(d,v,\\

weightf=numpredict.inverseweight) >>> numpredict.crossvalidate(knninverse,data) 148.85947702660616

При правильно подобранных параметрах взвешенный алгоритм kNN, похоже, дает лучшие результаты для этого набора данных. На подбор параметров может уйти много времени, но делать это необходимо только один раз для конкретного обучающего набора, быть может, повторяя процедуру по мере его роста. В разделе «Оптимизация масштаба» ниже мы рассмотрим некоторые способы автоматического подбора параметров.

Вы можете следить за любыми ответами на эту запись через RSS 2.0 ленту. Вы можете оставить ответ, или trackback с вашего собственного сайта.

Оставьте отзыв

XHTML: Вы можете использовать следующие теги: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

 
Rambler's Top100