A aprendizagem automática é uma ferramenta que está ajudando os desenvolvedores e cientistas de dados a realizar todos os tipos de tarefas:
-
Classificação - organizar e marcar dados
-
Regressão - encontrar relações entre pontos de dados
-
Previsão - usar dados atuais para prever o futuro
-
Detecção de anomalias - encontre pontos de dados incomuns
Neste post, mostrarei como você pode combinar a API REST baseada na Web que o Nexosis fornece para aprendizado de máquina com o Couchbase Server.
O primeiro lugar a ser visitado ao experimentar o aprendizado de máquina é geralmente o Kaggle. O Kaggle oferece uma grande variedade de conjuntos de dados perfeitos para aplicativos de aprendizado de máquina. Decidi usar o Conjunto de dados da Amazon Reviews for Sentiment Analysis (Eu tenho truncado e ligeiramente modificado para esta postagem).
Os dados desse conjunto contêm o texto de uma avaliação deixada na Amazon e um rótulo de "__label__1" ou "__label__2". O primeiro significa que foi uma avaliação negativa (1 ou 2 estrelas) e o segundo significa que foi uma avaliação positiva (4 ou 5 estrelas). A pontuação 3 é considerada neutra e não está incluída nesse conjunto de treinamento, mas vou explorar isso um pouco mais tarde.
Meu objetivo é dar à Nexosis uma avaliação da Amazon que seja não no conjunto de treinamento e fazer com que o Nexosis o classifique como "__label__1" ou "__label__2" para mim. Esse tipo de classificação também é conhecido como análise de sentimentos. Isso pode ser útil para alertar antecipadamente sobre uma experiência negativa do cliente, por exemplo.
Crie sua conta de aprendizado de máquina Nexosis
Achei muito fácil começar a usar Nexosis. A edição comunitária do O Nexosis é gratuito. Depois de fazer login, acesse sua página de perfil e anote sua chave de API (você precisará dela para cada solicitação de API que fizer).
A partir de agora, ao fazer uma solicitação HTTP para o Nexosis, você precisará incluir essa chave em seu cabeçalho como chave da API
.
Configuração do aprendizado de máquina
A primeira etapa para configurar o Nexosis é fornecer a ele um conjunto de dados. Estou usando o conjunto de dados que obtive do Kaggle. Os dados são um arquivo CSV de duas colunas. Para obter esses dados para o Nexosis, você pode fazer uma solicitação como esta (usando uma ferramenta como o Postman, por exemplo):
1 2 3 4 5 6 |
POST https://ml.nexosis.com/v1/imports/url { "dataSetName" : "AmazonReviews", "url" : "https://raw.githubusercontent.com/couchbaselabs/blog-source-code/master/Groves/101MachineLearningNexosis/src/modified5000.csv" } |
Não se esqueça da chave API no cabeçalho!
A resposta dessa solicitação, se bem-sucedida, deve ser semelhante a esta:
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 |
{ "importId": "", "tipo": "url", "status": "solicitado", "dataSetName": "AmazonReviews", "parâmetros": { "url": "https://raw.githubusercontent.com/" }, "requestedDate" (data solicitada): "2018-02-19T19:04:13.012859+00:00", "statusHistory": [ { "data": "2018-02-19T19:04:13.012859+00:00", "status": "solicitado" } ], "mensagens": [], "colunas": {}, "links": [ { "rel": "self", "href": "https://ml.nexosis.com/v1/imports/url" }, { "rel": "dados", "href": "https://ml.nexosis.com/v1/data/AmazonReviews" } ] } |
Essa importação pode demorar um pouco. Você pode fazer uma solicitação GET para https://ml.nexosis.com/v1/imports para verificar se a solicitação foi concluída. Você verá esse conjunto de dados como um dos "itens".
Criação de uma sessão Nexosis
A próxima etapa é criar uma sessão do Nexosis. Isso iniciará o treinamento do Nexosis nos dados que você já importou. Aqui está um exemplo de POST para iniciar uma sessão:
1 2 3 4 5 6 7 |
POST https://ml.nexosis.com/v1/sessions/model { "predictionDomain" (domínio de previsão):"classificação", "dataSourceName" : "AmazonReviews", "targetColumn" (coluna de destino): "review_sentiment", "extraParameters" : { "saldo": verdadeiro } } |
Algumas observações sobre o significado de tudo isso:
-
"predictionDomain": "classification" (domínio de previsão)
- Lembra quando eu disse que usaria a "classificação" para a análise de sentimentos? -
"dataSourceName" : "AmazonReviews"
- Dei esse nome à fonte de dados, portanto, estou dizendo a ela para usar essa fonte de dados para treinamento. -
"targetColumn": "review_sentiment"
- A coluna "review_sentiment" contém os valores "__label__1" ou "__label__2". Esse é o valor que eu quero que o Nexosis aprenda a gerar. -
"extraParameters" : { "balance": true }
- Se o seu conjunto de dados for desequilibrado (o que significa, por exemplo, que ele contém muito mais avaliações negativas do que positivas), isso poderá influenciar desproporcionalmente o aprendizado de máquina. Defina o equilíbrio como "true" (verdadeiro) para ajustar isso.
A resposta dessa solicitação será semelhante a esta:
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 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 |
{ "colunas": { "texto": { "dataType": "texto", "função": "recurso" }, "review_sentiment": { "dataType": "string", "função": "alvo", "imputação": "mode" (modo), "agregação": "mode" (modo) } }, "sessionId": "", "tipo": "model" (modelo), "status": "solicitado", "predictionDomain" (domínio de previsão): "classificação", "availablePredictionIntervals" (intervalos de previsão disponíveis): [], "requestedDate" (data solicitada): "2018-02-19T19:28:41.812052+00:00", "statusHistory": [ { "data": "2018-02-19T19:28:41.812052+00:00", "status": "solicitado" } ], "extraParameters": { "saldo": verdadeiro }, "mensagens": [], "name" (nome): "Classificação na AmazonReviews", "dataSourceName": "AmazonReviews", "dataSetName": "AmazonReviews", "targetColumn" (coluna de destino): "review_sentiment", "isEstimate": falso, "links": [ { "rel": "resultados", "href": "https://ml.nexosis.com/v1/sessions//results" }, { "rel": "dados", "href": "https://ml.nexosis.com/v1/data/AmazonReviews" }, { "rel": "vocabularies" (vocabulários), "href": "https://ml.nexosis.com/v1/vocabulary?createdFromSessionid=" } ] } |
Observe que esse tipo de sessão levará algum tempo para ser produzido. Você receberá uma notificação por e-mail da Nexosis quando a sessão estiver pronta. Você também pode verificar os "resultados" (consulte o URL acima) de tempos em tempos.
Modelo concluído
Quando a sessão for concluída, você receberá um modelId
nos resultados, esse será outro GUID. Você precisará dele para prosseguir.
Depois de receber o modelId, você pode verificar a precisão do modelo. Faça um GET para https://ml.nexosis.com/v1/sessions//results e veja o métricas
campo. Os resultados para o meu são os seguintes:
1 2 3 4 5 6 7 8 |
"métricas": { "macroAverageF1Score": 0.81341486902927584, "rocAreaUnderCurve": 0.88777613666838784, "precisão": 0.814, "macroAveragePrecision": 0.81521331769769212, "macroAverageRecall": 0.81309365130828448, "matthewsCorrelationCoefficient": 0.62830339352567144 }, |
Isso permitirá que você saiba o quão confiável é o modelo. Se não for alto o suficiente para qualquer limite que você decidir precisar, talvez seja necessário tentar ajustar o modelo
para obter melhor precisão. Você pode considerar a adição/remoção de campos do conjunto de treinamento até atingir o limite necessário.
Ainda assim, não será perfeito, portanto, se essa análise for usada para algo crucial e de alto impacto, talvez seja melhor envolver um ser humano em alguma parte do processo.
A precisão do 81% é suficiente para eu prosseguir.
Teste o modelo de aprendizado de máquina
Vamos testar o modelo com REST. Farei uma solicitação POST para o arquivo /prever url usando o modelId como:
POST https://ml.nexosis.com/v1/models//predict
O corpo dessa solicitação conterá a avaliação da Amazon sobre a qual desejo obter a opinião da Nexosis. Darei a ela o texto de uma avaliação de 1 estrela.
1 2 3 4 5 6 7 8 |
{ "dados":[{ "texto" : "Lixo! Não desperdice seu dinheiro! ... Funcionou muito bem por cerca de duas semanas e depois piorou progressivamente nas quatro semanas seguintes, até que agora mal funciona" }], "extraParameters" :{ "includeClassScores" : falso } } |
Ao enviar isso, o Nexosis pensará sobre o assunto e retornará um resultado como este:
1 2 3 4 5 6 7 8 9 10 |
{ "dados": [ { "texto": "Lixo! Não desperdice seu dinheiro! ... Funcionou muito bem por cerca de duas semanas e depois piorou progressivamente nas quatro semanas seguintes, até que agora mal funciona", "review_sentiment": "__label__1" } ], // ... etc ... } |
Isso significa duas coisas:
-
O modelo está funcionando bem!
-
A avaliação que acabei de enviar é provavelmente uma avaliação negativa. Lendo-a eu mesmo, tenho que concordar.
Uso do Nexosis no Couchbase
Em vez de criar essas solicitações POST manualmente, podemos usar o Nexosis diretamente no Couchbase.
Observação: o Nexosis não exige o Couchbase e vice-versa. O Nexosis simplesmente expõe uma API REST JSON e o Couchbase é capaz de usá-la. Eles funcionam bem juntos porque ambos seguem padrões comuns da Web.
Para usar o Nexosis no Couchbase, basta fazer solicitações CURL para a API do Nexosis a partir de uma consulta N1QL do Couchbase.
Permitir CURL no Couchbase
Primeiro, você precisa configurar o couchbase para permitir que ele faça CURL solicitações. Permitir qualquer solicitação CURL arbitrária seria um risco de segurança, portanto, você precisará optar por permitir determinadas solicitações. Para fazer isso, crie (ou atualize) um arquivo curl_whitelist.json. Confira CURL chega ao N1QL para obter mais detalhes.
Aqui está o arquivo curl_whitelist.json que estou usando. No Windows, esse arquivo vai para o diretório C:\Arquivos de programas\Couchbase\Server\var\lib\couchbase\n1qlcerts
pasta.
1 2 3 4 5 |
{ "all_access":falso, "allowed_urls":["https://ml.nexosis.com/v1/models//predict "], "disallowed_urls":[] } |
Criação de uma consulta N1QL
N1QL é a implementação SQL do Couchbase usada para consultar JSON. Em última análise, você pode querer que o Nexosis alimente os comandos UPDATE ou INSERT. Mas, para este post, vou usar apenas um SELECT.
No Couchbase, criei um bucket com algumas avaliações que extraí manualmente da Amazon. (Também executei CREATE PRIMARY INDEX on reviews
).
Eles não faziam parte dos dados de treinamento, portanto, o Nexosis dará uma pontuação de sentimento positivo ou negativo por conta própria.
Vamos começar com um simples SELECIONAR
e construir a partir daí.
Usando o CURL para trazer a aprendizagem automática
Em seguida, vou usar o CURL. Estou usando o LET para tornar a consulta mais legível.
1 2 3 4 5 6 7 8 |
SELECIONAR CURL(url, { "cabeçalho": cabeçalhos, "dados": corpo, "request" (solicitação):requestType}) AS nexose DE revisões r LET url = 'https://ml.nexosis.com/v1/models//predict', cabeçalhos = ["Content-Type: application/json", "api-key: "], corpo = '{"data": [{"text": "' || r.texto || '" }], "extraParameters": {"includeClassScores": false }}', requestType = "POST"; |
Observe que o corpo
está extraindo o texto diretamente do documento de revisão no Couchbase. A única coisa que selecionei (até agora) é a resposta completa do Nexosis, que é semelhante a esta:
Eu poderia detalhar ainda mais os resultados do Nexosis e colocá-los lado a lado com a pontuação real da Amazon para ver como o Nexosis se saiu. Aqui está a consulta:
1 2 3 4 5 6 7 8 |
SELECIONAR r.real, r.texto, CURL(url, { "cabeçalho": cabeçalhos, "dados": corpo, "request" (solicitação):requestType}).dados[0].sentimento_de_revisão AS nexose DE revisões r LET url = 'https://ml.nexosis.com/v1/models//predict', cabeçalhos = ["Content-Type: application/json", "api-key: "], corpo = '{"data": [{"text": "' || r.texto || '" }], "extraParameters": {"includeClassScores": false }}', requestType = "POST"; |
E aqui estão os resultados (trunquei o texto completo):
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
[ { "real": 1, "nexosis": "__label__1", "texto": "Lixo! Não desperdice seu dinheiro..." }, { "real": 5, "nexosis": "__label__2", "texto": "Esta é a melhor coisa desde o pão fatiado..." }, { "real": 3, "nexosis": "__label__1", "texto": "O RC mais confuso que eu já vi..." } ] |
Resultados
Como era de se esperar, o Nexosis pegou a avaliação de 1 estrela da Amazon e percebeu corretamente que se tratava de uma avaliação negativa (classificou-a como "__label__1").
Ele também pegou a avaliação de 5 estrelas e percebeu corretamente que se tratava de uma avaliação positiva (classificou-a como "__label__2").
Também decidi dar a ele uma avaliação "neutra" de 3 estrelas. Observe que o conjunto de treinamento não tinha nenhuma dessas avaliações, portanto, isso pode não ser válido, mas eu estava curioso. Ele a classificou como uma avaliação negativa. Apenas com base na linguagem, isso provavelmente é correto. Na verdade, essa pode ser uma ferramenta útil para analisar avaliações aparentemente "neutras" e discernir se elas estão se inclinando para um lado ou para o outro.
Resumo
Sempre que você usar CURL no N1QL, tenha cuidado. Ao usar o CURL, você está colocando sua consulta à mercê de uma solicitação HTTP para terceiros. Talvez você queira executá-las em segundo plano como um processo em lote para ATUALIZAÇÃO
e INSERIR
em vez de um SELECIONAR
como eu estou fazendo.
Mas se você usar o CURL com sabedoria, poderá usar uma ferramenta de terceiros, como o Nexosis, para realizar aprendizado de máquina, categorização, análise de sentimentos e muito mais. O Nexosis facilitou muito o meu início e é muito fácil de usar com um comando CURL padrão.
Se você estiver interessado no Nexosis, dê uma olhada no site Casos de uso da Nexosis para ver como o Nexosis pode ajudar você ou sua empresa. Se você tiver dúvidas sobre o uso do Nexosis, consulte a página Fóruns Nexosis.
Tem alguma dúvida sobre o Couchbase? Dê uma olhada na seção Fóruns do Couchbasee confira o Fórum N1QL se você tiver alguma dúvida sobre as consultas apresentadas nesta postagem.
Tem alguma pergunta para mim? Estou à disposição Twitter @mgroves.