Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/312.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何访问通过RandomizedSearchCV识别的最佳神经网络模型_Python_Keras - Fatal编程技术网

Python 如何访问通过RandomizedSearchCV识别的最佳神经网络模型

Python 如何访问通过RandomizedSearchCV识别的最佳神经网络模型,python,keras,Python,Keras,我希望从RandomizedSearchCV中提取并使用(在同一个Jupyter笔记本中)被确定为最佳模型的模型,以便将来进行拟合和绘图。具体地说,我希望重新拟合被确定为最佳的Keras神经网络,以便能够根据相同或其他数据集绘制损失和精度 如果我运行下面的代码,我会得到我期望的输出——最佳分数和获得该分数时使用的参数 import pandas as pd from sklearn.preprocessing import LabelEncoder from sklearn.pipeline i

我希望从RandomizedSearchCV中提取并使用(在同一个Jupyter笔记本中)被确定为最佳模型的模型,以便将来进行拟合和绘图。具体地说,我希望重新拟合被确定为最佳的Keras神经网络,以便能够根据相同或其他数据集绘制损失和精度

如果我运行下面的代码,我会得到我期望的输出——最佳分数和获得该分数时使用的参数

import pandas as pd
from sklearn.preprocessing import LabelEncoder
from sklearn.pipeline import Pipeline
from skrebate import SURF
from sklearn.model_selection import StratifiedKFold
from sklearn.model_selection import GridSearchCV, RandomizedSearchCV
from keras.wrappers.scikit_learn import KerasClassifier
from keras.models import Sequential
from keras.layers import Dense


url = "https://datahub.io/machine-learning/sonar/r/sonar.csv"
dataframe = pd.read_csv(url)

dataset = dataframe.values

X = dataset[:,0:60].astype(float)
y = dataset[:,60]

features, labels = dataset[:,0:60].astype(float), dataset[:,60]

encoder = LabelEncoder()
encoder.fit(y)
encoded_y = encoder.transform(y)



def create_nn_model(input_dims):
    # Create model.
    model = Sequential()
    model.add(Dense(60, input_dim=input_dims, activation='relu'))
    model.add(Dense(1, activation='sigmoid'))
    # Compile model.
    model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy'])
    return model

param_grid = {'model__epochs': (100,200,300),
         'model__batch_size': (10,20,20)}

kfold = StratifiedKFold(n_splits=10, shuffle=True)

for x in range(10, 11, 10): # Iterate through top 10% to 100% of the features.

    num_features = int(features.shape[1] * x / 100)

    clf = Pipeline([('fs_step', SURF(n_features_to_select=num_features)),
                    ('model', KerasClassifier(build_fn=lambda: create_nn_model(num_features), epochs=100, batch_size=5, verbose=0))])

    grid = RandomizedSearchCV(clf, param_grid, n_jobs=-1, cv=kfold, n_iter = 3)
    grid_result = grid.fit(features, encoded_y)

    print('Best score obtained: {0}'.format(grid_result.best_score_))

    print('Parameters:')
    for param, value in grid_result.best_params_.items():
        print('\t{}: {}'.format(param, value))
我还知道如何根据以下代码通过构建、编译和拟合模型来绘制我正在寻找的数据:

model = Sequential()
model.add(Dense(60, input_dim=60, activation='relu'))
model.add(Dense(1, activation='sigmoid'))
# Compile model
model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy'])

model.fit(features, encoded_y, epochs=100, batch_size=25, verbose=0)

losses = pd.DataFrame(model.history.history)
import matplotlib.pyplot as plt

losses.plot()
plt.show()
我可以从随机搜索CV中选取最佳模型,根据数据和绘图进行拟合,还是必须根据
最佳参数
进行构建、编译和拟合?我问的原因是,我无法识别/访问我所理解的具有
grid\u result.best\u estimator\u.model
的最佳模型。尝试这样做会带来:

---------------------------------------------------------------------------
AttributeError                            Traceback (most recent call last)
<ipython-input-31-bbfe0b584f46> in <module>
----> 1 grid_result.best_estimator_.model

AttributeError: 'Pipeline' object has no attribute 'model'
---------------------------------------------------------------------------
AttributeError回溯(最近一次呼叫上次)
在里面
---->1网格结果最佳估计模型
AttributeError:“管道”对象没有属性“模型”

任何帮助都将不胜感激。谢谢。

grid\u结果。best\u estimator\u
包含refit estimator(因为您保留了
refit
参数的默认值),它是您的
clf
的合适克隆。在您的案例中,这恰好是一个管道对象(具有两个步骤);如果要访问keras模型,可以像访问字典一样访问它:


grid\u结果。最佳估计值\uu['model']
将是一个安装的
KerasClassifier
对象。并且它们具有
model
属性,该属性包含本机keras对象:


grid\u结果。最佳估计器[model']。model

非常感谢@ben reiniger,我没有使用字典键。似乎正是我所需要的。