<jupyter_start><jupyter_text>グリッドサーチ<jupyter_code>import numpy as np

from sklearn.metrics import classification_report
from sklearn import model_selection
from sklearn.ensemble import ExtraTreesClassifier

# ファイルを読み込む
input_file = './data/data_random_forests.txt'
data = np.loadtxt(input_file, delimiter=',')

# Xは最終列までの値、yは最終列
X, y = data[:, :-1], data[:, -1]

# yのラベル地に基づいてclass_0とclass_1、class_2で分ける
class_0 = np.array(X[y==0])
class_1 = np.array(X[y==1])
class_2 = np.array(X[y==2])

# 訓練用データを75%、テスト用データは25%
# random_stateは結果に再現性を求める時に指定すると良い。
X_train, X_test, y_train, y_test = model_selection.train_test_split(X, y, test_size=0.25, random_state=5)

# ひとつの値を固定し、他のパラメータを変化させて最適値を求める
# n_estimatorsが100の時、max_depthを2, 4, 7, 12, 16で変化させる
# max_depthが4の時、n_estimatorsを25, 50, 100, 150で変化させる

#parameter_grid = [{'n_estimators': [100], 'max_depth': [2, 4, 7, 12, 16]},
#                 {'max_depth': [4], 'n_estimators': [25, 50, 100, 150]}
#                 ]

# 両方のパラメータを変化させつつt最適解を求める
parameter_grid = [{'n_estimators': [25, 50, 100, 150], 'max_depth': [2, 4, 7, 12, 16]}]

# 評価指標を適合率と再現率にする
metrics = ['precision_weighted', 'recall_weighted']

# 評価指標毎にグリッドサーチをする
for metric in metrics:
    print("\n##### Searching optimal parameters for", metric) 
    
    # グリッドサーチするための分類器を作る
    classifier = model_selection.GridSearchCV(ExtraTreesClassifier(random_state=0), parameter_grid, cv=5, scoring=metric)
    
    # 訓練
    classifier.fit(X_train, y_train)
    
    # パラメータの組み合わせ毎に評価指標のスコアを表示する
    print("\nGrid scores for the parameter grid:")
    for params, avg_score in zip(classifier.cv_results_['params'], classifier.cv_results_['mean_test_score']):
        print(params, '-->', round(avg_score, 3))
    
    print("\nBest parameters:", classifier.best_params_)
    
    y_pred = classifier.predict(X_test)
    print("\nPerformance report:\n") 
    print(classification_report(y_test, y_pred))<jupyter_output>##### Searching optimal parameters for precision_weighted

Grid scores for the parameter grid:
{'max_depth': 2, 'n_estimators': 25} --> 0.838
{'max_depth': 2, 'n_estimators': 50} --> 0.845
{'max_depth': 2, 'n_estimators': 100} --> 0.847
{'max_depth': 2, 'n_estimators': 150} --> 0.848
{'max_depth': 4, 'n_estimators': 25} --> 0.846
{'max_depth': 4, 'n_estimators': 50} --> 0.84
{'max_depth': 4, 'n_estimators': 100} --> 0.841
{'max_depth': 4, 'n_estimators': 150} --> 0.842
{'max_depth': 7, 'n_estimators': 25} --> 0.843
{'max_depth': 7, 'n_estimators': 50} --> 0.841
{'max_depth': 7, 'n_estimators': 100} --> 0.844
{'max_depth': 7, 'n_estimators': 150} --> 0.849
{'max_depth': 12, 'n_estimators': 25} --> 0.832
{'max_depth': 12, 'n_estimators': 50} --> 0.829
{'max_depth': 12, 'n_estimators': 100} --> 0.836
{'max_depth': 12, 'n_estimators': 150} --> 0.832
{'max_depth': 16, 'n_estimators': 25} --> 0.815
{'max_depth': 16, 'n_estimators': 50} --> 0.817
{'max_depth': 16, 'n_estimators': 100} --> 0.[...]
{'fraction_non_alphanumeric': 0.17824153267191242, 'fraction_numerical': 0.0773178241532672, 'mean_word_length': 4.824701195219124, 'pattern_counts': {'":': 0, '<': 4, '<?xml version=': 0, '>': 24, 'https://': 0, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 0, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'chain_length': '1', 'dir': 'jupyter-structured-clean-dedup', 'id': '444930', 'license': 'Unlicense', 'n_tokens_mistral': 1510, 'n_tokens_neox': 1317, 'n_words': 240, 'path': 'Ex/Chapter3/Chapter3-6.ipynb', 'repo_name': 'tryoutlab/python-ai-oreilly', 'size': '2923'}