JavaRush /Blogue Java /Random-PT /Aprendizado de máquina para desenvolvedores Java, parte 1...

Aprendizado de máquina para desenvolvedores Java, parte 1

Publicado no grupo Random-PT
Configure um algoritmo de aprendizado de máquina e desenvolva sua primeira função preditiva usando Java. Carros autônomos, sistemas de reconhecimento facial e assistentes de voz são todos desenvolvidos usando tecnologias e estruturas de aprendizado de máquina. E esta é apenas a primeira onda. Nos próximos 10 anos, uma nova geração de produtos transformará o nosso mundo, dando origem a novas abordagens para o desenvolvimento de programas, produtos e aplicações. Aprendizado de máquina para desenvolvedores Java, parte 1 a 1Como programador Java, você quer aproveitar essa onda agora que as empresas de tecnologia estão começando a investir pesadamente em aprendizado de máquina. O que você aprende hoje poderá usar nos próximos cinco anos. Mas por onde começar? Este artigo pretende responder a esta questão. Você terá uma primeira impressão dos princípios do aprendizado de máquina seguindo nosso breve guia para implementar e preparar um algoritmo de aprendizado de máquina. Depois de aprender sobre a estrutura de um algoritmo de aprendizagem e os recursos que você pode usar para treiná-lo, avaliá-lo e selecionar a função que fornece a melhor precisão de previsão, você entenderá como usar a estrutura JVM (Weka) para construir soluções de aprendizado de máquina. Este artigo enfoca o aprendizado de máquina supervisionado porque é o princípio mais comumente usado no desenvolvimento de aplicativos inteligentes.

Aprendizado de máquina e inteligência artificial

O aprendizado de máquina evoluiu a partir do campo da inteligência artificial, que visa criar máquinas que possam imitar a inteligência humana. Embora o termo “aprendizado de máquina” tenha se originado na ciência da computação, a inteligência artificial não é um novo campo da ciência. O teste de Turing , desenvolvido pelo matemático Alan Turing no início dos anos cinquenta do século XX, é um dos primeiros testes concebidos para determinar se uma máquina de computação possui inteligência verdadeira. De acordo com o teste de Turing, uma máquina de computação comprova a presença da inteligência humana ao se passar por uma pessoa sem que esta perceba que está falando com a máquina.
Aprendizado de máquina para desenvolvedores Java, parte 1 a 2
Muitas abordagens populares de aprendizado de máquina hoje são baseadas em ideias que já existem há décadas. Mas a última década na computação (e nas plataformas de computação distribuída) trouxe poder suficiente para aplicar algoritmos de aprendizado de máquina. A maioria deles requer uma grande quantidade de multiplicação de matrizes e outros cálculos matemáticos. Há vinte anos, as tecnologias informáticas que permitiam tais cálculos simplesmente não existiam, mas agora tornaram-se uma realidade. Algoritmos de aprendizado de máquina permitem que os programas realizem o processo de melhoria da qualidade e expandam suas capacidades sem intervenção humana. Um programa desenvolvido com aprendizado de máquina é capaz de atualizar ou estender de forma independente seu próprio código.

Aprendizagem supervisionada versus aprendizagem não supervisionada

O aprendizado supervisionado e não supervisionado são as duas abordagens mais populares de aprendizado de máquina. Ambas as opções exigem alimentar a máquina com enormes quantidades de registros de dados para construir relacionamentos e aprender. Esses dados coletados são geralmente chamados de "vetor de características" . Por exemplo, temos um determinado edifício residencial. Nesse caso, o vetor de características pode conter características como: a área total da casa, a quantidade de cômodos, o ano de construção da casa e assim por diante. No aprendizado supervisionado , um algoritmo de aprendizado de máquina é treinado para responder questões relacionadas a vetores de recursos. Para treinar o algoritmo, ele é alimentado com um conjunto de vetores de características e rótulos associados. A etiqueta associada é fornecida por uma pessoa (o professor) e contém a “resposta” correta à pergunta feita. O algoritmo de aprendizagem analisa vetores de recursos e rótulos corretos para encontrar a estrutura interna e os relacionamentos entre eles. Dessa forma a máquina aprende a responder as perguntas corretamente. Como exemplo, podemos considerar um determinado aplicativo inteligente para negociação imobiliária. Ele pode ser treinado usando um vetor de características incluindo tamanho, número de quartos e ano de construção para um conjunto de casas. Uma pessoa deve atribuir a cada casa uma etiqueta com o preço correto da casa com base nesses fatores. Ao analisar estes dados, uma aplicação inteligente deve treinar-se para responder à pergunta: “Quanto dinheiro posso conseguir por esta casa?”
Interessado em ler sobre Java? Junte-se ao grupo de desenvolvedores Java !
Uma vez concluído o processo de preparação, os novos dados de entrada não serão mais marcados. A máquina deve ser capaz de responder perguntas corretamente, mesmo para vetores de características desconhecidos e não rotulados. Na aprendizagem não supervisionada, o algoritmo é projetado para prever respostas sem rotulagem humana (ou mesmo sem fazer perguntas). Em vez de determinar um rótulo ou resultado, os algoritmos de aprendizagem não supervisionados usam grandes conjuntos de dados e poder computacional para descobrir relações anteriormente desconhecidas. Por exemplo, no marketing de produtos de consumo, a aprendizagem não supervisionada pode ser usada para identificar relações ocultas ou agrupamentos de clientes, o que pode, em última análise, ajudar a melhorar o programa de marketing ou a criar um novo. Neste artigo, focaremos no aprendizado de máquina supervisionado; esta é atualmente a abordagem mais comumente usada.

Aprendizado de máquina supervisionado

Todo aprendizado de máquina é baseado em dados. Para um projeto de aprendizado de máquina supervisionado, você precisa marcar os dados com marcadores de uma forma que forneça respostas significativas à pergunta feita. Abaixo, na Tabela 1, cada registro de informações da casa é rotulado como “preço da casa”. Ao identificar a relação entre os dados registados e o preço de uma casa, o algoritmo deverá eventualmente ser capaz de prever o preço de mercado das casas não incluídas na lista fornecida. (Tenha em atenção que a área da casa está indicada em metros quadrados e o preço da casa está em euros).
Tabela 1. Lista de casas
Sinal Sinal Sinal Rótulo
Área da casa Número de quartos Idade da casa Preço esperado da casa
90 m2/295 pés 2 quartos 23 anos 249.000€
101 m2/331 pés 3 quartos n / D 338.000€
1.330 m2/4.363 pés 11 quartos 12 anos 6.500.000€
Nos estágios iniciais, você provavelmente rotulará os dados manualmente, mas eventualmente ensinará seu programa a fazer isso sozinho. Você provavelmente já viu essa abordagem funcionar com clientes de e-mail, onde, para mover um e-mail para a pasta Spam, você responde à pergunta "Este e-mail é spam?" Ao responder, você treina o programa para reconhecer e-mails que não deseja ver. O filtro de spam do aplicativo é treinado para marcar mensagens da mesma fonte ou contendo o mesmo conteúdo e gerenciá-las de acordo com as regras apropriadas. Os conjuntos de dados rotulados são necessários apenas para fins de preparação e teste. Assim que esta etapa for concluída, o algoritmo de aprendizado de máquina funciona nos dados não rotulados. Por exemplo, você pode alimentar um algoritmo de previsão com um registro novo e não rotulado de dados sobre uma casa, e ele deverá prever automaticamente o preço esperado da casa com base no “conhecimento” obtido a partir dos dados preparatórios.

Como uma máquina aprende a prever

O desafio do aprendizado de máquina supervisionado é encontrar a função de previsão apropriada para uma determinada questão. Matematicamente, a dificuldade é encontrar uma função que receba uma variável como entrada хe retorne o valor previsto у. Essa função das hipóteses (hθ)é resultado de um processo de preparação. Freqüentemente, a função de hipótese também é chamada de função objetivo ou função de predição.
y =hθ ( x)
Na maioria dos casos, хé uma matriz de dados. No nosso exemplo, trata-se de um conjunto bidimensional de elementos que definem uma casa, composto pelo número de quartos e pela área da casa. Uma matriz desses valores é um vetor de recursos. Ao especificar uma função objetivo específica, podemos usá-la para prever cada vetor de características х. Para prever o preço de uma casa, você deve chamar a função objetivo usando um vetor de características {101.0, 3.0}composto pela área da casa e pelo número de cômodos:
// целевая функция h (результат процесса обучения)
Function<Double[], Double> h = ...;

// определяем целевой вектор с площадью дома=101 и количеством комнат=3
Double[] x = new Double[] { 101.0, 3.0 };

// и предсказываем цену дома (метка)
double y = h.apply(x);
No código-fonte do Exemplo 1, os valores na matriz хrepresentam um vetor de características da casa. O valor уretornado pela função objetivo é o preço previsto da casa. O objetivo do aprendizado de máquina é determinar a função objetivo que funcionará com a maior precisão possível, dados parâmetros de entrada desconhecidos. No aprendizado de máquina, a função objetivo (hθ)às vezes é chamada de modelo. Este modelo é o resultado de um processo de aprendizagem.
Aprendizado de máquina para desenvolvedores Java, parte 1 a 3
Com base em amostras de treinamento rotuladas, o algoritmo de aprendizagem procura estruturas ou padrões nos dados de treinamento. Portanto, ele constrói um modelo que geralmente é bom para os dados. Via de regra, o processo de aprendizagem é de natureza exploratória. Na maioria dos casos, o processo é repetido muitas vezes usando diferentes variantes de algoritmos e configurações de aprendizagem. Como resultado, todos os modelos são avaliados com base em métricas de desempenho, dentre as quais é selecionado o melhor. E este modelo é usado para calcular valores estimados para dados futuros não marcados.

Regressão linear

Para ensinar uma máquina a “pensar”, primeiro você precisa escolher o algoritmo de aprendizagem que usará. Por exemplo, regressão linear. Este é um dos algoritmos de aprendizado de máquina supervisionado mais simples e populares. O algoritmo assume que a relação entre recursos de entrada e marcadores de resultado é linear. A função de regressão linear geral abaixo retorna o valor previsto somando todos os elementos do vetor de características multiplicados pelo parâmetro θ (teta) . Este parâmetro é utilizado durante o processo de treinamento para adaptar ou “ajustar” a função de regressão com base nos dados de treinamento.
h θ (x) = θ 0 * 1 + θ 1 * x 1 + ... θ n * x n
Em uma função de regressão linear, o parâmetro teta e os parâmetros de recurso são numerados com subscritos. O subscrito determina a posição do parâmetro (θ)e do parâmetro de recurso (х)no vetor. Observe que o recurso x 0 é um termo de deslocamento constante e é significativo 1para fins computacionais. Como resultado, o índice de parâmetros significativos, como a área da casa, começa com x 1 . Portanto, se for atribuído a x 1 o primeiro valor do vetor de características (área da casa), então x 2 assumirá o próximo valor (número de quartos) e assim por diante. O Exemplo 2 demonstra a implementação Java da função de regressão linear, denotada matematicamente como h θ (x). Para simplificar, os cálculos são realizados usando o double. No método apply(), está previsto que o primeiro elemento do array será igual a 1,0 e será definido fora desta função. Exemplo 2: Regressão Linear em Java
public class LinearRegressionFunction implements Function<Double[], Double> {
 private final double[] thetaVector;

 LinearRegressionFunction(double[] thetaVector) {
 this.thetaVector = Arrays.copyOf(thetaVector, thetaVector.length);
 }

 public Double apply(Double[] featureVector) {
 // с целью упрощения вычислений первый элемент должен быть equals 1.0
 assert featureVector[0] == 1.0;

 // простое последовательное сложение
 double prediction = 0;
 for (int j = 0; j < thetaVector.length; j++) {
 prediction += thetaVector[j] * featureVector[j];
 }
 return prediction;
 }

 public double[] getThetas() {
 return Arrays.copyOf(thetaVector, thetaVector.length);
 }
}
Para criar uma nova instância LinearRegressionFunction, você precisa especificar o parâmetro θ. Este parâmetro ou vetor é usado para adaptar a função de regressão linear geral aos dados de treinamento subjacentes. O parâmetro θutilizado no programa será ajustado durante o processo de treinamento, com base em exemplos de treinamento. A qualidade da função alvo treinada dependerá da qualidade dos dados preparados para treinamento. No exemplo abaixo usamos LinearRegressionFunctionprevisões de preços com base no tamanho da casa para ilustrar. Considerando que x 0 deve ser uma constante com valor 1,0, a função objetivo é inicializada utilizando dois parâmetros θ, onde são o resultado do processo de aprendizagem. Após a criação de um novo exemplo, o preço de uma casa com área de 1330 metros quadrados será previsto conforme mostrado abaixo:
// тета вектор, используемый в этом примере, является результатом процесса обучения
double[] thetaVector = new double[] { 1.004579, 5.286822 };
LinearRegressionFunction targetFunction = new LinearRegressionFunction(thetaVector);

// создание вектора признаков со значениями x0=1 (для удобства вычислений) и //x1=площадь дома
Double[] featureVector = new Double[] { 1.0, 1330.0 };

// выполняем расчеты
double predictedPrice = targetFunction.apply(featureVector);
Na figura abaixo você pode ver o gráfico da função objetivo de predição (linha azul). É obtido calculando a função objetivo para todos os valores da área da casa. O gráfico também contém pares de áreas de preço usados ​​para treinamento.
Aprendizado de máquina para desenvolvedores Java, parte 1 a 4
No momento, o gráfico de previsão parece muito bom. As coordenadas do gráfico (posição e inclinação) são determinadas pelo vetor θ { 1.004579, 5.286822 }. Mas como você pode determinar qual θvetor é mais adequado para sua aplicação? A função se ajustará melhor se você alterar o primeiro ou talvez o segundo parâmetro? Para determinar o vetor teta mais adequado, você precisa de uma função de utilidade que avalie quão bem a função objetivo executa o trabalho. CONTINUA Tradução do inglês. Autor: Gregor Roth, arquiteto de software, JavaWorld.
Comentários
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION