machine learning usando scikits
DESCRIPTION
Apresentação usada no XIV encontro do PUG-PE.TRANSCRIPT
PUG-PE - Julho de 2011
Machine Learning usando scikits.learn
Marcelo Gomes Pereira de LacerdaEngenharia da Computação
Escola Politécnica de PernambucoUniversidade de Pernambuco
PUG-PE - Julho de 2011
Roteiro
• Elementos Básicos• Aprendizagem Supervisionada• Seleção de Modelo• Aprendizagem Não-Supervisionada• Conclusão
PUG-PE - Julho de 2011
Elementos Básicos
• Base de dados (features = Array 2D, labels Array 1D)
• Estimator• Evaluator
PUG-PE - Julho de 2011
Aprendizagem Supervisionada
• Encontrar relação entre dois datasets: X e Y• A aprendizagem ocorre sob “orientações” do
humano, o qual diz se uma resposta dada pelo modelo está correta ou não e qual a resposta certa.
• X => Array 2D. Ex.: [[1,2,3],[3,4,5],[5,6,7]]• Y => Array 1D (na maioria dos casos). Ex.: [0,0,1]• fit(X,Y)• predict(p)
PUG-PE - Julho de 2011
Aprendizagem Supervisionada
• Classificação
PUG-PE - Julho de 2011
Aprendizagem Supervisionada
• Regressão
PUG-PE - Julho de 2011
K-Nearest Neighbor Classifier (KNN)
PUG-PE - Julho de 2011
K-Nearest Neighbor Classifier (KNN)
import numpy as npfrom scikits.learn import datasets
iris = datasets.load_iris()iris_X = iris.datairis_y = iris.targetnp.random.seed(0)indices = np.random.permutation(len(iris_X))iris_X_train = iris_X[indices[:-10]]iris_y_train = iris_y[indices[:-10]]iris_X_test = iris_X[indices[-10:]]iris_y_test = iris_y[indices[-10:]]
PUG-PE - Julho de 2011
K-Nearest Neighbor Classifier (KNN)
from scikits.learn.neighbors import NeighborsClassifier
knn = NeighborsClassifier()print knn.fit(iris_X_train, iris_y_train)
NeighborsClassifier(n_neighbors=5, window_size=1, algorithm=auto)
print knn.predict(iris_X_test)
array([1, 2, 1, 0, 0, 0, 2, 1, 2, 0])
PUG-PE - Julho de 2011
Regressão Linear
• y = xb + e– y = variável alvo– x = dado– b = coeficiente– e = ruído da observação
PUG-PE - Julho de 2011
Regressão Linearfrom scikits.learn import linear_model
diabetes = datasets.load_diabetes()diabetes_X_train = diabetes.data[:-20]diabetes_X_test = diabetes.data[-20:]diabetes_y_train = diabetes.target[:-20]diabetes_y_test = diabetes.target[-20:]
regr = linear_model.LinearRegression()regr.fit(diabetes_X_train, diabetes_y_train)regr.predict(diabetes_X_test)
[1,2.6,-1.67,3,...,2.45]
PUG-PE - Julho de 2011
Regressão para Classificação
• Regressão Linear não é recomendada• Dá muito peso a elementos distantes da fronteira de
decisão!
• Solução: Regressão Logística (Sigmóide)
PUG-PE - Julho de 2011
Regressão para Classificação
logistic = linear_model.LogisticRegression(C=1e5)logistic.fit(iris_X_train, iris_y_train)
LogisticRegression(C=100000.0, intercept_scaling=1, dual=False, fit_intercept=True, penalty='l2', tol=0.0001)
PUG-PE - Julho de 2011
Support Vector Machines (SVM)
• Achar a combinação de amostras de treinamento de forma que maximize a margem entre as classes
PUG-PE - Julho de 2011
Support Vector Machines (SVM)
• SVC = Support Vector Classification• SVR = Support Vector Regression
from scikits.learn import svmsvc = svm.SVC(kernel='linear')svc.fit(iris_X_train, iris_y_train)
PUG-PE - Julho de 2011
Support Vector Machines (SVM)
• Outros Kernels– svc = svm.SVC(kernel='linear')– svc = svm.SVC(kernel='poly',degree=3)– svc = svm.SVC(kernel='rbf')
PUG-PE - Julho de 2011
Seleção de Modelo
PUG-PE - Julho de 2011
Seleção de Modelo
• Medição da qualidade de predição do modelo através do método score
• Dica: Implementar K-Fold Cross Validation para obter resultados mais precisos.
>>> from scikits.learn import datasets, svm>>> digits = datasets.load_digits()>>> X_digits = digits.data>>> y_digits = digits.target>>> svc = svm.SVC()>>> svc.fit(X_digits[:-100], y_digits[:-100]).score(X_digits[-100:], y_digits[-100:])0.97999999999999998
PUG-PE - Julho de 2011
Seleção de Modelo>>> import numpy as np>>> X_folds = np.array_split(X_digits, 10)>>> y_folds = np.array_split(y_digits, 10)>>> scores = list()>>> for k in range(10):... X_train = list(X_folds)... X_test = X_train.pop(k)... X_train = np.concatenate(X_train)... y_train = list(y_folds)... y_test = y_train.pop(k)... y_train = np.concatenate(y_train)... scores.append(svc.fit(X_train, y_train).score(X_test, y_test))>>> print scores[0.9555555555555556, 1.0, 0.93333333333333335, 0.99444444444444446, 0.98333333333333328, 0.98888888888888893, 0.99444444444444446, 0.994413407821229, 0.97206703910614523, 0.96089385474860334]
PUG-PE - Julho de 2011
Seleção de Modelo
• O scikits.learn dá uma mãozinha!
• Ou... Melhor ainda!
>>> kfold = cross_val.KFold(len(X_digits), k=3)>>> [svc.fit(X_digits[train], y_digits[train]).score(X_digits[test], y_digits[test])... for train, test in kfold][0.95530726256983245, 1.0, 0.93296089385474856, 0.98324022346368711, 0.98882681564245811, 0.98882681564245811, 0.994413407821229, 0.994413407821229, 0.97206703910614523, 0.95161290322580649]
>>> cross_val.cross_val_score(svc, X_digits, y_digits, cv=kfold, n_jobs=-1)array([ 0.95530726, 1., 0.93296089, 0.98324022, 0.98882682, 0.98882682, 0.99441341, 0.99441341, 0.97206704, 0.9516129 ])
PUG-PE - Julho de 2011
Seleção de Modelo
• Cross-Validation Generators– KFold(n, k)– StratifiedKFold(y, k)– LeaveOneOut(n)– LeaveOneLabelOut(labels)
PUG-PE - Julho de 2011
Aprendizagem Não-Supervisionada
PUG-PE - Julho de 2011
K-Means (Clusterização “Plana”)>>> from scikits.learn import cluster, datasets>>> iris = datasets.load_iris()>>> X_iris = iris.data>>> y_iris = iris.target
>>> k_means = cluster.KMeans(k=3)>>> k_means.fit(X_iris) KMeans(verbose=0, k=3, max_iter=300, init='k-means++',...>>> print k_means.labels_[::10][1 1 1 1 1 0 0 0 0 0 2 2 2 2 2]>>> print y_iris[::10][0 0 0 0 0 1 1 1 1 1 2 2 2 2 2]
PUG-PE - Julho de 2011
K-Means (Clusterização “Plana”)
• Desempenho do K-Means depende da inicialização dos clusters
• scikits.learn cuida disso por debaixo dos panos!
PUG-PE - Julho de 2011
PCA (Principal Componente Analysis)
PUG-PE - Julho de 2011
PCA (Principal Componente Analysis)
>>> x1 = np.random.normal(size=100)>>> x2 = np.random.normal(size=100)>>> x3 = x1 + x2>>> X = np.c_[x1, x2, x3]
>>> from scikits.learn import decomposition>>> pca = decomposition.PCA()>>> pca.fit(X)>>> print pca.explained_variance_[ 2.77227227e+00, 1.14228495e+00, 2.66364138e-32]
>>> X_reduced = pca.fit_transform(X, n_components=2)>>> X_reduced.shape(100, 2)
PUG-PE - Julho de 2011
Conclusão
=
PUG-PE - Julho de 2011
Fonte
• http://gaelvaroquaux.github.com/scikit-learn-tutorial/
PUG-PE - Julho de 2011
OBRIGADO!