Keras调用sklearn

Keras是Python在深度学习领域非常受欢迎的第三方库之一,但Keras的侧重点是深度学习,而不是所以的机器学习。事实上,Keras力求极简主义,只专注于快速、简单地定义和构建深度学习模型所需要的内容。Python中的scikit-learn是非常受欢迎的机器学习库,它基于Scipy,用于高效的数值计算。scikit-learn是一个功能齐全的通用机器学习库,并提供了许多在开发深度学习过程中非常有帮助的方法。例如scikit-learn提供了很多用于选择模型和对模型调参的方法,这些方法同样适用于深度学习。

Keras提供了一个Wrapper,将Keras的深度学习模型包装成scikit-learn中的分类模型或回归模型,以便于使用scikit-learn中的方法和函数。对于深度学习模型的包装是通过KerasClassifier(分类模型)和KerasRegressor(回归模型)来实现的。

此博文将介绍利用Keras调用scikit-learn实现交叉验证和模型调参

KerasClassifier和KerasRegressor类使用参数build_fn,指定用来创建模型的函数的名称。因此,必须定义一个函数,并通过函数来定义深度学习模型,编译并返回它。

除了通过build_fn参数将这个函数传递给KerasClassifier类之外,还设置epochs参数为150和batch_size参数为10,并将这两个参数传递给KerasClassifier实例。参数将自动绑定并传递给有KerasClassifier类内部调用的fit()函数。在这个例子中,使用scikit-learn中的KFold来执行10折交叉验证。使用scikit-learn中的cross_val_score()来评估深度谢谢模型并输出,代码如下:

测试数据见https://blog.csdn.net/gf19960103/article/details/89475609

Keras调用scikit-learn实现交叉验证

from keras.models import Sequential
from keras.layers import Dense
import numpy as np
import pandas as pd
from sklearn.model_selection import cross_val_score, KFold
from keras.wrappers.scikit_learn import KerasClassifier


def creat_model():
    # 构建模型
    model = Sequential()
    model.add(Dense(units=12, input_dim=11, 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

# 导入数据
data = pd.read_csv('data.csv',encoding='gbk')

# 删除id列
data.drop('客户编号',axis=1,inplace=True)

X, Y = data.values[:,:-1], data.values[:,-1] 

# Keras调用sklearn
model = KerasClassifier(build_fn=creat_model, epochs=150, batch_size=10, verbose=0)

# 10折交叉验证
kfold = KFold(n_splits=10, shuffle=True, random_state=10)
result = cross_val_score(model, X, Y, cv=kfold)

Keras调用scikit-learn实现模型调参

在构建深度学习模型时,如何配置一个最优模型一直是进行一个项目的重点。在机器学习中,可以通过算法自动调优这些配置参数,在这里将通过Keras的包装类,借助scikit-learn的网格搜索算法评估神经网络模型的不同配置,并找到最佳评估性能的参数组合。creat_model()函数被定义为具有两个默认值的参数(optimizer和init)的函数,创建模型后,定义要搜索的参数的数值数组,包括优化器(optimizer)、权重初始化方案(init)、epochs和batch_size。

在scikit-learn中的GridSearchCV需要一个字典类型的字段作为需要调整的参数,默认采用3折交叉验证来评估算法,由于4个参数需要进行调参,因此将会产生4✖️3个模型。如果参数比较多,会生成比较多的模型,需要大量时间计算,也许这种方法在大数据量的情况下不合适,但是在相对较少的数据下是非常有效的方法。

from keras.models import Sequential
from keras.layers import Dense
import numpy as np
import pandas as pd
from sklearn.model_selection import GridSearchCV
from keras.wrappers.scikit_learn import KerasClassifier


def creat_model(optimizer='adam,init='glorot_uniform'):
    # 构建模型
    model = Sequential()
    model.add(Dense(units=12, input_dim=11,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

# 导入数据
data = pd.read_csv('data.csv',encoding='gbk')

# 删除id列
data.drop('客户编号',axis=1,inplace=True)

X, Y = data.values[:,:-1], data.values[:,-1] 

# Keras调用sklearn
model = KerasClassifier(build_fn=creat_model, verbose=0)

# 构建需要调整的参数
param_gird = {}
param_grid['optimizer'] = ['rmsprop','adam']
param_grid['init'] = ['glorot_uniform', 'normal', 'uniform']
param_gird['epochs'] = [50, 100, 150, 200]
param_gird['batch_size'] = [5, 10, 20]

# 调参
grid = GridSearchCV(estimator=model, param_gird=param_grid)
result = grid.fit(X, Y)

# 输出结果
print('Best: %f using %s' % (result.best_score_, result.best_params_))

猜你喜欢

转载自blog.csdn.net/gf19960103/article/details/89957364