Mário Marroquim

Mais um blog sobre Ruby, Rails, HTML5, CSS3, Jquery...

Ruby: Introdução à Regressão Logística e Redes Neurais

Estive estudando um pouco sobre inteligência artificial para uma apresentação aqui no trabalho. Coisa básica mesmo. Quis fazer uma abordagem prática e escolhi dois assuntos para exemplificar: Regressão Logística e Redes Neurais.

Achei uma excelente gem para realizar isso, o Ai4r. Para deixar ainda mais interessante, os arquivos de entrada para treinamento da aplicação são em Excel e as saídas também. Prático para o usuário final brincar um pouco. Para trabalhar com arquivos do Excel utilizei o RubyXL.

A seguir o Gemfile do projeto:

Gemfile
1
2
3
4
5
6
source 'https://rubygems.org'

gem "ai4r"
gem "nokogiri"
gem "zip"
gem "rubyXL"

Agora o código para ler o arquivo .xlsx (passado como parâmetro), coletar os dados históricos na primeira planilha desse arquivo e inferir resultados para dados em avaliação na segunda planilha. Aqui é feita uma regressão logística com árvore de decisão e algorítimo ID3. Leia mais aqui.

logical_regression.rb
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
#!/usr/bin/ruby

require "ai4r"
require "nokogiri"
require "zip"
require "rubyXL"

excel = RubyXL::Parser.parse ARGV.first
real_lines = excel.worksheets[0].extract_data

data_set = Ai4r::Data::DataSet.new data_items: real_lines[1..(real_lines.size - 1)],
                                   data_labels: real_lines.first

id3 = Ai4r::Classifiers::ID3.new.build data_set

test_worksheet = excel.worksheets[1]

test_lines = test_worksheet.extract_data

test_lines[1..(test_lines.size - 1)].each_with_index do |columns, index|
  new_value = id3.eval(columns[0..(columns.size - 2)])
  test_worksheet[index + 1][columns.size - 1].change_contents new_value
end

excel.write ARGV.first

Em seguida está uma lógica similar, mas usando uma rede neural Perceptron, com backpropagation. Leia mais aqui.

neural_network.rb
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
#!/usr/bin/ruby

require "ai4r"
require "nokogiri"
require "zip"
require "rubyXL"

excel = RubyXL::Parser.parse ARGV.first
real_lines = excel.worksheets[0].extract_data
real_columns = real_lines.first.size - 1

net = Ai4r::NeuralNetwork::Backpropagation.new [real_columns, real_columns, 1]

(real_lines.size*100).times do
  real_lines[1..(real_lines.size - 1)].each_with_index do |columns, index|
    net.train columns[0..(columns.size - 2)].collect{|i| i.to_i}, [columns.last.to_i]
  end
end

test_worksheet = excel.worksheets[1]

test_lines = test_worksheet.extract_data

test_lines[1..(test_lines.size - 1)].each_with_index do |columns, index|
  result = net.eval(columns[0..(columns.size - 2)].collect{|i| i.to_i}).first
  test_worksheet[index + 1][columns.size - 1].change_contents result
end

excel.write ARGV.first

Baixe um arquivo Excel de exemplo aqui. Nesse exemplo, temos dados para avaliação de renovação de seguro de carros. Lembrando que da forma como estão os dois algorítimos, o Excel pode ter quantas colunas (fatores influenciadores) você quiser. Depois coloco um exemplo para predição de jogos da megasena, rsrsrsrs.

Não deixe de visitar a página do projeto no Github.