文章目录
网格搜索法在机器学习和深度学习中的使用
网格搜索法在机器学习和深度学习中的使用
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