機械学習モデルのチューニング
記事ディレクトリ
パラメータの調整
1. パラメータチューニングの目的
- パラメーター チューニングとは、モデルのパラメーターを調整して、モデルのパフォーマンスが最高になるパラメーターを見つけることです。パラメーター調整の目標は、モデル全体の偏差と分散の間の優れた調和を達成することです。
- パラメータは、プロセスに影響されるパラメータとサブモデルに影響されるパラメータの 2 つのカテゴリに分類できます。
- プロセス影響パラメーターとは、具体的には、サブモデルが変わらないことを前提として、「サブモデルの数(n_estimators)」や「学習率(learning_rage)」などのパラメーターを調整し、学習プロセスを変更することで改善するものです。モデル全体のパフォーマンス。サブモデル影響クラスパラメータは、「ツリーの最大深さ(max_ Depth)」や「分割基準(criterion)」などのパラメータを調整してサブモデルの性能を変化させるものです。これにより、モデル全体のパフォーマンスが向上します。バギングのトレーニング プロセスは分散を減らすことを目的としていますが、ブースティングのトレーニング プロセスはバイアスを減らすことを目的としており、クラスに影響を与えるプロセスのパラメーターはモデル全体のパフォーマンスに大きな変化を引き起こす可能性があります。
2. モデル全体のパフォーマンスに対するパラメーターの影響
* 複雑さを軽減し、複雑さに大きな影響を与えるパラメーターを選択し、その単調性を検討してから、状況に応じて、単調ではないパラメーターや複雑さを増大させるパラメーターについて、複雑さを最大限に軽減できるパラメーターの調整に重点を置きます。ほとんどの場合、後退することもできます。(表の上から下に向かうにつれて、推奨パラメータ調整の度合いが徐々に低くなります)。
3. グリッド検索
グリッドサーチは、全数検索を行うためのパラメータチューニング手法です。すべてのパラメータ選択候補のうち、ループ トラバーサルを通じてあらゆる可能性が試行され、最高のパフォーマンスを持つパラメータが最終結果となります。その原理は、配列内の最大値を見つけるのと似ています。2 つのパラメータを持つモデルを例にとると、パラメータ a には 3 つの可能性があり、パラメータ b には 4 つの可能性があります。すべての可能性をリストすると、各単位がグリッドである 3*4 のテーブルとして表現できます。ループ処理は次のようになります。グリッド内を走査して検索するのと似ているため、グリッド検索という名前が付けられています。
以下はグリッド サーチの簡単な例です。iris データセットを使用して、SVC モデルのパラメーターに対してグリッド サーチの調整が実行されます。プロセスは次の表に示されています。
C=0.001 | C=0.01 | C=0.1 | C=1 | C=10 | |
---|---|---|---|---|---|
ガンマ=0.001 | SVC(C=0.001、ガンマ=0.001) | SVC(C=0.01、ガンマ=0.001) | SVC(C=0.1、ガンマ=0.001) | SVC(C=1、ガンマ=0.001) | SVC(C=10、ガンマ=0.001) |
ガンマ=0.01 | SVC(C=0.001、ガンマ=0.01) | SVC(C=0.01、ガンマ=0.01) | SVC(C=0.1、ガンマ=0.01) | SVC(C=1、ガンマ=0.01) | SVC(C=10、ガンマ=0.01) |
ガンマ=0.1 | SVC(C=0.001、ガンマ=0.1) | SVC(C=0.01、ガンマ=0.1) | SVC(C=0.1、ガンマ=0.1) | SVC(C=1、ガンマ=0.1) | SVC(C=10、ガンマ=0.1) |
ガンマ=1 | SVC(C=0.001、ガンマ=1) | SVC(C=0.01、ガンマ=1) | SVC(C=0.1、ガンマ=1) | SVC(C=1、ガンマ=1) | SVC(C=10、ガンマ=1) |
ガンマ=10 | SVC(C=0.001、ガンマ=10) | SVC(C=0.01、ガンマ=10) | SVC(C=0.1、ガンマ=10) | SVC(C=1、ガンマ=10) | SVC(C=10、ガンマ=10) |
ガンマ=100 | SVC(C=0.001、ガンマ=100) | SVC(C=0.01、ガンマ=100) | SVC(C=0.1、ガンマ=100) | SVC(C=1、ガンマ=100) | SVC(C=10、ガンマ=100) |
- 具体的なコードとチューニング結果は以下の通りです。
from sklearn.datasets import load_iris
from sklearn.svm import SVC
from sklearn.model_selection import train_test_split
iris = load_iris()
X_train, X_test, y_train, y_test = train_test_split(iris.data, iris.target, stratify=iris.target, random_state=0) # stratify=y 是根据 y 值对训练和数据集各类别进行训练数据和测试数据等比划分,避免出现训练集和测试集种某种类别失衡
print(f"Size of training set:{
X_train.shape[0]}\nSize of testing set:{
X_test.shape[0]}")
# >>>网格搜索开始>>>
best_score = 0
for gamma in [0.001, 0.01, 0.1, 1, 10, 100]:
for C in [0.001, 0.01, 0.1, 1, 10]:
svm = SVC(gamma=gamma, C=C) # 对于每种参数可能的组合,都进行一次训练
svm.fit(X_train, y_train)
score = svm.score(X_test, y_test)
if score > best_score: # 找到表现最好的参数
best_score = score
best_parameters = {
'gamma': gamma, 'C': C}
# <<<网格搜索结束<<<
print("Best score: {:.2f}".format(best_score))
print("Best parameters: {}".format(best_parameters))
"""
Size of training set: 112
Size of testing set: 38
Best score: 0.97
Best parameters: {'gamma': 0.001', 'C': 100}
"""
4. ハイパーパラメータ空間のモデル化と調整
1. 徹底的なウェブ検索
- データを使用してランダム フォレスト モデルをトレーニングし、グリッド検索メソッドを使用してパラメーターを調整します。コードは次のとおりです。
from sklearn.model_selection import GridSearchCV # 导入网格搜索包
from sklearn.model_selection import train_test_split # 导入数据集划分包
from sklearn.ensemble import RandomForestRegressor
from sklearn.metrics import mean_squared_error
from sklearn.datasets import load_iris
# 切分数据,训练数据为80%,验证数据为20%
iris = load_iris()
train_data, test_data, train_target, test_target = train_test_split(iris.data, iris.target, test_size=0.2, stratify=iris.target, random_state=0)
randomForestRegressor = RandomForestRegressor()
parameters = {
'n_estimators': [50, 100, 200], 'max_depth': [1, 2, 3]}
clf = GridSearchCV(randomForestRegressor, parameters, cv=5)
clf.fit(train_data, train_target)
score_test = mean_squared_error(test_target, clf.predict(test_data))
print("Best parameters found by grid search are:", clf.best_params_)
print("RandomForestRegressor GridSearchCV test MSE: ", score_test)
"""
Best parameters found by grid search are: {'max_depth': 2, 'n_estimators': 100}
RandomForestRegressor GridSearchCV test MSE: 0.01656100655431517
"""
2. ランダムパラメータの最適化
- データを使用してランダム フォレスト モデルをトレーニングし、ランダム パラメーター最適化メソッドを使用してパラメーターを調整します。コードは次のとおりです。
from sklearn.model_selection import RandomizedSearchCV
from sklearn.model_selection import train_test_split # 导入数据集划分包
from sklearn.ensemble import RandomForestRegressor
from sklearn.metrics import mean_squared_error
# 切分数据,训练数据为80%,验证数据为20%
train_data, test_data, train_target, test_target = train_test_split(iris.data, iris.target, test_size=0.2, random_state=0)
randomForestRegressor = RandomForestRegressor()
parameters = {
'n_estimators': [50, 100, 200, 300], 'max_depth': [1, 2, 3, 4, 5]}
clf = RandomizedSearchCV(randomForestRegressor, parameters, cv=5, n_iter=10, random_state=42) # n_iter=10 表示随即搜索10次,参数是随机组合的。
clf.fit(train_data, train_target)
score_test = mean_squared_error(test_target, clf.predict(test_data))
print("Best parameters found by grid search are:", clf.best_params_)
print("RandomForestRegressor RandomizedSearchCV test MSE: ", score_test)
"""
Best parameters found by grid search are: {'n_estimators': 100, 'max_depth': 2}
RandomForestRegressor RandomizedSearchCV test MSE: 0.017649606213520908
"""
LGB チューニング
- データを使用して LGB モデルをトレーニングし、グリッド検索メソッドを使用してパラメーターを調整します。コードは次のとおりです。
import lightgbm as lgb
from sklearn.datasets import load_iris
from sklearn.metrics import mean_squared_error
from sklearn.model_selection import GridSearchCV
from sklearn.model_selection import train_test_split
# 切分数据,训练数据为80%,验证数据为20%
iris = load_iris()
train_data, test_data, train_target, test_target = train_test_split(iris.data, iris.target, stratify=iris.target, random_state=20)
clf = lgb.LGBMRegressor(num_leaves=31)
parameters = {
'learning_rate': [0.01, 0.1, 1], 'n_estimators': [20, 40]}
clf = GridSearchCV(clf, parameters, cv=5)
clf.fit(train_data, train_target)
score_test = mean_squared_error(test_target, clf.predict(test_data))
print('Best parameters found by grid search are: ', clf.best_params_)
print("LGBMRegressor GridSearchCV test MSE: ", score_test)
"""
Best parameters found by grid search are: {'learning_rate': 0.1, 'n_estimators': 40}
LGBMRegressor GridSearchCV test MSE: 0.016501047890079536
"""