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

Erro em Projeto Desenvolvido em Machine Learning com base no Curso

Olá, boa tarde. Eu estou desenvolvendo um projeto baseado nas aulas do curso de Machine Learning e ele está apresentando diversos erros que não estou conseguindo resolver. Os erros não apareceram enquanto eu desenvolvia os projetos das aulas, mas com dados diferentes eles surgiram e eu gostaria de saber como resolvê-los e o motivo deles estarem aparecendo, segue meu código:

!pip install nltk==3.5

import nltk

nltk.download('all')

import pandas as pd
from sklearn.model_selection import cross_val_score
from collections import Counter
import numpy as np
import nltk
from IPython.display import display

np.set_printoptions(threshold=np.inf, linewidth=np.nan)

pd.options.mode.chained_assignment = None

stopwords = nltk.corpus.stopwords.words("portuguese")

stemmer = nltk.stem.RSLPStemmer()

classificacoes = pd.read_csv("vincere.csv", encoding = "latin1", engine= 'python', delimiter =';', nrows = 98)
pd.options.display.max_columns = None

classificacoes.columns = classificacoes.columns.str.strip().str.lower().str.replace(' ', '_')

classificacoes["sexo"] = classificacoes["sexo"].str.strip().str.lower().str.replace(' ', '_')
classificacoes["local_anatomico"] = classificacoes["local_anatomico"].str.strip().str.lower().str.replace(' ', '_')

df = classificacoes

conditionlist = [
    (df['idade'] <= 20) ,
    (df['idade'] <= 30) ,
    (df['idade'] <= 40) ,
    (df['idade'] <= 50) ,
    (df['idade'] <= 55) ,
    (df['idade'] <= 60) ,
    (df['idade'] <= 65) ,
    (df['idade'] <= 70) ,
    (df['idade'] <= 75) ,
    (df['idade'] <= 80) ,
    (df['idade'] <= 90) ,
    (df['idade'] >= 91)]
choicelist = ['faixa1', 'faixa2', 'faixa3', 'faixa4', 'faixa5', 'faixa6' , 'faixa7', 'faixa8', 'faixa9', 'faixa10', 'faixa11', 'faixa12']
df['faixa_etaria'] = np.select(conditionlist, choicelist, default='Not Specified')

df["faixa_etaria"] = df["faixa_etaria"].str.strip().str.lower().str.replace(' ', '_')

X_df = df[["sexo", "local_anatomico", "faixa_etaria"]]

Y_df = classificacoes["diagnóstico_médico_(y)"].str.strip().str.lower().str.replace(' ', '_')

X_dummies = pd.get_dummies(X_df)
Y_dummies = pd.get_dummies(Y_df)

X = X_dummies.values
Y = Y_dummies.values

porcentagem_de_treino = 0.8

tamanho_de_treino = int(porcentagem_de_treino * len(Y))

treino_dados = X[:tamanho_de_treino]
treino_marcacoes = Y[:tamanho_de_treino]

validacao_dados = X[tamanho_de_treino:]
validacao_marcacoes = Y[tamanho_de_treino:]

def fit_and_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

resultados = {}

from sklearn.multiclass import OneVsRestClassifier
from sklearn.svm import LinearSVC
modeloOneVsRest = OneVsRestClassifier(LinearSVC(random_state = 0, max_iter=10000))
resultadoOneVsRest = fit_and_predict("OneVsRest", modeloOneVsRest, treino_dados, treino_marcacoes)
resultados[resultadoOneVsRest] = modeloOneVsRest

from sklearn.multiclass import OneVsOneClassifier
modeloOneVsOne = OneVsOneClassifier(LinearSVC(random_state = 0, max_iter=10000))
resultadoOneVsOne = fit_and_predict("OneVsOne", modeloOneVsOne, treino_dados, treino_marcacoes)
resultados[resultadoOneVsOne] = modeloOneVsOne

Os erros que aparecem ao executá-lo:

/usr/local/lib/python3.7/dist-packages/sklearn/multiclass.py:75: UserWarning: Label not 2 is present in all training examples.
  str(classes[c]))

Taxa de Acerto do OneVsRest: 0.5375
Taxa de Acerto do OneVsOne: nan
/usr/local/lib/python3.7/dist-packages/sklearn/model_selection/_validation.py:536: FitFailedWarning: Estimator fit failed. The score on this train-test partition for these parameters will be set to nan. Details: 
ValueError: bad input shape (70, 22)

  FitFailedWarning)

/usr/local/lib/python3.7/dist-packages/sklearn/model_selection/_validation.py:536: FitFailedWarning: Estimator fit failed. The score on this train-test partition for these parameters will be set to nan. Details: 
ValueError: bad input shape (71, 22)

  FitFailedWarning)
3 respostas

Oii Carlos, tudo certinho contigo?

Como você nao marcou qual o curso relacionado com a sua dúvida, suponho que seja algum dos que temos de NLP, você consegue especificar pra mim qual deles é?

O primeiro erro que está ocorrendo, pode ser por conta de que, em alguns poucos casos, quando dividimos um dataset em treino e teste para validar o modelo, pode acontecer de perdermos algumas tags da parte do treinamento. Os outros erros são em relação ao tamanho que o modelo esperava receber do Estimator, onde ele está recebendo 2 colunas e esperava apenas 1.

Outro ponto importante é que as análises mudam conforme mudamos nosso banco de dados, muitas das coisas que fazemos em um pode não ser efetivo em outro, então se você quiser mandar por aqui o banco que está usando agora pra eu poder testar aqui na minha máquina, acredito que posso te auxiliar de uma forma melhor :D

Fico no aguardo da sua resposta, ok? ^^

Oi Sthefanie, tudo certo e com você?

O Curso relacionado a minha dúvida seria "Machine Learning: Avançando com tipos diferentes de classificação", porém já consegui resolver meu erro. O principal motivo dele estar ocorrendo era porque eu estava transformando a variável Y que é um array em uma matriz, utilizando a função "get_dummies". O outro erro como você disse, era justamente por só conter um dado na variável Y e quando utilizava o Kfold para "quebrá-lo" em duas partes ele reclamava que não possuí dados o suficiente para treinar e testar.

Contudo, eu fiquei com uma pequena dúvida em relação ao Y. Por qual motivo não podemos o transformar em uma matriz com o get_dummies? Seria por conta da variável Y ser o resultado esperado e não uma feature para descobrir algo, no caso, o valor do Y?

solução!

Oii Carlos, tudo certinho por ai?

Desculpa a demora em te dar um retorno à questão.

Nós não podemos transformar o Y em matriz com o get_dummies exatamente por conta do que você falou, como ele é um resultado esperado, é uma saída única e não podemos fazer essa transformação.

Qualquer outra dúvida, pode nos acionar pelo fórum!

Bons estudos ^^

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