Es gibt einige Parameter, die je nach Modell im Voraus festgelegt werden müssen. (Zum Beispiel die Anzahl der k-Mittel-Cluster, die Stärke des SVC-Regularisierungsterms, die Tiefe des Entscheidungsbaums usw.)
Es wird als "Hyperparameter" bezeichnet, aber das Problem ist, dass sich die Genauigkeit abhängig vom Wert des Hyperparameters ** erheblich ** ändern kann, selbst wenn es sich um dasselbe Modell handelt.
Hyper-Parameter-Tuning ist eine gute Entscheidung anhand von Trainingsdaten! !!
Von den Abstimmungsmethoden werden wir uns mit zwei befassen, der Rastersuche und der Zufallssuche. Grob gesagt, wenn es einen Hyperparameter α gibt, wird er gemäß dem folgenden Fluss ausgeführt.
・ Geben Sie für die Rastersuche im Voraus den ** Bereich ** von α (z. B. 0,1,2,3,4,5 usw.) an und versuchen Sie tatsächlich, die Genauigkeit des Modells mit diesem Parameter zu ermitteln, der am besten ist. Mach ihn zu einem Parameter.
Wie oben erwähnt, sind beide nicht das Verfahren zum Entscheiden des Hyperparameters α, wie er ist. Zuvor können Sie sehen, dass das Verfahren darin besteht, den ** Bereich und die Verteilung ** zu bestimmen und die tatsächlichen Trainingsdaten zu verwenden. (Weitere Informationen finden Sie unter Ressourcen!)
Die beiden oben genannten sind Standardausrüstung in Scikit-Learn, also werden wir sie verwenden! Code für python3.5.1, scikit_learn-0.18.1.
Dieses Mal nehme ich Daten aus dem Machine Learning Repository von UCI und verwende zwei Klassifizierer aus RandomForestClassifier, um die Parameter zu optimieren. Der vollständige Code wurde auf [github] hochgeladen (https://github.com/ragAgar/qiita/blob/master/Grid_and_Random_Search.ipynb).
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)
Setzen Sie der Übersichtlichkeit halber die Spalte, die Sie vorhersagen möchten, auf Target und die anderen auf ~.
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)
Unterteilt in Zugdaten und Testdaten
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()))
Ausgabeergebnis 1(Standard)
[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
Es stellte sich heraus, dass die korrekte Antwortrate der Zugdaten 1,0 und die korrekte Antwortrate der Testdaten 0,91 beträgt. Von hier aus werden wir die Rastersuche und die Zufallssuche implementieren. Von nun an wird auf Referenz 3 verwiesen.
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_)
Ausgabeergebnis 2(Rastersuche)
[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
Alle Genauigkeit wie die gesamte korrekte Antwortrate und der F1-Score wurden erhöht! !!
Die zufällige Suche verwendet scipy, um die Verteilung darzustellen, der die Parameter folgen. Diesmal entspricht die Anzahl der Iterationen der Rastersuche.
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_)
Ausgabeergebnis 3(Zufällige Suche)
[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
Wir haben festgestellt, dass alle Artikel im Vergleich zum Standardfall um 2% gestiegen sind!
Die Genauigkeit sowohl der Rastersuche als auch der Zufallssuche hat sich verbessert! Ich denke jedoch, dass der Effekt schwer zu erkennen ist, da ich diesmal ursprünglich Daten mit hoher Genauigkeit ausgewählt habe. Es ist möglicherweise einfacher, den Effekt der Optimierung zu erkennen, wenn Sie Daten anprobieren, die nicht korrekt sind.
Der vollständige Code wurde auf [github] hochgeladen (https://github.com/ragAgar/qiita/blob/master/Grid_and_Random_Search.ipynb).
Verweise