超参数优化:网格搜索法

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

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

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

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值