超参数优化:网格搜索法

超参数优化:网格搜索法使用Python完成网格搜索法在机器学习和深度学习的小案例!



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

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))

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

今天的文章超参数优化:网格搜索法分享到此就结束了,感谢您的阅读,如果确实帮到您,您可以动动手指转发给其他人。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/26374.html

(0)
编程小号编程小号

相关推荐

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注