超参数优化:网格搜索法

网格搜索法在机器学习和深度学习中的使用

1.项目简介

  在机器学习和深度学习中,经常需要进行超参数优化。其中,网格搜索法在小批量的超参数优化时被经常使用,该项目是一个多分类(26个类别)问题。
  使用Jupyter Notebook完成,代码和数据文件

2.机器学习案例

2.1导入相关库

from sklearn import svm  # 支持向量机库
import pandas as pd
from sklearn.model_selection import train_test_split  # 拆分数据集
from sklearn.model_selection import GridSearchCV  # 网格搜索法
from sklearn import metrics  # 用于模型评估

2.2导入数据

filepath = 'E:/Jupyter/Mojin/超参数优化/data/letterdata.csv'
letters = pd.read_csv(filepath)
letters.shape
letters.tail(10)  # 返回数据后10行

  运行结果:
在这里插入图片描述
  可以看到,总共有2万个数据,17个指标,其中,letter为目标变量,其余16个指标为特征变量。

2.3拆分数据集

features = letters.columns[1:]
trainX, valX, trainY, valY = train_test_split(letters[features], letters[['letter']], 
                                              test_size=0.2, 
                                              random_state=1234)

2.4网格搜索法

C = [0.05, 0.1, 0.15, 0.2]
kernel = ['rbf', 'sigmoid']
Hyperparameter = dict(C=C, kernel=kernel)  # 将超参数范围包成字典

grid = GridSearchCV(estimator=svm.SVC(),  # 支持向量机中的SVC模型
                    param_grid=Hyperparameter)
# 模型在训练数据集上的拟合
grid_result = grid.fit(trainX, trainY)

# 返回最佳参数组合
print('Best:%f using %s' % (grid_result.best_score_, grid_result.best_params_))

  运行结果:
在这里插入图片描述
  可以看到,最佳参数组合:C:‘0.2’,kernel:‘rbf’,准确率:0.914125。

2.5使用最优参数重新训练模型

SVC = svm.SVC(kernel='rbf', C=0.2, gamma='scale').fit(trainX, trainY)
pred = SVC.predict(valX)  # 预测
print('模型预测的准确率:{0}'.format(metrics.accuracy_score(valY, pred)))

  运行结果:
在这里插入图片描述

3.深度学习案例

3.1导入相关库

from keras.models import Sequential
from keras.layers import Dense
from keras.layers import Dropout
import pandas as pd
import random  # 随机库
from sklearn.model_selection import GridSearchCV  # 网格搜索法
from keras.wrappers.scikit_learn import KerasClassifier  # Keras库分类模型封装器
from keras.utils.np_utils import to_categorical  # Keras库独热编码

  KerasClassifier是将深度模型包装传递给网格搜索法的接口,具体说明见官方文档

3.2导入数据

filepath = 'E:/Jupyter/Mojin/超参数优化/data/letterdata.csv'
letters = pd.read_csv(filepath)
letters.shape
letters.tail(10)
# 将letter指标数据类型转换成category
letter = letters['letter'].astype('category')
# 使用标签的编码作为真正的数据
letters['letter'] = letter.cat.codes
letters.tail(10)
# 提取特征变量并转换成数组格式
X = letters[letters.columns[1:]].values
X.shape
Y = letters[['letter']].values
Y.shape

  运行结果:
在这里插入图片描述

# 独热编码
Y = to_categorical(Y)
Y.shape

  运行结果:
在这里插入图片描述
  可以看到,经过独热编码Y的维度从1变为26。

3.3拆分数据集

random_index = random.sample(list(range(X.shape[0])), X.shape[0])
train_size = int(X.shape[0] * 0.8)
train_index = random_index[:train_size]
test_index = random_index[train_size:]

trainX = X[train_index]
trainX.shape
trainY = Y[train_index]

testX = X[test_index]
testY = Y[test_index]

3.4构造模型

def create_model(dropout=0.2, depth=2):
    """
    dropout: Dropout层丢弃的比例,一般在0.2~0.5之间
    depth: 模型隐藏层的层数
    """
    model = Sequential()
    if depth < 2:
        raise Exception('至少两层结构')
    else:
        model.add(Dense(units=32, 
                    input_shape=(16,),  # 特征指标个数:16(trainX.shape[1])
                    activation='relu'))
        model.add(Dropout(rate=dropout))  # 防止过拟合
        for i in range(depth - 2):
            model.add(Dense(units=32,
                                activation='relu'))
        model.add(Dense(units=26,
                        activation='softmax'))
        
        model.compile(loss='categorical_crossentropy',
                  optimizer='rmsprop', 
                  metrics=['accuracy'])
        model.summary()
    return model

model = KerasClassifier(build_fn=create_model)

3.5网格搜索法

# 构建需要优化的超参数范围
depth = [3, 4, 5]
epochs = [30, 50]
batch_size = [100]
param_grid = dict(depth=depth,
                  epochs=epochs,
                  batch_size=batch_size)
          
grid = GridSearchCV(estimator=model, 
                    param_grid=param_grid)  # 默认是cv=3,即3折交叉验证
grid.fit(trainX, trainY)
# 返回最佳参数组合
print('Best:%f using %s' % (grid.best_score_, grid.best_params_))

  运行结果:
在这里插入图片描述

3.6使用最优参数重新训练模型

model = create_model(depth=4)
model.fit(trainX, trainY, epochs=50, batch_size=100)
predict = model.predict(testX)
loss, acc = model.evaluate(testX, testY)
print('模型预测的准确率:{0}'.format(acc))

  运行结果:
在这里插入图片描述

  • 8
    点赞
  • 122
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
网格搜索和交叉验证在机器学习模型的优化和评估中具有以下好处: 网格搜索的好处: 1. 参数调优:网格搜索通过遍历指定参数空间中的所有可能组合,能够找到最优的参数组合,从而提高模型的性能和预测准确度。 2. 自动化:网格搜索能够自动化地进行参数选择,减少了手动调参的繁琐过程,提高了调参的效率。 3. 广泛适用性:网格搜索适用于大多数机器学习算和模型,可以用于调优各种类型的参数,包括超参数和模型参数。 交叉验证的好处: 1. 提供更准确的模型评估:交叉验证通过将数据集划分为训练集和验证集,并多次重复进行模型训练和评估,可以更准确地评估模型在未知数据上的性能。 2. 减少过拟合:交叉验证可以帮助检测并减少模型的过拟合问题,通过对多个不同的训练集和验证集进行交叉验证,可以更好地估计模型的泛化能力。 3. 最大程度利用数据:交叉验证将数据集划分为多个不同的训练集和验证集,使得模型可以在更多的数据上进行训练和评估,从而更好地利用数据集的信息。 4. 鲁棒性:交叉验证对数据集的划分不敏感,通过多次划分和评估的结果的平均值,可以得到更稳定和可靠的模型评估结果。 综上所述,网格搜索可以帮助自动化地找到最优的参数组合,而交叉验证可以提供更准确和鲁棒的模型评估结果,从而提高机器学习模型的性能和泛化能力。这两种方在模型优化和评估中都具有重要的作用。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值