[PYTHON] Essayez le modèle de régression de sklearn à partir de zéro

introduction

Nous allons essayer 28 types de modèles de régression sklearn et générer un graphique de précision.

2020-05-17_11h15_01.png

En tant qu'outil pour essayer de nombreux modèles d'apprentissage automatique, il existe de nombreux outils merveilleux et pratiques tels que le système AutoML et récemment PyCaret, mais je souhaite préparer un modèle moi-même. Puisqu'il y avait quelque chose, je laisserai un mémorandum.

environnement

code

Importer un modèle de régression

Importez les modèles requis et combinez toutes les instances de modèle de régression.

from sklearn.linear_model import LinearRegression, Ridge, Lasso, ElasticNet, SGDRegressor
from sklearn.linear_model import PassiveAggressiveRegressor, ARDRegression, RidgeCV
from sklearn.linear_model import TheilSenRegressor, RANSACRegressor, HuberRegressor
from sklearn.neural_network import MLPRegressor
from sklearn.svm import SVR, LinearSVR
from sklearn.neighbors import KNeighborsRegressor
from sklearn.gaussian_process import GaussianProcessRegressor
from sklearn.tree import DecisionTreeRegressor
from sklearn.experimental import enable_hist_gradient_boosting
from sklearn.ensemble import RandomForestRegressor, AdaBoostRegressor, ExtraTreesRegressor, HistGradientBoostingRegressor
from sklearn.ensemble import BaggingRegressor, GradientBoostingRegressor, VotingRegressor, StackingRegressor
from sklearn.preprocessing import PolynomialFeatures
from sklearn.pipeline import Pipeline
from sklearn.cross_decomposition import PLSRegression

reg_dict = {"LinearRegression": LinearRegression(),
            "Ridge": Ridge(),
            "Lasso": Lasso(),
            "ElasticNet": ElasticNet(), 
            "Polynomial_deg2": Pipeline([('poly', PolynomialFeatures(degree=2)),('linear', LinearRegression())]),
            "Polynomial_deg3": Pipeline([('poly', PolynomialFeatures(degree=3)),('linear', LinearRegression())]),
            "Polynomial_deg4": Pipeline([('poly', PolynomialFeatures(degree=4)),('linear', LinearRegression())]),
            "Polynomial_deg5": Pipeline([('poly', PolynomialFeatures(degree=5)),('linear', LinearRegression())]),
            "KNeighborsRegressor": KNeighborsRegressor(n_neighbors=3),
            "DecisionTreeRegressor": DecisionTreeRegressor(),
            "RandomForestRegressor": RandomForestRegressor(),
            "SVR": SVR(kernel='rbf', C=1e3, gamma=0.1, epsilon=0.1),
            "GaussianProcessRegressor": GaussianProcessRegressor(),
            "SGDRegressor": SGDRegressor(),
            "MLPRegressor": MLPRegressor(hidden_layer_sizes=(10,10), max_iter=100, early_stopping=True, n_iter_no_change=5),
            "ExtraTreesRegressor": ExtraTreesRegressor(n_estimators=100), 
            "PLSRegression": PLSRegression(n_components=10),
            "PassiveAggressiveRegressor": PassiveAggressiveRegressor(max_iter=100, tol=1e-3),
            "TheilSenRegressor": TheilSenRegressor(random_state=0),
            "RANSACRegressor": RANSACRegressor(random_state=0),
            "HistGradientBoostingRegressor": HistGradientBoostingRegressor(),
            "AdaBoostRegressor": AdaBoostRegressor(random_state=0, n_estimators=100),
            "BaggingRegressor": BaggingRegressor(base_estimator=SVR(), n_estimators=10),
            "GradientBoostingRegressor": GradientBoostingRegressor(random_state=0),
            "VotingRegressor": VotingRegressor([('lr', LinearRegression()), ('rf', RandomForestRegressor(n_estimators=10))]),
            "StackingRegressor": StackingRegressor(estimators=[('lr', RidgeCV()), ('svr', LinearSVR())], final_estimator=RandomForestRegressor(n_estimators=10)),
            "ARDRegression": ARDRegression(),
            "HuberRegressor": HuberRegressor(),
                    }

** Attention 1 ** Les arguments de chaque modèle de régression sont assez texturaux, et le code ci-dessus n'est qu'un exemple. Lors de son utilisation, il est fortement recommandé de le définir sur une valeur appropriée en fonction des données ou de le combiner avec une optimisation hyper paramètre telle que la recherche de grille.

** Attention 2 ** Polynomial_deg2 ~ 5 est une régression par une fonction d'ordre 2 ~ 5ème. Voir la formule sklearn pour une description des autres modèles.

Génération et apprentissage de données de régression

Utilisez make_regression de sklearn pour générer des données pour la régression.

De plus, tous les modèles sont entraînés et déduits 10 fois chacun, et triés par ordre de précision (MAPE est utilisé ici).

from sklearn.model_selection import train_test_split
import random
from sklearn.datasets import make_regression
import numpy as np

def mean_absolute_percentage_error(y_true, y_pred):
    """MAPE"""
    return np.mean(np.abs((y_true - y_pred) / y_true)) * 100

test_size = 0.3  #Rapport de division
N_trials = 10  #Nombre d'essais

#Générer des données à régresser
x, y = make_regression(random_state=12, 
                       n_samples=100, 
                       n_features=10,
                       n_informative=4,
                       noise=10.0,
                       bias=0.0)

mape_dict = {reg_name:[] for reg_name in reg_dict.keys()}  #Voûte de précision

for i in range(N_trials):
    print(f"Trial {i+1}")
    random_state = random.randint(0, 1000)
    x_train, x_test, y_train, y_test = train_test_split(x, y, test_size=test_size, random_state=random_state)

    for reg_name, reg in reg_dict.items():
        reg.fit(x_train,y_train)
        y_pred = reg.predict(x_test)
        mape = mean_absolute_percentage_error(y_test, y_pred)  #Calculer MAPE
        mape_dict[reg_name].append(mape)  #Stockage

#Trier par la valeur moyenne de MAPE
mape_dict_sorted = {key: value for key, value in reversed(sorted(mape_dict.items(), key=lambda x:np.mean(x[1])))}

Graphique des résultats

Dans ce qui précède, MAPE a été mesuré 10 fois pour tous les modèles et trié par la valeur moyenne de MAPE.

Lors de l'évaluation de la qualité d'un modèle d'apprentissage automatique, en plus de la valeur moyenne de la précision, nous voulons également examiner le degré de dispersion (indice tel que la dispersion).

Par conséquent, dessinez un diagramme de moustaches.

Plus le MAPE est petit, mieux c'est, donc dans la figure, le modèle supérieur est meilleur, et plus les moustaches sont petites, plus le modèle est stable.

import matplotlib.pyplot as plt
import matplotlib.cm as cm
from matplotlib.colors import Normalize

plt.rcParams["font.size"] = 18  #Augmenter la taille de la police
scalarMap = cm.ScalarMappable(norm=Normalize(vmin=0, vmax=len(mape_dict)), cmap=plt.get_cmap('gist_rainbow_r'))

plt.figure(figsize=(15,9))
box=plt.boxplot(mape_dict_sorted.values(), vert=False, patch_artist=True,labels=mape_dict_sorted.keys())
for i, patch in enumerate(box['boxes']):
    patch.set_facecolor(scalarMap.to_rgba(i))
plt.title("MAPE Box Plot")
plt.xlabel("MAPE")
plt.ylabel("Regressor Name")
plt.show()

2020-05-17_11h15_01.png

Recommended Posts

Essayez le modèle de régression de sklearn à partir de zéro
Essayez le tutoriel officiel de Django depuis le début
Apprentissage profond / Apprentissage profond à partir de zéro 2-Essayez de déplacer GRU
Apprentissage profond à partir de zéro
Django memo n ° 1 à partir de zéro
Régression avec un modèle linéaire
Essayez la régression avec TensorFlow
Essayez d'évaluer les performances du modèle d'apprentissage automatique / de régression
Apprentissage profond à partir de zéro 1 à 3 chapitres
Django à partir de zéro (partie: 2)
Django à partir de zéro (partie: 1)
Utiliser le modèle django de l'interpréteur
Appelez dlm depuis python pour exécuter un modèle de régression à coefficient variable dans le temps
Mémo d'auto-apprentissage "Deep Learning from scratch" (n ° 13) Essayez d'utiliser Google Colaboratory