Оптимизация масштаба

В данном случае выбрать подходящие параметры масштабирования не так уж сложно, потому что вы заранее знаете, какие переменные

существенны. Но обычно приходится работать с наборами данных, построенными кем-то другим, поэтому априорной информации о том, какие переменные существенны, а какие – нет, может и не быть. Теоретически можно попробовать много разных сочетаний коэффициентов, пока не найдется дающее приемлемые результаты, но количество переменных может исчисляться сотнями, поэтому такой подход потребует слишком много времени. Вы  знаете, что автоматизировать поиск хорошего решения, когда приходится учитывать много переменных, можно с помощью оптимизации. Напомним, что для оптимизации нужно задать область определения переменных, диапазон и целевую функцию. Функция crossvalidate возвращает тем большее значение, чем хуже решение, а следовательно, может служить целевой функцией. Единственное, что осталось сделать, – это написать для нее функцию-обертку, которая принимает список значений, масштабирует данные и вычисляет отклонение при перекрестном контроле. Добавьте функцию createcostfunction в файл numpredict.py:

def createcostfunction(algf,data): def costf(scale):

sdata=rescale(data,scale) return crossvalidate(algf,sdata,trials=10) return costf

Областью определения является диапазон весов по каждому измерению. В данном случае минимально возможное значение равно 0, поскольку отрицательные числа приводят просто к зеркальному отражению данных, а для вычисления расстояний это неважно. Теоретически веса могут быть произвольно большими, но из практических соображений ограничимся пока значениями не выше 20. Поэтому добавьте в файл numpredict.py такую строку:

weightdomain=[(0,20)]*4 Теперь у нас есть все необходимое для автоматической оптимизации весов. Убедитесь, что файл optimization.py находится в текущей папке, и попробуйте применить оптимизацию методом имитации отжига: >>> import optimization >>> reload(numpredict)

<module ‘numpredict’ from ‘numpredict.pyc’>

>>> costf=numpredict.createcostfunction(numpredict.knnestimate,data) >>> optimization.annealingoptimize(numpredict.weightdomain,costf,step=2)

[11,18,0,6]

Блестяще! Алгоритм не только определил, что номер ряда – бесполезная переменная, и умножил масштаб по этой оси на 0, но и выяснил, что диапазон изменения объема бутылки непропорционально велик по сравнению с ее вкладом, и соответственно увеличил масштаб для двух других переменных.

Попробуйте более медленный, но, как правило, более точный алгоритм geneticoptimize и посмотрите, получатся ли аналогичные результаты: >>> optimization.geneticoptimize(numpredict.weightdomain,costf,popsize=5,\\ lrate=1,maxv=4,iters=20)

[20,18,0,12]

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

Вы можете следить за любыми ответами на эту запись через 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