Maison  >  Article  >  développement back-end  >  Sélection du modèle ML.

Sélection du modèle ML.

Barbara Streisand
Barbara Streisandoriginal
2024-09-25 06:30:06700parcourir

ML Model Selection.

1. Introduction

Dans cet article, nous apprendrons comment choisir le meilleur modèle entre plusieurs modèles avec des hyperparamètres variables, dans certains cas nous pouvons avoir plus de 50 modèles différents, savoir comment en choisir un est important pour obtenir le plus performant pour votre ensemble de données .

Nous effectuerons la sélection du modèle à la fois en sélectionnant le meilleur algorithme d'apprentissage et ses meilleurs hyperparamètres.

Mais d'abord que sont les hyperparamètres ? Il s'agit des paramètres supplémentaires définis par l'utilisateur et qui affecteront la manière dont le modèle apprendra ses paramètres. Les Paramètres, quant à eux, sont ce que les modèles apprennent au cours du processus de formation.

2. Utilisation de la recherche exhaustive.

La

Recherche exhaustive consiste à sélectionner le meilleur modèle en recherchant sur une gamme d'hyperparamètres. Pour ce faire, nous utilisons le GridSearchCV de scikit-learn.

Comment fonctionne GridSearchCV :

  1. L'utilisateur définit des ensembles de valeurs possibles pour un ou plusieurs hyperparamètres.
  2. GridSearchCV entraîne un modèle en utilisant chaque valeur et/ou combinaison de valeurs.
  3. Le modèle ayant les meilleures performances est sélectionné comme meilleur modèle.

Exemple
Nous pouvons mettre en place une régression logistique comme algorithme d'apprentissage et régler deux hyperparamètres (C et la pénalité de régularisation). Nous pouvons également spécifier deux paramètres le solveur et les itérations maximales.

Maintenant, pour chaque combinaison de valeurs de C et de pénalité de régularisation, nous entraînons le modèle et l'évaluons à l'aide d'une validation croisée k-fold.
Puisque nous avons 10 valeurs possibles de C, 2 valeurs possibles de reg. pénalité et 5 plis, nous avons un total de (10 x 2 x 5 = 100) modèles candidats parmi lesquels le meilleur est sélectionné.

# Load libraries
import numpy as np
from sklearn import linear_model, datasets
from sklearn.model_selection import GridSearchCV

# Load data
iris = datasets.load_iris()
features = iris.data
target = iris.target

# Create logistic regression
logistic = linear_model.LogisticRegression(max_iter=500, solver='liblinear')

# Create range of candidate penalty hyperparameter values
penalty = ['l1','l2']

# Create range of candidate regularization hyperparameter values
C = np.logspace(0, 4, 10)

# Create dictionary of hyperparameter candidates
hyperparameters = dict(C=C, penalty=penalty)

# Create grid search
gridsearch = GridSearchCV(logistic, hyperparameters, cv=5, verbose=0)

# Fit grid search
best_model = gridsearch.fit(features, target)

# Show the best model
print(best_model.best_estimator_)

# LogisticRegression(C=7.742636826811269, max_iter=500, penalty='l1',
solver='liblinear') # Result

Obtenir le meilleur modèle :

# View best hyperparameters
print('Best Penalty:', best_model.best_estimator_.get_params()['penalty'])
print('Best C:', best_model.best_estimator_.get_params()['C'])

# Best Penalty: l1 #Result
# Best C: 7.742636826811269 # Result

3. Utilisation de la recherche aléatoire.

Ceci est couramment utilisé lorsque vous souhaitez une méthode de calcul moins coûteuse que la recherche exhaustive pour sélectionner le meilleur modèle.

Il convient de noter que la raison pour laquelle RandomizedSearchCV n'est pas intrinsèquement plus rapide que GridSearchCV, mais il atteint souvent des performances comparables à GridSearchCV en moins de temps simplement en testant moins de combinaisons.

Comment fonctionne RandomizedSearchCV :

  1. L'utilisateur fournira des hyperparamètres/distributions (par exemple normale, uniforme).
  2. Les algorithmes rechercheront aléatoirement un nombre spécifique de combinaisons aléatoires des valeurs d'hyperparamètres données sans remplacement.

Exemple

# Load data
iris = datasets.load_iris()
features = iris.data
target = iris.target

# Create logistic regression
logistic = linear_model.LogisticRegression(max_iter=500, solver='liblinear')

# Create range of candidate regularization penalty hyperparameter values
penalty = ['l1', 'l2']

# Create distribution of candidate regularization hyperparameter values
C = uniform(loc=0, scale=4)

# Create hyperparameter options
hyperparameters = dict(C=C, penalty=penalty)

# Create randomized search
randomizedsearch = RandomizedSearchCV(
logistic, hyperparameters, random_state=1, n_iter=100, cv=5, verbose=0,
n_jobs=-1)

# Fit randomized search
best_model = randomizedsearch.fit(features, target)

# Print best model
print(best_model.best_estimator_)

# LogisticRegression(C=1.668088018810296, max_iter=500, penalty='l1',
solver='liblinear') #Result.

Obtenir le meilleur modèle :

# View best hyperparameters
print('Best Penalty:', best_model.best_estimator_.get_params()['penalty'])
print('Best C:', best_model.best_estimator_.get_params()['C'])

# Best Penalty: l1 # Result
# Best C: 1.668088018810296 # Result

Remarque : Le nombre de modèles candidats formés est spécifié dans les paramètres n_iter (nombre d'itérations).

4. Sélection des meilleurs modèles parmi plusieurs algorithmes d'apprentissage.

Dans cette partie, nous verrons comment sélectionner le meilleur modèle en recherchant parmi une gamme d'algorithmes d'apprentissage et leurs hyperparamètres respectifs.

Nous pouvons le faire en créant simplement un dictionnaire d'algorithmes d'apprentissage candidats et de leurs hyperparamètres à utiliser comme espace de recherche pour GridSearchCV.

Étapes :

  1. Nous pouvons définir un espace de recherche qui comprend deux algorithmes d'apprentissage.
  2. Nous spécifions les hyperparamètres et nous définissons leurs valeurs candidates en utilisant le format classificateur[nom de l'hyperparamètre]_.
# Load libraries
import numpy as np
from sklearn import datasets
from sklearn.linear_model import LogisticRegression
from sklearn.ensemble import RandomForestClassifier
from sklearn.model_selection import GridSearchCV
from sklearn.pipeline import Pipeline

# Set random seed
np.random.seed(0)

# Load data
iris = datasets.load_iris()
features = iris.data
target = iris.target

# Create a pipeline
pipe = Pipeline([("classifier", RandomForestClassifier())])

# Create dictionary with candidate learning algorithms and their hyperparameters
search_space = [{"classifier": [LogisticRegression(max_iter=500,
solver='liblinear')],
"classifier__penalty": ['l1', 'l2'],
"classifier__C": np.logspace(0, 4, 10)},
{"classifier": [RandomForestClassifier()],
"classifier__n_estimators": [10, 100, 1000],
"classifier__max_features": [1, 2, 3]}]

# Create grid search
gridsearch = GridSearchCV(pipe, search_space, cv=5, verbose=0)

# Fit grid search
best_model = gridsearch.fit(features, target)

# Print best model
print(best_model.best_estimator_)

# Pipeline(steps=[('classifier',
                 LogisticRegression(C=7.742636826811269, max_iter=500,
                      penalty='l1', solver='liblinear'))])

Le meilleur modèle :
Une fois la recherche terminée, nous pouvons utiliser best_estimator_ pour afficher l'algorithme d'apprentissage et les hyperparamètres du meilleur modèle.

5. Sélection du meilleur modèle lors du prétraitement.

Parfois, nous souhaitons peut-être inclure une étape de prétraitement lors de la sélection du modèle.
La meilleure solution consiste à créer un pipeline qui inclut l'étape de prétraitement et l'un de ses paramètres :

Le premier défi :
GridSeachCv utilise la validation croisée pour déterminer le modèle le plus performant.

Cependant, lors de la validation croisée, nous prétendons que le pli retenu comme ensemble de test n'est pas visible et ne fait donc pas partie de l'ajustement des étapes de prétraitement (par exemple, mise à l'échelle ou standardisation).

Pour cette raison, les étapes de prétraitement doivent faire partie de l'ensemble des actions entreprises par GridSearchCV.

La solution
Scikit-learn fournit le FeatureUnion qui nous permet de combiner correctement plusieurs actions de prétraitement.
étapes :

  1. We use _FeatureUnion _to combine two preprocessing steps: standardize the feature values(StandardScaler) and principal component analysis(PCA) - this object is called the preprocess and contains both of our preprocessing steps.
  2. Next we include preprocess in our pipeline with our learning algorithm.

This allows us to outsource the proper handling of fitting, transforming, and training the models with combinations of hyperparameters to scikit-learn.

Second Challenge:
Some preprocessing methods such as PCA have their own parameters, dimensionality reduction using PCA requires the user to define the number of principal components to use to produce the transformed features set. Ideally we would choose the number of components that produces a model with the greatest performance for some evaluation test metric.
Solution.
In scikit-learn when we include candidate component values in the search space, they are treated like any other hyperparameter to be searched over.

# Load libraries
import numpy as np
from sklearn import datasets
from sklearn.linear_model import LogisticRegression
from sklearn.model_selection import GridSearchCV
from sklearn.pipeline import Pipeline, FeatureUnion
from sklearn.decomposition import PCA
from sklearn.preprocessing import StandardScaler

# Set random seed
np.random.seed(0)

# Load data
iris = datasets.load_iris()
features = iris.data
target = iris.target

# Create a preprocessing object that includes StandardScaler features and PCA
preprocess = FeatureUnion([("std", StandardScaler()), ("pca", PCA())])

# Create a pipeline
pipe = Pipeline([("preprocess", preprocess),
               ("classifier", LogisticRegression(max_iter=1000,
               solver='liblinear'))])

# Create space of candidate values
search_space = [{"preprocess__pca__n_components": [1, 2, 3],
"classifier__penalty": ["l1", "l2"],
"classifier__C": np.logspace(0, 4, 10)}]

# Create grid search
clf = GridSearchCV(pipe, search_space, cv=5, verbose=0, n_jobs=-1)

# Fit grid search
best_model = clf.fit(features, target)

# Print best model
print(best_model.best_estimator_)

# Pipeline(steps=[('preprocess',
     FeatureUnion(transformer_list=[('std', StandardScaler()),
                                    ('pca', PCA(n_components=1))])),
    ('classifier',
    LogisticRegression(C=7.742636826811269, max_iter=1000,
                      penalty='l1', solver='liblinear'))]) # Result


After the model selection is complete we can view the preprocessing values that produced the best model.

Preprocessing steps that produced the best modes

# View best n_components

best_model.best_estimator_.get_params() 
# ['preprocess__pca__n_components'] # Results

5. Speeding Up Model Selection with Parallelization.

That time you need to reduce the time it takes to select a model.
We can do this by training multiple models simultaneously, this is done by using all the cores in our machine by setting n_jobs=-1

# Load libraries
import numpy as np
from sklearn import linear_model, datasets
from sklearn.model_selection import GridSearchCV

# Load data
iris = datasets.load_iris()
features = iris.data
target = iris.target

# Create logistic regression
logistic = linear_model.LogisticRegression(max_iter=500, 
                                           solver='liblinear')

# Create range of candidate regularization penalty hyperparameter values
penalty = ["l1", "l2"]

# Create range of candidate values for C
C = np.logspace(0, 4, 1000)

# Create hyperparameter options
hyperparameters = dict(C=C, penalty=penalty)

# Create grid search
gridsearch = GridSearchCV(logistic, hyperparameters, cv=5, n_jobs=-1, 
                             verbose=1)

# Fit grid search
best_model = gridsearch.fit(features, target)

# Print best model
print(best_model.best_estimator_)

# Fitting 5 folds for each of 2000 candidates, totalling 10000 fits
# LogisticRegression(C=5.926151812475554, max_iter=500, penalty='l1',
                                                  solver='liblinear')

6. Speeding Up Model Selection ( Algorithm Specific Methods).

This a way to speed up model selection without using additional compute power.

This is possible because scikit-learn has model-specific cross-validation hyperparameter tuning.

Sometimes the characteristics of a learning algorithms allows us to search for the best hyperparameters significantly faster.

Example:
LogisticRegression is used to conduct a standard logistic regression classifier.
LogisticRegressionCV implements an efficient cross-validated logistic regression classifier that can identify the optimum value of the hyperparameter C.

# Load libraries
from sklearn import linear_model, datasets

# Load data
iris = datasets.load_iris()
features = iris.data
target = iris.target

# Create cross-validated logistic regression
logit = linear_model.LogisticRegressionCV(Cs=100, max_iter=500,
                                            solver='liblinear')

# Train model
logit.fit(features, target)

# Print model
print(logit)

# LogisticRegressionCV(Cs=100, max_iter=500, solver='liblinear')

Note:A major downside to LogisticRegressionCV is that it can only search a range of values for C. This limitation is common to many of scikit-learn's model-specific cross-validated approaches.

I hope this Article was helpful in creating a quick overview of how to select a machine learning model.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn