Teaching - TAL

Page principale de l'UE


Traitement Automatique de la Langue

Tutoriel sklearn

sklearn est une une bibliothèque python très utilisée en machine learning. Il est nécessaire d'être à l'aise dans la manipulation des matrices numpy pour profiter de sklearn.

Un tutoriel numpy est disponible ici

Chargement des données

Durant ce TP, nous allons utiliser des données textuelles chargées à l'aide des codes proposés dans les sections précédentes. Si vous voulez tester sklearn sur des données numériques, vous pouvez utiliser les liens ci-dessous.

Les bonnes sources de données:

Construction d'un classifieur

La force de sklearn réside dans le nombre de classifieurs efficaces implémentés (ou wrappé) accessible directement via une syntaxe objet unifiée:

  • Naive Bayes
  • SVM
  • Arbre de décision
  • forêts aléatoires
  • ...

Tous les classifieurs disposent d'un paramétrage par défaut mais il est vivement conseillé de vérifier ce paramétrage.

La documentation est disponible en ligne avec des exemples ici

import numpy as np
import sklearn.naive_bayes as nb
from sklearn import svm
from sklearn import linear_model as lin

# données ultra basiques, à remplacer par vos corpus vectorisés
X = np.array([[0., 0.], [1., 1.]])
y = np.array([0, 1])

# SVM
clf = svm.LinearSVC()
# Naive Bayes
clf = nb.MultinomialNB()
# regression logistique
clf = lin.LogisticRegression()

# apprentissage
clf.fit(X, y)  
clf.predict([[2., 2.]]) # usage sur une nouvelle donnée

Les trois modèles proposés ici disposent tous d'(au moins) un paramètre de régularisation: vous devrez aller le chercher dans la documentation et jouer avec.

Evaluation des performances

L'évaluation des modèles présente autant d'enjeux que leur apprentissage. C'est aussi une force de sklearn.

Solution 1 Calcul de score seul

La syntaxe fonctionnelle de python permet de donner un classifieur en argument de la validation croisée: tout se fait tout seul!

from sklearn import svm
from sklearn import cross_validation

# usage en boucle implicite
# le classifieur est donné en argument, tout ce fait implicitement (possibilité de paralléliser avec @@n_jobs@@)
scores = cross_validation.cross_val_score( clf, X, y, cv=5)

Solution 2 Split simplifié

# usage basique: split train/test
X_train, X_test, y_train, y_test = cross_validation.train_test_split( X, y, test_size=0.4, random_state=0)

# apprentissage + test sur les ensembles...

Solution 3 Boucle de validation croisée simplifiée

# boucle explicite (pour les traitements plus complexe)
skf = cross_validation.StratifiedKFold(labels, nFolds)
for train, test in skf:
    train # contient les indices de train
    xtrain = X[train]
    ytrain = y[train]
    test # contient les indices de test