Aprendizado de Máquina (CC)

2019.1

Sumário

Dados gerais sobre a disciplina

Código: QXD0176

Turma: Optativa

Turno: Manhã

Carga Horária: 64h

Local: Bloco 3 - Sala 2 (Segunda) / Bloco 1 - Lab 4 (Terça)

Horários: Segunda e Terça das 08:00h às 10:00h

Downloads

Ainda reorganizando melhor slides abaixo:


GitHub / Jupyter Notebooks da Disciplina e do projeto Ciência de Dados na Prática

Links importantes


Datasets


Vídeos / Cursos Online


Bibliografia Básica

Bibliografia Complementar

  • MOLNAR, Christoph. Interpretable Machine Learning: A Guide for Making Black Box Models Explainable. Leanpub, 2019.
  • DOWNEY, Allen B. Think Stats. 2nd Ed. O’Reilly, 2014.
  • MURPHY, Kevin P. Machine Learning: a Probabilistic Perspective. MIT Press, 2012. ISBN 0262018020
  • DUDA, Richard O.; HART, Peter E.; STORK, David G. Pattern classification. 2nd. ed. New York: John Wiley, c2001.. xx, 654 p. ISBN 0471056693 (enc.).
  • SCHALKOFF, R. Pattern Recognition: Statistical, Structural and Neural Approaches. John Wiley and Sons, 1992. ISBN 9780471529743
  • CRISTIANINI, Nello; SHAEW-Taylor. An Introduction to Support Vector Machines and Other Kernel-Based Learning Methods Cambridge University Press, 2000. ISBN-10: 0521780195. ISBN-13: 9780521780193.
  • LARSON, Ron; FARBER, Betsy. Estatística aplicada. 4. ed. São Paulo, SP: Pearson Prentice Hall, 2010. xiv,637 p. ISBN 9788576053729 (broch.).
  • CORMEN, Thomas H. RIVEST, Ronald L.; LEISERSON, Charles E. Algoritmos: teoria e prática. Rio de Janeiro: Elsevier, 2002. xvii , 916 p. ISBN: 8535209263 (-ed 2012)
  • DASGUPTA, Sanjoy; PAPADIMITRIOU, Christos H.; VAZIRANI, Umesh. Algoritmos. São Paulo, SP: McGraw-Hill, 2009. xiv, 320 p.
  • HAIR, Joseph F. et al. Análise multivariada de dados. 6. ed. Porto Alegre: Bookman, 2009. 688 p. ISBN 9788577804023 (enc.).
  • KLEINBERG, Jon; TARDOS, Éva. Algorithm design. Boston: Pearson/Addison Wesley, c2006. 838 p. :

Listas de Exercícios (a entrega deverá ser realizada pelo SIPPA)

Importante: enviar as resoluções das Listas, que precisem de resolução via programação, no formato .ipynb. Compacte e envie em um único arquivo todos os arquivos necessários para a execução completa do seu ipynb, inclusive os dados. Não enviar em formato PDF, DOC, TXT.

Lista de Exercícios 01 (prazo final para entrega: 25/02/2019 - segunda-feira )

      1. O que é Aprendizado de Máquina e para que serve?
      2. O que são dados rotulados (labels) e para que servem?
      3. Quais os problemas mais comuns de aprendizado supervisionado?
      4. Quais os problemas mais comuns de aprendizado não-supervisionado?
      5. Que tipo de algoritmo de Machine Learning (ML) você usaria para:
        • a) Permitir um robô andar em diversos tipos de terreno?
        • b) Segmentar clientes em múltiplos grupos?
      6. O que é um sistema de aprendizado online? Quais suas vantagens e desvantagens?
      7. O que significa aprendizado out-of-core?
      8. Que tipo de aprendizado usa medidas de similaridade para fazer predições?
      9. Em um modelo de ML, qual a diferença entre parâmetros e hiper-parâmetros?
      10. O que são e qual a diferença entre Underfitting e Overfitting? O que fazer para solucionar cada um desses problemas?
      11. Para que servem: conjunto de treino, conjunto de validação e conjunto de teste?
      12. O que significa validação cruzada e qual a vantagem de usá-la ao invés de usar um conjunto de validação?

Lista de Exercícios 02 (prazo final para entrega: 10/03/2019 - domingo)

      1. Crie um documento do Jupyter Notebook criar um modelo preciso de classificação para o Iris Dataset.
      2. Baixe e carregue os dados.
      3. Faça uma breve análise dos dados.
      4. Separe parte dos dados para treino (70%) e parte para teste (30%).
      5. Crie um modelo de aprendizado de máquina usando algum algoritmo de classificação sobre os dados de treino.
      6. Determine a acurácia do modelo sobre os dados de treino.
      7. Determine a acurácia do modelo sobre os dados de teste.
        • OBS: Fique a vontade para usar NumPy, Pandas e Scikit-Learn.
        • Em caso de dúvida, há um exemplo completo a ser seguido e adaptado por você no seguinte link. Por favor, tente entender cada passo e adapte a solução para o que estamos pedindo nesta lista. Discutiremos toda a solução na próxima aula.

Lista de Exercícios 03 (prazo final para entrega: 19/03/2019 - terça)

      1. Crie um documento do Jupyter Notebook criar um modelo preciso de classificação para o Iris Dataset.
      2. Baixe e carregue os dados.
      3. Faça uma breve análise dos dados.
      4. Separe parte dos dados para treino (5%) e parte para teste (95%). Esta divisão não é usual, mas vai nos permitir algumas análises. Considere somente as classes Setosa e Virgínica.
      5. Crie modelos de aprendizado de máquina com diferentes hiper-parâmetros usando Perceptron e Adaline-GD (Adaline com Gradiente Descendente).
      6. Calcule a acurácia dos modelos gerados e mostre qual o melhor deles, considerando esssa métrica.
  • Em caso de dúvida, há um exemplo melhorado em relação à prática que realizamos em nossa última aula no laboratório. Esse exemplo está disponível no seguinte link. Por favor, tente entender cada passo e adapte a solução para o que estamos pedindo nesta lista.

Lista de Exercícios 04 (prazo final para entrega: 25/03/2019 - segunda)

Nesta lista vamos fazer a predição para saber se um tumor de mama é benigno ou maligno a partir do seguinte dataset "Wisconsin Diagnostic Breast Cancer (WDBC)". Informações detalhadas sobre o dataset podem ser obtidas no seguinte link.

Use 70% dos dados para treino e outros 30% para teste.

Crie modelos de aprendizado de máquina usando os seguintes algoritmos:

Compare os resultados obtidos entre os algoritmos acima usando a métrica acurácia.

Lista de Exercícios 05 (prazo final para entrega: 08/04/2019 - segunda)

Nesta lista vamos fazer a predição para obter o preço de venda de um imóvel a partir do seguinte dataset "Boston House Price Dataset". Informações detalhadas sobre o dataset podem ser obtidas no seguinte link. Use 70% dos dados para treino e outros 30% para teste.

Use 70% dos dados para treino e outros 30% para teste.

Crie modelos de aprendizado de máquina usando os seguintes algoritmos:

Compare os resultados obtidos entre os algoritmos acima usando a métrica RMSE (implemente-a em um módulo Python externo ao Jupyter Notebook).

Lista de Exercícios 06 (prazo final para entrega: 14/04/2019 - domingo)

    • Implemente as 2 classes a seguir e adicione à sua biblioteca de pre-processamento em Python no arquivo transform.py :
      • Normalize
      • Standardize
      • Ambas devem ter os métodos fit(X) e transform(X).
        • fit - percorre a matriz de entrada e obtém os valores necessários aos cálculos específicos de cada classe:
          • Normalize obtém min e max.
          • Standardize obtém mean e std.
        • transform - altera os valores da matriz de entrada de acordo com a operação realizada (normalizadação ou estandardização)
    • Implemente uma função split_stratified_train_test para dividir os dados de treino e teste no arquivo resample.py a ser incluído em sua biblioteca Python. A função deve permitir:
      • randomização dos dados.
      • escolha de percentual dos dados usados para treino (o complemento desse percentual representa os dados usados para teste).
      • estratificação dos dados (ver link).
      • Assinatura: split_stratified_train_test(y, perc_train, seed)
        • perc_train - percentual dos dados usados para treino.
        • seed - semente para geração de números randômicos.
        • y - labels de cada observação contendo a classe como valor.
        • saída (output): array estratificado com os índices do dados de treino e array estratificado com os índices dos dados de teste.
        • Exemplo de entrada: split_stratified_train_test(0.7, 42, y)
          • Saída - 2 arrays com índices dos dados de treino (idx_train) e de teste (idx_test), respectivamente.
    • Use as implementações acima para tratar o dataset de renda de americanos dos Estados Unidos, que tem como rótulo se a pessoa ganha ou não mais de 50.000 dólares por ano. Considere apenas o arquivo adult.data como dataset para resolver esta lista.
      • O dataset contém dados categóricos e valores faltando.
      • Faça o melhor pre-processamento possível para tornar tal dataset adequado para uso nos algoritmos de aprendizagem de máquina para classificação. Use 70% dos dados para treino e outros 30% para teste.
      • Faça atribuição da média da coluna para valores faltantes, caso o percentual de valores faltantes da coluna não seja muito grande.
      • Transforme categorias usadas nas features e label em números. Categorias que não possuem uma ordem implícita devem ser transformadas em features binárias.
      • Compare os resultados obtidos entre os algoritmos acima usando a métrica accuracy (implemente-a no arquivo metrics.py de sua bliblioteca Python).

Lista de Exercícios 07 (prazo final para entrega: 29/04/2019 - segunda)

      1. Resolva o problema de classificação binária sobre o dataset "Wisconsin Diagnostic Breast Cancer (WDBC)".
      2. Use 80% do dataset para treino e 20% apenas para teste. Use estratificação baseada no label.
      3. Aplicar Standardization nas features.
      4. Usar o seguinte algoritmo: Perceptron.
        • Use modelos usando diferentes regularizações: Nenhuma, L1, L2, ElasticNet (penalty : None, ‘l2’ or ‘l1’ or ‘elasticnet’).
          • Use também diferentes valores de alpha para ver como eles afetam os resultados na validação cruzada.
        • Usar a seguinte métrica: Accuracy.
      5. Use K-Fold Cross Validation (cross_val_score) com k = 3 apenas sobre os dados de treino.
        • Use validação cruzada estratificada (StratifiedKFold) com randomização dos dados (usar shuffle e random_state).
          • Dica: instancie um objeto da classe StratifiedKFold e use-o no parâmetro cv do cross_val_score.
      6. Depois de obter o melhor modelo via cross-validation sobre o conjunto de treino, use os melhores hiper-parâmetros encontrados para treinar um modelo usando todo o dado de treino. Depois, avalie esse modelo usando os dados de teste.

Lista de Exercícios 08 (prazo final para entrega: 06/05/2019 - segunda)

    1. Implemente as seguintes métricas de classificação:
      • As métricas devem funcionar para classificação binária ou mesmo para múltiplas classes. Dica: você pode usar a função confusion_matrix do Scikit Learn para construir uma matriz de confusão e facilitar os seus cálculos. As métricas devem retornar a média ponderada com pesos baseados no suporte.
        • accuracy
        • precision
        • recall
        • f1_measure
    2. Divida de forma estratificada o Dataset Iris em apenas 10% para treino e 90% para teste. Essa divisão não é usual, mas vamos usar para tornar o problema mais desafiador.
      • Faça a standardização dos dados.
    3. Crie um modelo preditivo de classificação multi-classe usando Logistic Regression.
      • Dica: você pode usar os parâmetros: multi_class='auto', solver='lbfgs'
    4. Avalie usando suas implementações das métricas: accuracy, precision, recall e f1_measure.
    5. Calcule a métrica log_loss usando a implementação do sklearn.
      • Observe exemplos sobre Métricas de Classificação no github da disciplina. Lá tem exemplos completos.
      • Note que y_pred em log_loss, nós chamamos de y_score, que é a probabilidade de ocorrência de cada classe para aquela linha do dataset.
    6. Desenhe a curva ROC para a classe Iris-virginica usando a implementação do sklearn.
      • use a função roc_auc_score(y_true, y_score).
        • preste atenção que y_score é diferente de y_pred.
      • Dicas: Observe exemplos sobre Métricas de Classificação no github da disciplina. Lá tem exemplos completos.
    7. Calcule a métrica AUC (Area Under Curve) para a classe Iris-virginica usando a implementação do sklearn.
      • Dica: Observe exemplos sobre Métricas de Classificação no github da disciplina. Lá tem exemplos completos.

Lista de Exercícios 09 (prazo final para entrega: 09/05/2019 - quinta)

    1. Implemente a classe KNNModel e suas subclasses KNNClassifier e KNNRegressor. Estas duas últimas classes devem ter interfaces semelhantes às suas respectivas implementações do scikit learn (KNeighborsClassifier e KNeighborsRegressor). Para simplificar, você somente precisa implementar o algoritmo de força bruta, como mostramos em laboratório (ver notebook no github).
      • Dica: adapte a solução que fizemos no laboratório para implementar as suas classes.
    2. Crie e avalie modelos preditivos usando o kNN com o dataset iris. Compare os resultados da sua implementação com a implementação de kNN (KNeighborsClassifier) do scikit learn. Use k=[1, 3 e 5]
      • Divida de forma estratificada o Dataset Iris em apenas 10% para treino e 90% para teste. Essa divisão não é usual, mas vamos usar para tornar o problema mais desafiador.
      • Faça a standardização dos dados.
    3. Implemente as medidas de distância a seguir (ver Figura 1):
          • minkowski_distance(X, row, p)
          • euclidean_distance(X, row). Dica: usar minkowski_distance com p=2.
          • manhattan_distance(X, row) Dica: usar minkowski_distance com p=1.
          • chebyshev_distance(X, row)
          • onde X é uma matriz e row é uma linha para calculo da distância entre X e esta linha (row).
          • Veja exemplo de implementação da distância euclidiana neste jupyter notebook.

Lista de Exercícios 10 (prazo final para entrega: 27/06/2019 - segunda)

Suponha que a internet caiu no Campus Quixadá e você quer fazer uma consulta através de palavras chave sobre as reviews de filmes do IMDB. (1) Defina sua consulta (palavras chave), (2) consulte o dataset e (3) mostre as 10 reviews mais semelhantes à sua consulta.

        • Dica: Vetorize as reviews usando CountVectorizer ou TF-IDF e raqueie a similaridade usando a distância cosseno ou Jaccard.
        • Informações sobre o dataset e como transformá-lo para uso, podem ser obtidas no seguinte link.
          • Há um csv compactado já com as reviews prontas para uso no link. O read_csv do pandas consegue lê-lo diretamente. Você nem precisa descompactá-lo antes.
          • Veja também os jupyter notebooks que fizemos esta semana nas aulas de Laboratório.

Lista de Exercícios 11 (prazo final para entrega: 02/06/2019 - DOMINGO)

    • O dataset de renda de americanos dos Estados Unidos tem como rótulo se a pessoa ganha ou não mais de 50.000 dólares por ano.
      • O dataset contém dados categóricos e valores faltando.
      • Faça o melhor pre-processamento possível para tornar tal dataset adequado para uso em diversos algoritmos de aprendizagem de máquina.
      • Faça atribuição da média da coluna para valores faltantes, caso o percentual de valores faltantes da coluna não seja muito grande.
      • Transforme categorias usadas nas features e label em números. Categorias que não possuem uma ordem implícita devem ser transformadas em features binárias.
    • Use 5-Fold Cross Validation Estratificada para obter a Accuracy através do uso dos seguintes algoritmos: Perceptron, Adaline, Stochastic Gradient Descent (SGD), Logistic Regression, kNN, Naive Bayes, SVM e Árvore de Decisão (Decision Tree).
      • Faça Standardization dos dados (fit para o conjunto de treino e transform para treino e teste).
      • Compare os modelos e indique o melhor resultado obtido.

Lista de Exercícios 12 (prazo final para entrega: 16/06/2019 - DOMINGO - Não é necessário enviar ao professor - Correção na segunda dia 17/06/2019)

    1. Avalie o desempenho dos algoritmos DecisionTree, RandomForest e Gradient Boosting para o dataset "Wisconsin Diagnostic Breast Cancer (WDBC)". Separe os dados em treino (60%), validação (20%) e teste (20%).
      • Use um valor constante para o parâmetro random_state e teste os resultados com as seguintes combinações de hiper-parâmetros para RandomForest e Gradient Boosting usando Grid-Search:
        • learning_rate: 0.1, 0.05, 0.01 (somente para o Gradient Boosting)
        • n_estimators: 50, 100, 200
        • max_depth: 3, 5, 7
      • Mostre a importância das features de acordo com o melhor modelo de classificação e o melhor modelo de regressão encontrados dentre os 3 usados nesta lista de exercícios (DecisionTree, RandomForest e Gradient Boosting).
    2. Faça a clusterização do dataset deste link usando o algoritmo K-Means++.
      • O dataset possui os seguintes dados de motoristas: a distância média dirigida por dia e a média percentual do tempo que um motorista estava 5mph acima do limite de velocidade.
      • Portanto, agrupe os motoristas pela similaridade das features acima.
      • Use o método do cotovelo (Elbow Method) para identificar o melhor valor de k para o K-Means++.
      • Mostre o resultado graficamente.
    3. Use Clusterização Hierárquica no mesmo dataset da questão 2 usando "complete" como critério de ligação (linkage). Mostre o dendograma.
      • Use o parâmetro n_clusters da função scipy.cluster.hierarchy.cut_tree para obter o número de clusters igual ao melhor resultado obtido com o K-Means (Questão 2). Exemplo:

...

distance_matrix = scipy.spatial.distance.pdist(X, metric='euclidean')

cluster_model = scipy.cluster.hierarchy.complete(distance_matrix)

dendogram = scipy.cluster.hierarchy.dendrogram(cluster_model)

sensor_cluster_list = scipy.cluster.hierarchy.cut_tree(cluster_model, n_clusters=8)

      • Mostre o resultado graficamente.

4. Use o DBScan para clusterizar o mesmo dataset da questão 2 e mostre o resultado graficamente.

Trabalho Prático de Aprendizado de Máquina

Etapa 1 - Proposta - Prazo: 05/04/2019 - Sexta

  • Submeta sua Proposta de Trabalho Prático da Disciplina através do preechimento do seguinte formulário.
    • Sugestões de problemas a atacar:
    • Crie e envie somente um documento texto com os detalhes do problema a ser resolvido e qual(is) dataset(s) será(ão) usado(s).
    • Requisitos:
      • Explique bem o Problema de Machine Learning que você pretende atacar. Aqui é importante você definir:
        • Tipo de problema:
          • Classificação, Regressão, Clusterização, Aprendizado por reforço (Reinforcement Learning), Recuperação de Informação, Recomendação, Processamento de Linguagem Natural, Visão Computacional, etc.
        • Features que pretende usar.
        • Output:
          • O que você espera obter como resultado do uso de técnica(s) de Machine Learning.
      • Recomenda-se (mas isso não é um requisito obrigatório), que o dataset principal tenha:
        • no mínimo 50.000 observações (linhas).
        • no mínimo 10 features (colunas), sem considerar os rótulos (labels).
    • O trabalho pode ter relação com um ou mais dos seguintes assuntos / tópicos:
      • Aprendizagem de Máquina (Machine Learning)
        • Aprendizagem Supervisionada
        • Aprendizagem Não Supervisionada
        • Aprendizagem por Reforço (Reinforcement Learning)
      • Deep Learning
      • Processamento de Linguagem Natural (NLP - Natural Language Processing)
      • Recuperação de Informação (Information Retrieval)
      • Sistemas de Recomendação
      • Visão Computacional

Etapa 2 - Resultados Preliminares - Prazo: 12/05/2019 (domingo)

  • Apresentação Preliminar do Trabalho Prático
    • A apresentação preliminar dos trabalhos finais será realizada por cada aluno no dia 13/05/2019 (segunda), valendo parte da nota do trabalho.
    • Cada aluno terá 4 minutos para apresentar.
    • A apresentação deve estar em um Jupyter Notebook compartilhado via Gist através do seguinte link.

Etapa 3 - Experimentos e Resultados - Prazo: 23/06/2019 (domingo)

    • A apresentação deve estar em um Jupyter Notebook compartilhado através do seguinte link.


Sugestões do que deve conter o notebook do Trabalho Prático:

    • Qual o problema geral a ser resolvido
    • Quais são os datasets originais
      • Volume de dados em tuplas e espaço de armazenamento
    • Análise exploratória dos dados
      • análise de atributos
      • correlações
      • histogramas
    • Qual o tipo de problema de machine learning a resolver:
      • Classificação, Regressão, Clusterização, Aprendizado por reforço (Reinforcement Learning), Recuperação de Informação, Recomendação, etc.
    • Quais features (input) e label (output) serão usados
    • Quais métricas de avaliação de resultado serão usadas
    • Aplicação das técnicas de machine learning usando diferentes algoritmos e hiper-parâmetros
    • Exibição dos resultados preferencialmente de forma gráfica e/ou tabular
    • Apresentar conclusões sobre o trabalho:
      • Dificuldades, Aprendizados, Possíveis melhorias futuras
    • Importante
      • usar bastante markdown para criar títulos e explicações a cada passo dos experimentos
      • evitar linhas desnecessárias que não ajudem no entendimento do trabalho
        • Exemplo: ao mostrar um dataframe, exibir apenas algumas poucas linhas
      • Recomenda-se comparar com outras resoluções (kernels) ou artigos que resolvem o mesmo problema.
        • tentar obter resultados mais próximos ou melhores do que eles.
        • aproveitar e usar as boas ideias que eles possam fornecer.

Workflow típico para resolução de problemas

  • Definição do problema
  • Carregamento do dataset
  • Análise e visualização dos dados
  • Preparação dos dados
    • Limpeza dos dados
    • Transformação dos dados
  • Geração e treinamento dos modelos
  • Avaliação dos modelos
  • Apresentar os resultados (tabelas, gráficos)

Cronograma Final da Disciplina

    • 04/06 (terça) - 2ª Avaliação Parcial
    • 18/06 (terça) - 3ª Avaliação Parcial
    • 24,25 / 06 - Apresentação Final do Trabalho Prático