Inteligencia Artificial y Ruby on Rails: Mejora la publicidad de tu web

7,184 views

Published on

Inteligencia Artificial en ruby on rails para optimizar automáticamente la publicidad de una aplicación.

Published in: Technology
0 Comments
5 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
7,184
On SlideShare
0
From Embeds
0
Number of Embeds
105
Actions
Shares
0
Downloads
175
Comments
0
Likes
5
Embeds 0
No embeds

No notes for slide

Inteligencia Artificial y Ruby on Rails: Mejora la publicidad de tu web

  1. 1. Inteligencia Artificial y Ruby on Rails: Mejora la publicidad de tu web Santiago Bel Sergio Espeja
  2. 2. Inteligencia Artificial <ul><li>“ La ciencia y la ingeniería de hacer las máquinas inteligentes &quot;, John McCarthy </li></ul><ul><li>Algoritmos que resuelven problemas inteligentes </li></ul>
  3. 3. Usos de la IA <ul><li>Planificación de procesos </li></ul><ul><li>Diagnosticar problemas </li></ul><ul><li>Interpretación de escritura manual </li></ul><ul><li>Lenguaje natural </li></ul><ul><li>Reconocimiento del habla </li></ul><ul><li>Reconocimiento facial </li></ul><ul><li>... </li></ul>
  4. 4. Métodos de IA <ul><li>IA Convencional: </li></ul><ul><ul><li>Sistemas expertos, redes bayesianas, ... </li></ul></ul><ul><li>Clasificadores: </li></ul><ul><ul><li>Redes neuronales, k-nearest neighbor algorithm, clasificador naive bayes, árboles de decisión, ... </li></ul></ul><ul><li>Inteligencia computacional: </li></ul><ul><ul><li>Sistemas de lógica difusa (fuzzy systems), algoritmos genéticos, ... </li></ul></ul>
  5. 5. Algoritmos genéticos aplicados a la publicidad
  6. 6. ¿y porqué algoritmos genéticos? <ul><li>Alguien nos dió la idea… </li></ul><ul><li>Hay artículos muy buenos del sector del marketing. </li></ul><ul><ul><li>Not-So-Mad Science: Genetic Algorithms and Web Page Design for Marketers , Matthew Syrett. (2005) </li></ul></ul><ul><ul><li>http://www.marketingprofs.com/5/syrett6.asp?part=2 </li></ul></ul>
  7. 7. Algoritmos genéticos <ul><li>Basados en la teoría de Darwin </li></ul><ul><li>Datos que evolucionan para encontrar de manera exacta o aproximada la solución óptima. </li></ul>Photo by John Mu http://www.flickr.com/people/ jm123467890 /
  8. 8. Definición académica <ul><li>A genetic algorithm (GA) is a search technique used in computing to find exact or approximate solutions to optimization and search problems . Genetic algorithms are categorized as global search heuristics . Genetic algorithms are a particular class of evolutionary algorithms (also known as evolutionary computation ) that use techniques inspired by evolutionary biology such as inheritance , mutation , selection , and crossover (also called recombination ). </li></ul><ul><li>Bla, bla, bla, … </li></ul>
  9. 9. Una definición más informal… <ul><li>http://www.youtube.com/watch?v=itgLHSZY6gE&feature=related </li></ul>
  10. 10. Aplicación del Algoritmo Genético <ul><li>Buscar la mejor combinación de banners que obtenga más clicks. </li></ul><ul><li>Hacerlo automáticamente sin supervisión humana. </li></ul>
  11. 11. Darwin’s Evolution Theory… <ul><li>Hay una población (conjunto de individuos) </li></ul><ul><li>Sólo los mejor adaptados sobreviven. </li></ul><ul><li>Individuos se combinan entre ellos apareciendo nuevas generaciones </li></ul><ul><li>La naturaleza provoca mutaciones, introduciendo así nuevas peculiaridades en la población </li></ul>
  12. 12. Requisitos del Algoritmo Genético <ul><li>Estructura de datos que representa al individuo. </li></ul><ul><li>¿cómo representamos las características de un individuo? </li></ul><ul><li>Función de fitness: </li></ul><ul><li>¿Cuándo un individuo es mejor que otro? </li></ul><ul><li>¿Cómo calculamos que se adapta mejor? </li></ul><ul><li>Función de recombinar </li></ul><ul><li>¿Cómo creamos nuevas generaciones a partir de la generación actual? </li></ul><ul><li>Función de mutar </li></ul><ul><li>¿Cómo introducimos nuevas peculiaridades en la población? </li></ul>
  13. 13. Ruby y Algoritmos Genéticos <ul><li>Gga4r, General Genetic Algorithms for Ruby </li></ul><ul><ul><li>http://gga4r.rubyforge.org/ </li></ul></ul><ul><ul><li>Sergio Espeja & Santiago Bel, 2007 </li></ul></ul><ul><li>Instalar la librería </li></ul>gem install gga4r
  14. 14. Representación del individuo <ul><li>Cada combinación de anuncios candidata es un individuo en nuestra población. </li></ul><ul><li>En nuestro ejemplo hay 4 slots para poner banners. </li></ul>1 2 4 3 <ul><li>Objectivo: </li></ul><ul><li>Conseguir la mejor combinación </li></ul>1 2 3 4 ad6 ad9 ad3 ad2
  15. 15. Persistencia en RoR
  16. 16. Representación del Individuo <ul><li>Clase combinación. </li></ul># id :integer # clicks :integer # impresiones_restantes :integer # mutaciones :integer # generaciones :integer # parejas :string # NUM_POSICIONES = 4 class Combinacion < ActiveRecord::Base has_many :posicion_anuncios serialize :parejas def click self.clicks += 1 self.update end def impresion self.impresiones_restantes -= 1 self.update end end <ul><li>Guardamos las combinaciones en la relación posicion_anuncios </li></ul><ul><li>Controlamos los clicks y las impresiones de cada combinación. </li></ul>
  17. 17. Función de fitness <ul><li>http://www.metacafe.com/watch/29815/rock_monster/ </li></ul>
  18. 18. Función de fitness <ul><li>En este caso una combinación de anuncios es mejor cuanto más elevado es su CTR (Click Through Ratio). </li></ul>class Combinacion < ActiveRecord::Base def fitness self.clicks.to_f/NUM_IMPRESIONES_COMBINACION.to_f end end
  19. 19. Función recombine <ul><li>http://www.youtube.com/watch?v=VUZbk9KddR4&feature=related </li></ul>
  20. 20. Función recombine <ul><li>Se decide una posición al azar en el vector. </li></ul><ul><li>Entonces los dos vectores combinados se mezclan dando 2 vectores de descendencia. </li></ul>Padres Hijos 1 2 3 4 5 X ad9 ad3 X ad7 1 2 3 4 5 X ad9 ad3 ad4 ad5 1 2 3 4 5 ad1 ad2 ad3 ad4 ad5 1 2 3 4 5 ad1 ad2 ad3 X ad7
  21. 21. Función recombine (II) def recombine(combinacion_2) cross_point = (rand * combinacion_2.posicion_anuncios.size-2).truncate+1 c1_a, c1_b = self.posicion_anuncios.separate(cross_point) c2_a, c2_b = combinacion_2.posicion_anuncios.separate(cross_point) lista_1 = c1_a + c2_b lista_2 = c2_a + c1_b hijo_1 = Combinacion.new hijo_2 = Combinacion.new NUM_POSICIONES.times do |pos| hijo_1.posicion_anuncios << PosicionAnuncio.create(:position => pos, :anuncio => lista_1[pos].anuncio) hijo_2.posicion_anuncios << PosicionAnuncio.create(:position => pos, :anuncio => lista_2[pos].anuncio) end hijo_1.save; hijo_2.save self.parejas ||= [] combinacion_2.parejas ||= [] self.parejas << combinacion_2.id combinacion_2.parejas << self.id self.update; combinacion_2.update return [hijo_1, hijo_2] end
  22. 22. Método Mutate <ul><li>Se escoge una posición aleatoria y se cambia su anuncio por otro al azar. </li></ul>def mutate mutate_point = (rand * NUM_POSICIONES).truncate anuncios = Anuncio.find :all self.mutaciones += 1 self.posicion_anuncios[mutate_point].anuncio = anuncios[(anuncios.size*rand).truncate] self.save end 1 2 3 4 5 ad5 ad9 ad3 ad2 ad7 1 2 3 4 5 ad5 ad9 ad3 ad1 ad7
  23. 23. Inicialización y ejecución <ul><li>Crear población inicial (mayoritariamente se hace al azar) </li></ul><ul><li>Crear el objeto GeneticAlgorithm con la población inicial </li></ul><ul><li>Ejecutar: </li></ul><ul><ul><li>Evolucionar y buscar los mejores individuos de la población. </li></ul></ul><ul><ul><li>Eliminar los que no obtengan buenos resultados. </li></ul></ul>
  24. 24. Crear la población inicial app/models/combinacion.rb class Combinacion < ActiveRecord::Base def self.create_random c = Combinacion.new c.impresiones_restantes = NUM_IMPRESIONES_COMBINACION anuncios = Anuncio.find :all NUM_POSICIONES.times do |pos| c.posicion_anuncios << PosicionAnuncio.create( :position => pos, :anuncio => anuncios[(anuncios.size*rand).truncate] ) end c.save return c end end app/controllers/application.rb @poblacion_actual = Array.new(NUM_COMBINACIONES_GENERACION).collect do Combinacion.create_random end
  25. 25. ¿ Cómo evolucionan los anuncios ?
  26. 26. Código de la evolución app/controllers/application.rb def escoge_combinacion @poblacion_actual = Combinacion.find :all # Si no existe ninguna combinación, creamos la población inicial @poblacion_actual = Array.new(NUM_COMBINACIONES_GENERACION).collect { Combinacion.create_random } if @poblacion_actual.empty? # Se elige una combinación al azar @combinacion = @poblacion_actual.select {|c| c.impresiones_restantes > 0}.shuffle!.first # Si no quedan combinaciones por mostrar, la población actual evoluciona a una nueva generación if @combinacion.nil? @poblacion_actual.each {|c| c.generaciones +=1 } @ga = GeneticAlgorithm.new( @poblacion_actual, {:p_combination => 1.0, :p_mutation => 0.1, :max_population => NUM_COMBINACIONES_GENERACION} ) @ga.evolve @extinguidos = @poblacion_actual - @ga.generations[-1] @extinguidos.each {|e| e.destroy} @poblacion_actual = @ga.generations[-1] @poblacion_actual.each do |c| c.clicks = 0 c.impresiones_restantes = NUM_IMPRESIONES_COMBINACION c.update end @combinacion = @poblacion_actual.select {|c| c.impresiones_restantes > 0}.shuffle!.first end @combinacion.impresion end
  27. 27. ¿Qué falta? <ul><li>Contar los clicks </li></ul>app/controllers/application.rb def cuenta_clicks @posicion_anuncio = PosicionAnuncio.find params[:id] @posicion_anuncio.combinacion.click redirect_to @posicion_anuncio.anuncio.url end <ul><li>Elegir la combinación en cada impresión </li></ul>app/controllers/[controladores con vistas que muestren publicidad] before_filter :escoge_combinacion, :except => &quot;cuenta_clicks&quot;
  28. 28. ¿Y en las vistas? app/helpers/application_helper.rb def pinta_banner(posicion, orientacion) imagen_path = if orientacion.downcase == &quot;h“ @combinacion.posicion_anuncios[posicion-1].anuncio.banner_h else @combinacion.posicion_anuncios[posicion-1].anuncio.banner_v end link_to image_tag(imagen_path), :action => &quot;cuenta_clicks&quot;, :id => @combinacion.posicion_anuncios[posicion-1] end app/views/[vistas que muestren publicidad] <%= pinta_banner 4, &quot;h&quot; %>
  29. 29. Simulación <ul><li>www.publievo.com </li></ul><ul><li>www.publievo.com/combinaciones </li></ul>
  30. 30. … o queréis más? ¿Preguntas …
  31. 31. Clasificador Naïve Bayes <ul><li>Aplica la regla de Bayes asumiendo variables independientes. </li></ul><ul><li>Las clases deben ser conocidas </li></ul><ul><li>Necesita entrenamiento </li></ul>Photo by Aya Walraven Otake http://www.flickr.com/people/ayalan/
  32. 32. Ruby y los clasificadores Bayesianos <ul><li>Instalar la librería </li></ul>gem install classifier <ul><li>Ruby Classifier - Bayesian and LSI classification library </li></ul><ul><ul><li>http://classifier.rubyforge.org/ </li></ul></ul><ul><ul><li>Lucas Carlson , David Fayram II . </li></ul></ul>
  33. 33. Ejemplo de Naïve Bayes: <ul><li>Servicio de atención al cliente de un servicio de hospedaje web. </li></ul><ul><li>Dependiendo del asunto del email, enviar a: </li></ul><ul><ul><li>Departamento Técnico </li></ul></ul><ul><ul><li>Departamento Comercial </li></ul></ul><ul><li>Necesitamos un grupo de entrenamiento con asuntos ya clasificados como “Técnico” o “Comercial” </li></ul>
  34. 34. Vamos a trabajar (I) <ul><li>Crear el clasificador </li></ul>require 'rubygems' require 'stemmer' require 'classifier' # Create the classifier classifier = Classifier::Bayes.new('Technical', 'Commercial')
  35. 35. Grupos de entrenamiento (I) <ul><li>Grupo comercial </li></ul>commercial = [&quot;I already payed this invoice.&quot;, &quot;Do you have any discount for 1 year contract?&quot;, &quot;Do you have discounts?&quot;, &quot;Do you have any affiliate schema?&quot;, &quot;This is my new VISA no&quot;, &quot;I cannot see my invoices&quot;, &quot;When is finishing my free period?&quot;, &quot;I have a friend that is interested in your services, will you make us any offer?&quot;, &quot;I didn't use your services last mont. I shouldn't be charged&quot;, &quot;Do you have any kind of warranty?&quot;, &quot;Is it possible to freeze my account and continue after holidays?&quot;, &quot;I don't want to continue with your services.&quot;, &quot;Great service! Can I upgrade my account?&quot;, &quot;Where are the differences between shared and private hosting?&quot;]
  36. 36. Grupos de entrenamiento (II) <ul><li>Grupo técnico </li></ul>technician = [&quot;I have limit of quoata exceeded and I cannot see my mail.&quot;, &quot;Is your ftp server working correctly?&quot;, &quot;My mails get delayed too much when my php application sends them.&quot;, &quot;I cannot read my mail&quot;, &quot;I cannot connect to the ftp server.&quot;, &quot;I cannot upload to the ftp server&quot;, &quot;My rails application is not working in your server.&quot;, &quot;Can I use background processes in the shared hosting?&quot;, &quot;Can I install this gem?&quot;, &quot;My php app is not working&quot;, &quot;Can you setup a ssl cert for me please?&quot;, &quot;I cannot connect to my server.&quot;, &quot;How can I connect to subversion?&quot;]
  37. 37. Vamos a trabajar (II) <ul><li>Entrenar el clasificador </li></ul># Train the classifier technician.each { |technician| classifier.train_Technical technician } commercial.each { |commercial| classifier.train_Commercial commercial }
  38. 38. Ya está listo! <ul><li>Listo para usar. ¿Magia? </li></ul>puts classifier.classify &quot;How can I connect to my ftp account?“ -> Technical puts classifier.classify &quot;Is a private account better?“ -> Commercial puts classifier.classify &quot;Do you have available rails framework?“ -> Technical puts classifier.classify &quot;How much is your shared hosting for a whole year?&quot; -> Commercial puts classifier.classify &quot;I didn't get my discount in the last invoice. Is there something wrong?&quot; -> Commercial puts classifier.classify &quot;Connection Timeout in my ftp connections“ -> Technical puts classifier.classify &quot;Which is my email outgoing server?“ -> Technical
  39. 39. Conclusiones… <ul><li>No hay que tener miedo de los algoritmos de Inteligencia Artificial (al menos por ahora) </li></ul><ul><li>Pensadlo, pueden mejorar increíblemente vuestras aplicaciones web con muy poca dedicación. </li></ul><ul><li>Es muy fácil de usar. </li></ul><ul><li>Las aplicaciones de la IA son más que la detección de SPAM. </li></ul>
  40. 40. ¿Preguntas?
  41. 41. ¡Gracias! Código y más información en bee.com.es

×