Scikit-Learn是一个功能齐全的通用机器学习库,并提供在深度学习模型中有帮助的方法。
Keras类库为深度学习模型提供了一个包装类wrapper,将Keras的深度学习模型包装成Scikit-Learn中的分类模型或回归模型,以便于方便地使用Scikit-Learn中的方法和函数。
KerasClassifier(用于分类模型)
KerasRegression(用于回归模型)
1、使用交叉验证评估模型
import tensorflow
import keras
from keras.models import Sequential
from keras.layers import Dense
import numpy as np
from sklearn.model_selection import cross_val_score
from sklearn.model_selection import StratifiedKFold
from keras.wrappers.scikit_learn import KerasClassifier
#构建模型
def create_model():
#构建模型
model = Sequential()
model.add(Dense(input_dim=8,units=12,activation='relu'))
model.add(Dense(units=8,activation='relu'))
model.add(Dense(units=1,activation='sigmoid'))
#编译模型
model.compile(loss='binary_crossentropy',optimizer='adam',metrics=['accuracy'])
return model
seed = 7
#设定随机数种子
np.random.seed(seed)
#导入数据
dataset = np.loadtxt('pima-indians-diabetes.csv',delimiter=',')
#分割输入变量x和输出变量Y
x = dataset[:,0:8]
Y = dataset[:,8]
#创建模型
model = KerasClassifier(build_fn=create_model,epochs=150,batch_size=10,verbose=0)
#10折交叉验证
kfold = StratifiedKFold(n_splits=10,shuffle=True,random_state=seed)
results = cross_val_score(model,x,Y,cv=kfold)
print(results.mean())
2、深度学习模型调参
借助Scikit-Learn的网格搜索算法评估神经网络模型的不同配置,并找到最佳评估性能的参数组合。
定义要搜索的参数的值数组,包括优化器(optimizer)、权重初始化方案(init)、epochs和batch_size。
GridSearchCV需要一个字典类型的字段作为需要调参的参数,默认采用3折交叉验证来评估算法。
import tensorflow
import keras
from keras.models import Sequential
from keras.layers import Dense
import numpy as np
from sklearn.model_selection import GridSearchCV
from keras.wrappers.scikit_learn import KerasClassifier
#构建模型
def create_model(optimizer='adam',init='glorot_uniform'):
#构建模型
model = Sequential()
model.add(Dense(input_dim=8,units=12,kernel_initializer=init,activation='relu'))
model.add(Dense(units=8,kernel_initializer=init,activation='relu'))
model.add(Dense(units=1,kernel_initializer=init,activation='sigmoid'))
#编译模型
model.compile(loss='binary_crossentropy',optimizer=optimizer,metrics=['accuracy'])
return model
seed = 7
#设定随机数种子
np.random.seed(seed)
#导入数据
dataset = np.loadtxt('pima-indians-diabetes.csv',delimiter=',')
#分割输入变量x和输出变量Y
x = dataset[:,0:8]
Y = dataset[:,8]
#创建模型for scikit-learn
model = KerasClassifier(build_fn=create_model,verbose=0)
#构建需要调参的参数
param_grid = {}
param_grid['optimizer'] = ['rmsprop','adam']
param_grid['init'] = ['glorot_uniform','normal','uniform']
param_grid['epochs'] = [50,100,150,200]
param_grid['batch_size'] = [5,10,20]
#调参
grid = GridSearchCV(estimator=model,param_grid=param_grid)
results = grid.fit(x,Y)
#输出结果
#执行结果中的第一行输出,为通过网格搜索得到的最优参数
print('Best:%f using %s' %(results.best_score_,results.best_params_))
means = results.cv_results_['mean_test_score']
stds = results.cv_results_['std_test_score']
params = result.cv_results_['params']
#zip()函数用于可迭代的对象作为参数,将对象中对应的元素打包成一个个元组,然后返回由这些元组组成的列表。
for mean,std,param in zip(means,stds,params):
print('%f (%f) with: %r' %(mean,std,param))