Certains paramètres doivent être décidés à l'avance en fonction du modèle. (Par exemple, le nombre de clusters k-means, la force du terme de régularisation SVC, la profondeur de l'arbre de décision, etc.)
On l'appelle "hyperparamètre", mais le problème est que même s'il s'agit du même modèle, la précision peut changer ** significativement ** en fonction de la valeur de l'hyperparamètre.
Le réglage des hyper paramètres consiste à bien le décider en utilisant les données d'entraînement! !!
Parmi les méthodes de réglage, nous en traiterons deux, la recherche de grille et la recherche aléatoire. En gros, s'il existe un hyper paramètre α, il sera exécuté selon le flux suivant.
・ Pour la recherche de grille, spécifiez la ** plage ** de α (ex. 0,1,2,3,4,5, etc.) à l'avance, et essayez réellement d'obtenir la précision du modèle avec ce paramètre, qui est le meilleur. Faites-lui un paramètre.
-Pour une recherche aléatoire, spécifiez la ** distribution ** (ex. Distribution normale avec moyenne 0, écart-type 1 etc.) que α suit à l'avance, extrayez-la au hasard et utilisez réellement ce paramètre pour déterminer la précision du modèle. Regardez, définissez le meilleur comme paramètre.
Comme mentionné ci-dessus, les deux ne sont pas la procédure de décision de l'hyper paramètre α tel quel. Avant cela, vous pouvez voir que la procédure consiste à déterminer la ** plage et la distribution ** et à utiliser les données d'entraînement réelles. (Voir les ressources pour plus de détails!)
Les deux ci-dessus sont des équipements standard dans scikit-learn, nous allons donc les utiliser! Code pour python3.5.1, scikit_learn-0.18.1.
Cette fois, je prends les données du référentiel d'apprentissage machine de l'UCI et j'utilise deux classificateurs de RandomForestClassifier pour régler les paramètres. Le code complet a été téléchargé sur github.
Grid_and_Random_Search.ipynb
df = pd.read_csv('https://archive.ics.uci.edu/ml/machine-learning-databases'
'/breast-cancer-wisconsin/wdbc.data', header=None)
Dans un souci de clarté, définissez la colonne que vous souhaitez prédire sur Target et les autres sur un ~.
Grid_and_Random_Search.ipynb
columns_list = []
for i in range(df.shape[1]):
columns_list.append("a%d"%i)
columns_list[1] = "Target"
df.columns = columns_list
Grid_and_Random_Search.ipynb
y = df["Target"].values
X = df.drop(["a0","Target"],axis=1)
Divisé en données de train et données de test
Grid_and_Random_Search.ipynb
#split X,y to train,test(0.5:0.5)
from sklearn.cross_validation import train_test_split
X_train,X_test,y_train,y_test = train_test_split(X,y,test_size=0.5,random_state=2017)
Grid_and_Random_Search.ipynb
from sklearn.metrics import classification_report
def model_check(model):
model.fit(X_train,y_train)
y_train_pred = classification_report(y_train,model.predict(X_train))
y_test_pred = classification_report(y_test,model.predict(X_test))
print("""【{model_name}】\n Train Accuracy: \n{train}
\n Test Accuracy: \n{test}""".format(model_name=model.__class__.__name__, train=y_train_pred, test=y_test_pred))
print(model_check(RandomForestClassifier()))
Résultat de sortie 1(Défaut)
[RandomForestClassifier]
Train Accuracy:
precision recall f1-score support
B 1.00 1.00 1.00 67
M 1.00 1.00 1.00 75
avg / total 1.00 1.00 1.00 142
Test Accuracy:
precision recall f1-score support
B 0.89 0.93 0.91 72
M 0.93 0.89 0.91 70
avg / total 0.91 0.91 0.91 142
Il s'est avéré que le taux de réponse correct des données de train est de 1,0 et le taux de réponse correct des données de test est de 0,91. À partir de là, nous implémenterons la recherche de grille et la recherche aléatoire. Désormais, il est fait référence à la référence 3.
Grid_and_Random_Search.ipynb
#Grid search
from sklearn.grid_search import GridSearchCV
# use a full grid over all parameters
param_grid = {"max_depth": [2,3, None],
"n_estimators":[50,100,200,300,400,500],
"max_features": [1, 3, 10],
"min_samples_split": [2, 3, 10],
"min_samples_leaf": [1, 3, 10],
"bootstrap": [True, False],
"criterion": ["gini", "entropy"]}
forest_grid = GridSearchCV(estimator=RandomForestClassifier(random_state=0),
param_grid = param_grid,
scoring="accuracy", #metrics
cv = 3, #cross-validation
n_jobs = 1) #number of core
forest_grid.fit(X_train,y_train) #fit
forest_grid_best = forest_grid.best_estimator_ #best estimator
print("Best Model Parameter: ",forest_grid.best_params_)
Résultat de sortie 2(Recherche de grille)
[RandomForestClassifier]
Train Accuracy:
precision recall f1-score support
B 0.99 0.99 0.99 67
M 0.99 0.99 0.99 75
avg / total 0.99 0.99 0.99 142
Test Accuracy:
precision recall f1-score support
B 0.96 0.89 0.92 72
M 0.89 0.96 0.92 70
avg / total 0.92 0.92 0.92 142
Toute précision telle que le taux total de réponses correctes et le score f1 a augmenté! !!
La recherche aléatoire utilise scipy pour représenter la distribution que les paramètres suivent. Cette fois, le nombre d'itérations est le même que celui de la recherche de grille.
Grid_and_Random_Search.ipynb
#Random search
from sklearn.grid_search import RandomizedSearchCV
from scipy.stats import randint as sp_randint
param_dist = {"max_depth": [3, None], #distribution
"n_estimators":[50,100,200,300,400,500],
"max_features": sp_randint(1, 11),
"min_samples_split": sp_randint(2, 11),
"min_samples_leaf": sp_randint(1, 11),
"bootstrap": [True, False],
"criterion": ["gini", "entropy"]}
forest_random = RandomizedSearchCV( estimator=RandomForestClassifier( random_state=0 ),
param_distributions=param_dist,
cv=3, #CV
n_iter=1944, #interation num
scoring="accuracy", #metrics
n_jobs=1, #num of core
verbose=0,
random_state=1)
forest_random.fit(X,y)
forest_random_best = forest_random.best_estimator_ #best estimator
print("Best Model Parameter: ",forest_random.best_params_)
Résultat de sortie 3(Recherche aléatoire)
[RandomForestClassifier]
Train Accuracy:
precision recall f1-score support
B 1.00 1.00 1.00 67
M 1.00 1.00 1.00 75
avg / total 1.00 1.00 1.00 142
Test Accuracy:
precision recall f1-score support
B 0.94 0.92 0.93 72
M 0.92 0.94 0.93 70
avg / total 0.93 0.93 0.93 142
Nous avons constaté que tous les articles ont augmenté de 2% par rapport au cas par défaut!
La précision de la recherche de grille et de la recherche aléatoire s'est améliorée! Cependant, je pense que l'effet est devenu difficile à voir car j'ai sélectionné à l'origine des données avec une grande précision cette fois-ci. Il peut être plus facile de voir l'effet du réglage si vous essayez des données qui ne sont pas exactes.
Le code complet a été téléchargé sur github.
Les références
Recommended Posts