1
resposta

Como classificar uma nova frase com o AdaBoostClassifier?

Uma dúvida meio "noob" aqui.

Fiz o meu código (logo abaixo) mas agora estou com uma dúvida: como testar uma nova frase com o modelo já treinando?

# Lendo o CSV e imprimindo na tela
from sklearn.ensemble import AdaBoostClassifier
from sklearn.naive_bayes import MultinomialNB
from sklearn.multiclass import OneVsOneClassifier
from sklearn.svm import LinearSVC
from sklearn.multiclass import OneVsRestClassifier
import pandas as pd
from collections import Counter
import numpy as np
from sklearn.model_selection import cross_val_score


classificacoes = pd.read_csv('bands.csv')
# print(classificacoes)


# Colocando os textos em uma variavel
textos = classificacoes['texto']
# print(textos)


# Transformando palavras em strings
# cada linha se refere a um array com
# cada uma das palavras #minusculas separadas
palavrasIsoladas = textos.str.lower().str.split()
# print(palavrasIsoladas)

# Criando um unico array com todas as palavras unicas (dicionario)
dicionario = set()
for lista in palavrasIsoladas:
    dicionario.update(lista)
# print(dicionario)
# imprime o total de palavras diferentes
totalDePalavras = len(dicionario)
# print(totalDePalavras)

# Associa cada palavra a uma posicao e armazena em um dicionario mapeado
palavraEposicao = dict(zip(dicionario, range(totalDePalavras)))
# print(palavraEposicao)

# Funcao que conta a presenca de cada palavra
# única presente no dicionario mapeado, no texto inteiro


def vetorizarPresencaPalavras(texto, palavraEposicao):
    vetor = [0] * len(palavraEposicao)
    for palavra in texto:
        if palavra in palavraEposicao:
            posicao = palavraEposicao[palavra]
            vetor[posicao] += 1
    return vetor


vetoresDeTexto = [vetorizarPresencaPalavras(
    texto, palavraEposicao) for texto in palavrasIsoladas]
# print(vetoresDeTexto)

# Associa o texto ao autor
autor = classificacoes['classificacao']

# Armazena o texto e os autores
x = np.array(vetoresDeTexto)
y = np.array(autor)
# Define porcentagem de Treino
porcentagem_de_treino = 0.8

# Define o Tamanho dos dados de treino, a partir da porcentagem de #treino
tamanho_de_treino = int(porcentagem_de_treino * len(y))

tamanho_de_validacao = len(y) - tamanho_de_treino

# Pega os dados de treino
treino_dados = x[0:tamanho_de_treino]
treino_marcacoes = y[0:tamanho_de_treino]

# Pega os dados de validacao
validacao_dados = x[tamanho_de_treino:]
validacao_marcacoes = y[tamanho_de_treino:]

# Funcao que Treina os dados


def predict(nome, modelo, treino_dados, treino_marcacoes):
    k = 10
    scores = cross_val_score(modelo, treino_dados, treino_marcacoes, cv=k)
    taxa_de_acerto = np.mean(scores)
    msg = "Taxa de acerto do {0}: {1}".format(nome, taxa_de_acerto)
    print(msg)
    return taxa_de_acerto


# Utilizando o classificador OneVsRest
resultados = {}
modeloOneVsRest = OneVsRestClassifier(LinearSVC(random_state=0))
resultadoOneVsRest = predict(
    "OneVsRest", modeloOneVsRest, treino_dados, treino_marcacoes)
resultados[resultadoOneVsRest] = modeloOneVsRest

# Utiliznado o classificador OneVsOne
modeloOneVsOne = OneVsOneClassifier(LinearSVC(random_state=0))
resultadoOneVsOne = predict(
    "OneVsOne", modeloOneVsOne, treino_dados, treino_marcacoes)
resultados[resultadoOneVsOne] = modeloOneVsOne

# Utilizando o classificador MultinomialNb
modeloMultinomial = MultinomialNB()
resultadoMultinomial = predict(
    "MultinomialNB", modeloMultinomial, treino_dados, treino_marcacoes)
resultados[resultadoMultinomial] = modeloMultinomial

# Utilizando o classificador Adaboost
modeloAdaBoost = AdaBoostClassifier()
resultadoAdaBoost = predict(
    "AdaBoostClassifier", modeloAdaBoost, treino_dados, treino_marcacoes)
resultados[resultadoAdaBoost] = modeloAdaBoost
1 resposta

Oii Paulo, tudo certinho por ai? Espero que sim!

Desculpa a demora em te dar um retorno por aqui.

Primeiramente, parabéns pela estrutura do seu código, você mandou muito bem ao usar comentários, pois eles auxiliam quando outras pessoas vão ver seu algoritmo.

Agora quando você quer testar seu modelo com uma nova frase ou com um novo conjunto de dados, você utiliza novamente a função predict, como já fez com os dados de treino, então usando como exemplo os dados de validação que você separou, ficaria desta forma:

# Utilizando o classificador Adaboost com os dados de validacao
modeloAdaBoost = AdaBoostClassifier()
resultadoAdaBoost = predict(
    "AdaBoostClassifier", modeloAdaBoost, validacao_dados, validacao_marcacoes)
resultados[resultadoAdaBoost] = modeloAdaBoost

Então depois você pode inserir um novo conjunto de dados, um csv novo com dados nunca vistos pelo modelo, e fazer uma divisão de dados e marcações também e utilizar da mesma forma, afim de ver a performance do modelo.

Caso queira saber mais sobre como salvar seu modelo para utilizar futuramente, recomendo a leitura deste tópico do fórum , onde explico para o aluno como ele pode salvar a rede com o método pickle. Outra sugestão de leitura é do tópico sobre quando submeter novos textos para o método predict.

Espero que tenha respondido sua dúvida e qualquer outro ponto, pode me chamar, tudo bem?

Bons estudos ^^

Caso este post tenha lhe ajudado, por favor, marcar como solucionado ✓. Bons Estudos!