scikit-learn: Aprendizado de máquina 101 com Python Luciana Fujii Campus Party BH 2016 scikit-learn: Aprendizado de máquina 101 com Python N 1 / 30 Introdução Aprendizado de máquina Aprendizado de máquina é o campo da ciência da computação que dá aos computadores a abilidade de aprender sem ser explicitamente programado. scikit-learn: Aprendizado de máquina 101 com Python N 2 / 30 Introdução Aprendizado de máquina Usado em tarefas em que desenvolver explicitamente um algoritmo é inviável: Detecção de spam OCR Visão computacional Carros auto dirigı́veis ... scikit-learn: Aprendizado de máquina 101 com Python N 3 / 30 Introdução scikit-learn Python: rápido desenvolvimento Baseada em NumPy e SciPy Software Livre Fácil de instalar Não usa GPU scikit-learn: Aprendizado de máquina 101 com Python N 4 / 30 Introdução Set Up Instalação: numpy scikit-learn scipy scikit-learn: Aprendizado de máquina 101 com Python N 5 / 30 Datasets Standard datasets A primeira coisa que precisamos pra aprender alguma coisa: dados scikit-learn tem alguns datasets exemplo que podemos usar scikit-learn: Aprendizado de máquina 101 com Python N 6 / 30 Datasets Standard datasets >>> from sklearn import datasets >>> iris = datasets.load iris() >>> digits = datasets.load digits() >>> print digits.data >>> print digits.target >>> print digits.data.shape scikit-learn: Aprendizado de máquina 101 com Python N 7 / 30 Aprendizado e predição Aprendizado e predição Estimator é um objeto que implementa: fit: treina o modelo predict: depois do treino, faz a predição do resultado para uma entrada Exemplo de estimators: Linear model: Perceptron, Logistic Regression, Stochastic Gradient Descent, Passive Aggressive Classifier. . . Support Vector Machines: SVC, SVR. . . Nearest Neighbors Gaussian Processes Naive Bayes K-means ... scikit-learn: Aprendizado de máquina 101 com Python N 8 / 30 Aprendizado e predição Um pouco de teoria Aprendizado de máquina tem diferentes abordagens: Aprendizado supervisionado Aprendizado não-supervisionado Aprendizado por reforço scikit-learn: Aprendizado de máquina 101 com Python N 9 / 30 Aprendizado supervisionado Perceptron scikit-learn: Aprendizado de máquina 101 com Python N 10 / 30 Aprendizado supervisionado Perceptron Classifica dados linearmente separáveis, encontrando uma reta que separa os dados >>> from sklearn import linear model >>> clf = linear model.perceptron.Perceptron() >>> clf >>> clf.fit(digits.data[:-5], digits.target[:-5]) >>> clf.predict(digits.data[-5:]) >>> print digits.target[-5] scikit-learn: Aprendizado de máquina 101 com Python N 11 / 30 Aprendizado supervisionado Support Vector Machines - SVM scikit-learn: Aprendizado de máquina 101 com Python N 12 / 30 Aprendizado supervisionado Support Vector Machines - SVM Também encontra uma reta que separa dados linearmente separáveis, mas encontra a melhor reta Código muito similar ao do perceptron: >>> from sklearn import svm >>> clf = svm.LinearSVC() >>> clf >>> clf.fit(digits.data[:-5], digits.target[:-5]) >>> clf.predict(digits.data[-5:]) >>> print digits.target[-5] scikit-learn: Aprendizado de máquina 101 com Python N 13 / 30 Aprendizado supervisionado Support Vector Machines - SVM scikit-learn: Aprendizado de máquina 101 com Python N 14 / 30 Aprendizado supervisionado Support Vector Machines - SVM Projeção: z = x 2 + y 2 scikit-learn: Aprendizado de máquina 101 com Python N 15 / 30 Aprendizado supervisionado Support Vector Machines - SVM Kernel: transformação do dado (simplicação) Nesse caso: Z = X 2 + Y 2 Kernels na class SVC do scikit-learn: Linear Polynomial RBF Sigmoid Um método que você implementar scikit-learn: Aprendizado de máquina 101 com Python N 16 / 30 Aprendizado Supervisionado - Redes Neurais Redes Neurais - Multi-layer Perceptrons scikit-learn: Aprendizado de máquina 101 com Python N 17 / 30 Aprendizado Supervisionado - Redes Neurais Redes Neurais - MLP Criando um classificador >>> from sklearn.neural network import MLPClassifier >>> clf = MLPClassifier() >>> clf.fit(digits.data[:-5],digits.target[:-5]) >>> clf.predict(digits.data[-5:]) >>> clf MLPClassifier(activation=’relu’, alpha=0.0001, ... ) scikit-learn: Aprendizado de máquina 101 com Python N 18 / 30 Aprendizado Supervisionado - Redes Neurais Redes Neurais - MLP Um Multi-layer Perceptron tem muitos parâmetros: hidden layer sizes: tupla (200,100,80)- 3 camadas activation: ’relu’,’logistic’,’tanh’. . . solver: ’lbfgs’, ’sgd’, ’adam’ (método de atualizar parâmetros) alpha: termo de regularização learning rate: ’constant’,’adaptive’... learning rate init ... scikit-learn: Aprendizado de máquina 101 com Python N 19 / 30 Aprendizado Supervisionado - Redes Neurais Feature Scaling Redes neurais são sensı́veis ao tamanho das caracterı́sticas Resultados são melhores se as entradas são redimensionadas A entrada de teste também tem que ser redimensionada Métodos comuns: Redimensionar a entrada para ter valores entre -1 e 1 (ou 0 e 1) Padronizar entrada para ter média 0 e variância 1 scikit-learn tem StandardScaler scikit-learn: Aprendizado de máquina 101 com Python N 20 / 30 Aprendizado Supervisionado - Redes Neurais Feature Scaling Scaling between 1 and -1: >>> import numpy as np >>> X /= np.max(X) * 1.0 Standardizing: >>> from sklearn.preprocessing import StandardScaler >>> scaler = StandardScaler() >>> # Don’t cheat - fit only on training data >>> scaler.fit(X train) >>> X train = scaler.transform(X train) >>> # apply same transformation to test data >>> X test = scaler.transform(X test) scikit-learn: Aprendizado de máquina 101 com Python N 21 / 30 Aprendizado não-supervisionado Clusterização Método não-supervisionado mais comum. scikit-learn: Aprendizado de máquina 101 com Python N 22 / 30 Aprendizado não-supervisionado Clusterização >>> from sklearn.cluster import Kmeans >>> import numpy as np >>> X = np.array([[1, 2], [1, 4], [1, 0], [4, 2], [4, 4], [4, 0]]) >>> clf = Kmeans(n clusters=2) >>> clf.fit(X) >>> # Check the clusters >>> clf.labels >>> # Get the cluster for new datapoints >>> clf.predict([[0,0]]) scikit-learn: Aprendizado de máquina 101 com Python N 23 / 30 Avaliação do modelo e validação cruzada Conjunto de treino e teste Nós devemos utilizar dados de teste que nós não utilizamos pra treinar train test split divide seus dados entre conjunto de treinamento e conjunto de teste >>> import numpy as np >>> from sklearn.model selection import train test split >>> X train, X test, y train, y test = train test split(iris.data, iris.target, test size=0.4, random state=0) >>> X train.shape, y train.shape ((90, 4), (90,)) >>> X test.shape, y test.shape ((60, 4), (60,)) scikit-learn: Aprendizado de máquina 101 com Python N 24 / 30 Avaliação do modelo e validação cruzada Validação cruzada Para escolher os hiper parâmetros usando o conjunto de test, nós corremos o risco de overfitting dos hiper parâmetros para o conjunto de teste. Alternativas: Conjunto de validação: separar o conjunto de treinamento entre validação e treino Validação cruzada scikit-learn: Aprendizado de máquina 101 com Python N 25 / 30 Avaliação do modelo e validação cruzada Validação cruzada Conjunto de validação: Problema de reduzir demais o seu conjunto de treino Escolher os melhores hiper parâmetros para o conjunto de validação, não necessariamente generalizando Validação cruzada: Mantém o conjunto de teste Separar o conjunto de treino em k subconjuntos Treinar sem usar um dos subconjuntos e validar nesse subconjunto Repetir mudando o subconjunto usado pra validação para cada k subconjuntos O desempenho é medido na média dos valores conseguidos Pode se tornar caro computacionalmente scikit-learn: Aprendizado de máquina 101 com Python N 26 / 30 Avaliação do modelo e validação cruzada cross val score >>> from sklearn.model selection import cross val score >>> X train, X test, y train, y test = train test split(iris.data, iris.target, test size=0.2) >>> clf = svm.SVC(kernel=’linear’, C=1) >>> scores = cross val score(clf, X train, y train, cv=5) >>> scores >>> print("Accuracy: %0.2f (+/- %0.2f)"% (scores.mean(), scores.std() * 2)) scikit-learn: Aprendizado de máquina 101 com Python N 27 / 30 Escolha do método Escolhendo um estimator scikit-learn: Aprendizado de máquina 101 com Python N 28 / 30 Escolha do método Links úteis http://scikit-learn.org/ http://scikit-learn.org/stable/tutorial/machine learning map/ http://cs.stanford.edu/people/karpathy/convnetjs/ scikit-learn: Aprendizado de máquina 101 com Python N 29 / 30 Luciana Fujii - [email protected] scikit-learn: Aprendizado de máquina 101 com Python N 30 / 30