AttributeError:“功能”对象没有属性“predict_proba”
Posted
技术标签:
【中文标题】AttributeError:“功能”对象没有属性“predict_proba”【英文标题】:AttributeError: 'Functional' object has no attribute 'predict_proba' 【发布时间】:2020-12-18 07:34:33 【问题描述】:为了打印具有多个模型的 ROC 曲线,我遇到了这个特殊错误。需要帮助
from tensorflow.keras.models import load_model
def dense():
return (load_model('DenseNet201.h5'))
def mobile():
return(load_model('MobileNet.h5'))
def res():
return(load_model('ResNet50V2.h5'))
def vgg():
return(load_model('VGG16.h5'))
models = [
'label': 'DenseNet201',
'model': dense(),
,
'label': 'MobileNet',
'model':mobile(),
,
'label': 'ResNet50V2',
'model':res(),
,
'label': 'VGG16',
'model':vgg(),
]
from sklearn import metrics
import matplotlib.pyplot as plt
from tensorflow.keras.utils import to_categorical
plt.figure()
# Below for loop iterates through your models list
for m in models:
model = m['model'] # select the model
#model.fit(X_train, y_train) # train the model
y_pred=model.predict(X_test) # predict the test data
# Compute False postive rate, and True positive rate
#fpr, tpr, thresholds = metrics.roc_curve(y_test, model.y_pred_bin(X_test)[:,1])
fpr, tpr, thresholds = metrics.roc_curve(y_test, model.predict_proba(X_test)[:,1])
# Calculate Area under the curve to display on the plot
auc = metrics.roc_auc_score(y_test,model.predict(X_test))
# Now, plot the computed values
plt.plot(fpr, tpr, label='%s ROC (area = %0.2f)' % (m['label'], auc))
# Custom settings for the plot
plt.plot([0, 1], [0, 1],'r--')
plt.xlim([0.0, 1.0])
plt.ylim([0.0, 1.05])
plt.xlabel('1-Specificity(False Positive Rate)')
plt.ylabel('Sensitivity(True Positive Rate)')
plt.title('Receiver Operating Characteristic')
plt.legend(loc="lower right")
plt.show() # Display
我在一个函数中加载了我的预训练模型并使用此代码返回它。我创建了一个列表,它将被迭代,它会调用加载这些模型的函数,因此将绘制每个模型的 ROC 曲线。
完整的追溯
> AttributeError Traceback (most recent call
> last) <ipython-input-43-f353a6208636> in <module>()
> 11 # Compute False postive rate, and True positive rate
> 12 #fpr, tpr, thresholds = metrics.roc_curve(y_test, model.y_pred_bin(X_test)[:,1])
> ---> 13 pred_prob = model.predict_proba(X_test)
> 14 fpr, tpr, thresholds = metrics.roc_curve(y_test, pred_prob[:,1])
> 15 # Calculate Area under the curve to display on the plot
>
> AttributeError: 'Functional' object has no attribute 'predict_proba'
【问题讨论】:
能否包含完整的回溯?predict_proba
仅适用于某些类型的模型...很可能您的列表中有一个模型不支持该方法...您可以找出导致错误的模型与try:
model.predict_proba(X_test)
except:
print(model_name)
请看一看。我用完整的回溯更新了代码
【参考方案1】:
你可以改用这个 -
model.predict_on_batch(X_test)
请注意,roc_curve 或 f1_score 仅采用单值输出。像 [[1],[0],....[1]]
在我的情况下,我已将其转换为分类,例如 [[0,1] , [1,0] , ... , [0,1]] ,并在我的输出中使用了 softmax
所以 model.predict_on_batch(X_test) 也给出了输出 likr [[0.3,0.7] , [0.9,0.1] ...[0.2,0.8]]
所以我必须将其转换为单值输出,然后通过 sklearn 的 roc_curve 或 f1_score 使用以下函数:
def y_(y):
r = []
for i in y:
if i[0] > 0.5:
r.append([0])
else:
r.append([1])
return np.array(r)
【讨论】:
以上是关于AttributeError:“功能”对象没有属性“predict_proba”的主要内容,如果未能解决你的问题,请参考以下文章
AttributeError:“功能”对象没有属性“predict_classes”
AttributeError: 'float' 对象没有属性 'lower'
AttributeError:“列表”对象没有属性“排序值”
Python 错误:AttributeError:“模块”对象没有属性“heappush”