Solucionado (ver solução)
Solucionado
(ver solução)
2
respostas

OneVsOne e OneVsRest

Ao rodar o classifica_emails.py, o meu resultado do OneVsOne está saindo com o mesmo resultado do OneVsRest, já revisei o código e não encontrei aonde se encontra o erro, se é que existe um. Mais alguém com este problema? Segue o código.

classifica_emails.py

#!-*- coding: utf8 -*-
def main():
    import pandas as pd
    import numpy as np
    from libdados import vetorizar_texto
    from libdados import execTestes

    classificacoes = pd.read_csv('emails.csv')
    textoPuro = classificacoes['email']
    textoQuebrado = textoPuro.str.lower().str.split(' ')

    dicionario = set()
    for lista in textoQuebrado:
        dicionario.update(lista)

    totalPalavras = len(dicionario)
    tuplas = zip(dicionario, xrange(totalPalavras))

    palavrasEIndices = {palavra:indice for palavra, indice in tuplas}
    vetoresDeTexto = [vetorizar_texto(texto, palavrasEIndices) for texto in textoQuebrado]

    marcas = classificacoes['classificacao']
    x = np.array(vetoresDeTexto)
    y = np.array(marcas.tolist())

    porcentagemTreino = 0.8

    tamanhoTreino = int(porcentagemTreino * len(y))
    tamanhoValidacao = len(y) - tamanhoTreino

    print tamanhoTreino

    dadosTreino = x[0:tamanhoTreino]
    marcacoesTreino = y[0:tamanhoTreino]

    dadosValidacao = x[tamanhoTreino:]
    marcacoesValidacao = y[tamanhoTreino:]

    execTestes( dadosTreino, marcacoesTreino )

main()

libdados.py

def fit_and_predict(nome, modelo, treino_dados, treino_marcacoes):
    '''Realiza cross_val_score com 10-fold'''
    from collections import Counter
    from sklearn.cross_validation import cross_val_score
    import numpy as np
    k = 10
    scores = cross_val_score(modelo, treino_dados, treino_marcacoes)
    taxa_de_acerto = np.mean(scores)

    print 'Taxa de acerto do algoritmo {0}: {1} '.format(nome, taxa_de_acerto)
    return taxa_de_acerto

def execTestes(dadosTreino, marcacoesTreino):
    '''
       Procedure que realiza testes com OneVsRest, OneVsOne, MultinomialNB e AdaBoostClassifier,
       utilizando cross_val_score (funcao fit_and_predict) com 10-fold
    '''
    from sklearn.multiclass     import OneVsRestClassifier
    from sklearn.multiclass     import OneVsOneClassifier
    from sklearn.naive_bayes    import MultinomialNB
    from sklearn.ensemble       import AdaBoostClassifier
    from sklearn.svm            import LinearSVC

    resultados = {}
    modeloOVR = OneVsRestClassifier(LinearSVC(random_state=0))
    resultadoOneVsRest = fit_and_predict("OneVsRest", modeloOVR, dadosTreino, marcacoesTreino)
    resultados[resultadoOneVsRest] = modeloOVR

    modeloOVO = OneVsOneClassifier(LinearSVC(random_state=0))
    resultadoOneVsOne = fit_and_predict("OneVsOne", modeloOVO, dadosTreino, marcacoesTreino)
    resultados[resultadoOneVsOne] = modeloOVO

    modeloMNB = MultinomialNB()
    resultadoMultinomial = fit_and_predict("MultinomialNB", modeloMNB, dadosTreino, marcacoesTreino)
    resultados[resultadoMultinomial] = modeloMNB

    modeloABC = AdaBoostClassifier()
    resultadoABC = fit_and_predict("AdaBoostClassifier", modeloABC, dadosTreino, marcacoesTreino)
    resultados[resultadoABC] = modeloABC

Os testes são feitos pela função execTestes() que está no arquivo libdados.py. A minha pergunta é se alguém consegue achar algum erro, ou se desde a gravação do curso, os dados da SpreadSheet emails.csv mudaram, de forma que ambos os resultados são iguais... Obrigado

2 respostas
solução!

Bom dia Yuri,

Realmente a olho nu não notei nada de diferente, pode baixar a versão do projeto do github e conferir o resultado quando rodá-lo?

https://github.com/alura-cursos/machine-learning-introducao-a-classificacao-2

Att

Guilherme, boa noite!

Obrigado pelo retorno! Mais para frente no curso notei que os valores variavam conforme inseria novos algoritmos de análise mas não encontrei o motivo. Ao final do curso, os valores de resultados estabilizaram e passaram a ser contabilizados conforme o curso.