私はPythonでKerasとTensorflowを使用してニューラルネットワークの構築と比較を練習していますが、比較のためにモデルをプロットしようとするとエラーが表示されます:
TypeError: 'History' object is not subscriptable
3つのモデルのコードは次のとおりです。
############################## Initiate model 1 ###############################
# Model 1 has no hidden layers
from keras.models import Sequential
model1 = Sequential()
# Get layers
from keras.layers import Dense
# Add first layer
n_cols = len(X.columns)
model1.add(Dense(units=n_cols, activation='relu', input_shape=(n_cols,)))
# Add output layer
model1.add(Dense(units=2, activation='softmax'))
# Compile the model
model1.compile(loss='categorical_crossentropy', optimizer='adam', metrics=
['accuracy'])
# Define early_stopping_monitor
from keras.callbacks import EarlyStopping
early_stopping_monitor = EarlyStopping(patience=2)
# Fit model
model1.fit(X, y, validation_split=0.33, epochs=30, callbacks=
[early_stopping_monitor], verbose=False)
############################## Initiate model 2 ###############################
# Model 2 has 1 hidden layer that has the mean number of nodes of input and output layer
model2 = Sequential()
# Add first layer
model2.add(Dense(units=n_cols, activation='relu', input_shape=(n_cols,)))
# Add hidden layer
import math
model2.add(Dense(units=math.ceil((n_cols+2)/2), activation='relu'))
# Add output layer
model2.add(Dense(units=2, activation='softmax'))
# Compile the model
model2.compile(loss='categorical_crossentropy', optimizer='adam', metrics=
['accuracy'])
# Fit model
model2.fit(X, y, validation_split=0.33, epochs=30, callbacks=
[early_stopping_monitor], verbose=False)
############################## Initiate model 3 ###############################
# Model 3 has 1 hidden layer that is 2/3 the size of the input layer plus the size of the output layer
model3 = Sequential()
# Add first layer
model3.add(Dense(units=n_cols, activation='relu', input_shape=(n_cols,)))
# Add hidden layer
model3.add(Dense(units=math.ceil((n_cols*(2/3))+2), activation='relu'))
# Add output layer
model3.add(Dense(units=2, activation='softmax'))
# Compile the model
model3.compile(loss='categorical_crossentropy', optimizer='adam', metrics=
['accuracy'])
# Fit model
model3.fit(X, y, validation_split=0.33, epochs=30, callbacks=
[early_stopping_monitor], verbose=False)
# Plot the models
plt.plot(model1.history['val_loss'], 'r', model2.history['val_loss'], 'b',
model3.history['val_loss'], 'g')
plt.xlabel('Epochs')
plt.ylabel('Validation score')
plt.show()
モデルの実行、予測確率の取得、ROC曲線のプロット、PR曲線のプロットに問題はありません。ただし、3つの曲線を一緒にプロットしようとすると、コードのこの領域からエラーが発生します。
model1.history['val_loss']
TypeError: 'History' object is not subscriptable
誰でもこのタイプのエラーの経験があり、私が間違っていることに私を導くことができますか?
前もって感謝します。
model.fit()
を呼び出すと、History
型のメンバーhistory
を持つdict
オブジェクトが返されます。
だからあなたは置き換えることができます:
model2.fit(X, y, validation_split=0.33, epochs=30, callbacks=
[early_stopping_monitor], verbose=False)
と
history2 = model2.fit(X, y, validation_split=0.33, epochs=30, callbacks=
[early_stopping_monitor], verbose=False)
他のモデルについても同様です。
次に使用できます:
plt.plot(history1.history['val_loss'], 'r', history2.history['val_loss'], 'b',
history3.history['val_loss'], 'g')
history = model.fit(trainX, trainy, batch_size=50, epochs=200, validation_split=0.3,callbacks=[tensorboard]).history
これは、.history
の最後にmodel fit
を含める必要がある別のソリューションです