机器学习模型调参

机器学习模型调参




调参

1. 调参的目标

  • 调参就是对模型的参数进行调整,以找到是模型性能最优的参数。调参的目标就是达到整体模型的偏差和方差的大和谐!
  • 参数可分为两类:过程影响类参数和子模型影响类参数。
  • 具体来说,过程影响类参数就是在子模型不变的前提下,调整“子模型数(n_estimators)”、“学习率(learning_rage)”等参数,改变训练过程,从而提高整体模型的性能。子模型影响类参数就是调整“最大树深度(max_depth)”、“分裂条件(criterion)”等参数,改变子模型的性能。 从而提高整体模型的性能。bagging 的训练过程旨在降低方差,而 boosting 的训练过程旨在降低偏差,过程影响类的参数能够引起整体模型性能的大幅度变化。

2. 参数对整体模型性能的影响

* 降低复杂度,对复杂度影响巨大的参数挑选出来,研究他们的单调性,然后专注调整那些最大限度能让复杂度降低的参数,对于那些不单调的参数或者反而让复杂度升高的参数,视情况而定,大多数时候甚至可以退避。(表中从上往下,建议调参的程度逐渐减小)。

3. 网格搜索

网格搜索(Grid Search)是一种穷举搜索的调参手段。在所有候选的参数选择中,通过循环遍历,尝试每一种可能性,表现最好的参数就是最终的结果。其原理就像是在数组中找最大值。以有两个参数的模型为例,参数 a 有3种可能,参数 b 有4种可能,把所有可能性列出来,可以表示成一个 3*4 的表格,其中每个单元就是一个网格,循环过程就像是在网格中遍历、搜索,因此得名网格搜索。
下面是一个简单的网格搜索示例,应用 iris 数据集,对 SVC 模型参数做一次网格搜索调参,这一过程如下表所示:

C=0.001 C=0.01 C=0.1 C=1 C=10
gamma=0.001 SVC(C=0.001, gamma=0.001) SVC(C=0.01, gamma=0.001) SVC(C=0.1, gamma=0.001) SVC(C=1, gamma=0.001) SVC(C=10, gamma=0.001)
gamma=0.01 SVC(C=0.001, gamma=0.01) SVC(C=0.01, gamma=0.01) SVC(C=0.1, gamma=0.01) SVC(C=1, gamma=0.01) SVC(C=10, gamma=0.01)
gamma=0.1 SVC(C=0.001, gamma=0.1) SVC(C=0.01, gamma=0.1) SVC(C=0.1, gamma=0.1) SVC(C=1, gamma=0.1) SVC(C=10, gamma=0.1)
gamma=1 SVC(C=0.001, gamma=1) SVC(C=0.01, gamma=1) SVC(C=0.1, gamma=1) SVC(C=1, gamma=1) SVC(C=10, gamma=1)
gamma=10 SVC(C=0.001, gamma=10) SVC(C=0.01, gamma=10) SVC(C=0.1, gamma=10) SVC(C=1, gamma=10) SVC(C=10, gamma=10)
gamma=100 SVC(C=0.001, gamma=100) SVC(C=0.01, gamma=100) SVC(C=0.1, gamma=100) SVC(C=1, gamma=100) SVC(C=10, gamma=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
"""

猜你喜欢

转载自blog.csdn.net/weixin_51524504/article/details/130058913
今日推荐