Modèles¶
Il y a trois façons de mettre un modèle dans la comparaison : par son nom FitRank, par le chemin de sa classe scikit-learn, ou en enregistrant le vôtre.
Modèles fournis¶
Chaque modèle a une petite grille par défaut, cherchée quand la configuration
ne donne pas de params. fitrank list models --task classification affiche
les noms.
Classification¶
| Nom | Classe scikit-learn | Grille par défaut |
|---|---|---|
decision_tree |
DecisionTreeClassifier |
{class_weight: [null, balanced], max_depth: [null, 5, 10]} |
gradient_boosting |
GradientBoostingClassifier |
{learning_rate: [0.05, 0.1], n_estimators: [100, 200]} |
knn |
KNeighborsClassifier |
{n_neighbors: [3, 5, 11], weights: [uniform, distance]} |
logistic_regression |
LogisticRegression |
{C: [0.1, 1, 10], class_weight: [null, balanced]} |
naive_bayes |
GaussianNB |
{var_smoothing: [1.0e-09, 1.0e-08, 1.0e-07]} |
random_forest |
RandomForestClassifier |
{class_weight: [null, balanced], max_depth: [null, 10], n_estimators: [100, 300]} |
svm |
SVC |
{C: [0.1, 1, 10], class_weight: [null, balanced], kernel: [linear, rbf]} |
Régression¶
| Nom | Classe scikit-learn | Grille par défaut |
|---|---|---|
decision_tree |
DecisionTreeRegressor |
{max_depth: [null, 5, 10]} |
gradient_boosting |
GradientBoostingRegressor |
{learning_rate: [0.05, 0.1], n_estimators: [100, 200]} |
knn |
KNeighborsRegressor |
{n_neighbors: [3, 5, 11], weights: [uniform, distance]} |
lasso |
Lasso |
{alpha: [0.01, 0.1, 1]} |
linear_regression |
LinearRegression |
{fit_intercept: [true, false]} |
polynomial_regression |
Pipeline (PolynomialFeatures + LinearRegression) |
{poly__degree: [2, 3]} |
random_forest |
RandomForestRegressor |
{max_depth: [null, 10], n_estimators: [100, 300]} |
ridge |
Ridge |
{alpha: [0.1, 1, 10]} |
svr |
SVR |
{C: [0.1, 1, 10], kernel: [linear, rbf]} |
params dans le YAML remplace la grille par défaut, il n'est jamais fusionné
avec elle :
models:
- name: random_forest
params: {n_estimators: [500]} # seul n_estimators=500 est essayé
N'importe quel modèle scikit-learn, par sa classe¶
Un modèle que FitRank ne nomme pas peut être donné par le chemin de sa classe :
models:
- name: random_forest
- class: sklearn.ensemble.ExtraTreesClassifier
params: {n_estimators: [100, 300]} # sans params : ses paramètres par défaut
Il apparaît dans le classement sous le nom ExtraTreesClassifier. FitRank
vérifie que la classe existe, que c'est un estimateur scikit-learn, qu'elle
correspond à la tâche (un régresseur est refusé en classification) et qu'elle
se crée sans arguments.
Seuls les modules de confiance sont importés
Un fichier YAML ne doit jamais pouvoir exécuter de code. FitRank n'importe
que des classes de sklearn : tout autre chemin (os.system,
builtins.eval...) est refusé avant le moindre import. Pour utiliser un
autre paquet compatible scikit-learn en qui vous avez confiance, déclarez-le
dans project.allowed_modules :
project:
allowed_modules: [xgboost, mon_paquet.modeles] # installé ou importable
models:
- class: xgboost.XGBClassifier
Enregistrer votre propre modèle¶
Depuis Python, register_model ajoute un modèle sous un nom, avec sa grille
par défaut. Il s'utilise ensuite par son nom, comme les modèles fournis :
from sklearn.ensemble import ExtraTreesClassifier
from fitrank import Benchmark, register_model
@register_model("extra_trees", task="classification")
def extra_trees():
# Un estimateur neuf, et la grille cherchée quand la configuration ne donne pas de params.
return ExtraTreesClassifier(), {"n_estimators": [100, 300]}
results = Benchmark(
data="iris.csv", target="species", task="classification", models=["extra_trees", "svm"]
).run()
La fonction est appelée une fois par candidat : chacun reçoit un estimateur
neuf. Un même nom s'enregistre une fois par tâche. Depuis le fichier YAML,
donnez plutôt votre modèle par le chemin de sa classe, avec son paquet dans
project.allowed_modules.
Enregistrer votre propre réduction¶
register_reduction marche de la même façon. La fonction reçoit la tâche et
renvoie un transformateur et sa grille par défaut :
from sklearn.decomposition import TruncatedSVD
from fitrank import register_reduction
@register_reduction("svd")
def svd(task):
return TruncatedSVD(), {"n_components": [2, 5]}
reduction:
- none
- svd: {n_components: [3]}