如何解决TypeError:如果未指定评分,则传递的估算器应具有“评分”方法
我已经使用PyTorch神经网络已有一段时间了。我决定要添加一个置换特征重要性评分器,这开始引起一些问题。
我得到“ TypeError:如果未指定任何评分,则传递的估算器应具有“评分”方法。估算器
class MultiLayerPredictor(torch.nn.Module):
def __init__(self,input_shape=9152,output_shape=1,hidden_dim=1024,**kwargs):
super().__init__()
self.fc1 = torch.nn.Linear(in_features=input_shape,out_features=hidden_dim)
self.fc2 = torch.nn.Linear(in_features=hidden_dim,out_features=hidden_dim)
self.fc3 = torch.nn.Linear(in_features=hidden_dim,out_features=output_shape)
def forward(self,x):
l1 = torch.relu(self.fc1(x))
l2 = torch.relu(self.fc2(l1))
return torch.sigmoid(self.fc3(l2)).reshape(-1)
print("Moving to wrapping the neural net")
net = NeuralNet(
MultiLayerPredictor,criterion=nn.MSELoss,max_epochs=10,optimizer=optim.Adam,lr=0.1,iterator_train__shuffle=True
)
print("Moving to finding optimal hyperparameters")
lr = (10**np.random.uniform(-5,-2.5,1000)).tolist()
params = {
'optimizer__lr': lr,'max_epochs':[300,400,500],'module__num_units': [14,20,28,36,42],'module__drop' : [0,.1,.2,.3,.4]
}
gs = RandomizedSearchCV(net,params,refit=True,cv=3,scoring='neg_mean_squared_error',n_iter=100)
gs.fit(X_train_scaled,y_train);
def report(results,n_top=3):
for i in range(1,n_top + 1):
candidates = np.flatnonzero(results['rank_test_score'] == i)
for candidate in candidates:
print("Model with rank: {0}".format(i))
print("Mean validation score: {0:.3f} (std: {1:.3f})".format(
results['mean_test_score'][candidate],results['std_test_score'][candidate]))
print("Parameters: {0}".format(results['params'][candidate]))
print("")
print(report(gs.cv_results_,10))
epochs = [i for i in range(len(gs.best_estimator_.history))]
train_loss = gs.best_estimator_.history[:,'train_loss']
valid_loss = gs.best_estimator_.history[:,'valid_loss']
plt.plot(epochs,train_loss,'g-');
plt.plot(epochs,valid_loss,'r-');
plt.title('Training Loss Curves');
plt.xlabel('Epochs');
plt.ylabel('Mean Squared Error');
plt.legend(['Train','Validation']);
plt.show()
r = permutation_importance(net,X_test,y_test,n_repeats=30,random_state=0)
for i in r.importances_mean.argsort()[::-1]:
if r.importances_mean[i] - 2 * r.importances_std[i] > 0:
print(f"{metabolites.feature_names[i]:<8}"
f"{r.importances_mean[i]:.3f}"
f" +/- {r.importances_std[i]:.3f}")
y_pred_acc = gs.predict(X_test)
print('Accuracy : ' + str(accuracy_score(y_test,y_pred_acc)))
Stacktrace会指出错误源于我设置排列重要性的那一行。我该如何解决?
完整的堆栈跟踪:
*Traceback (most recent call last):
File "//ad..fi/home/h//Desktop/neuralnet/neuralnet_wrapped.py",line 141,in <module>
run()
File "//ad..fi/home/h//Desktop/neuralnet/neuralnet_wrapped.py",line 119,in run
r = permutation_importance(net,File "C:\Users\\AppData\Roaming\Python\Python38\site-packages\sklearn\utils\validation.py",line 73,in inner_f
return f(**kwargs)
File "C:\Users\\AppData\Roaming\Python\Python38\site-packages\sklearn\inspection\_permutation_importance.py",line 132,in permutation_importance
scorer = check_scoring(estimator,scoring=scoring)
File "C:\Users\\AppData\Roaming\Python\Python38\site-packages\sklearn\utils\validation.py",in inner_f
return f(**kwargs)
File "C:\Users\\AppData\Roaming\Python\Python38\site-packages\sklearn\metrics\_scorer.py",line 425,in check_scoring
raise TypeError(
TypeError: If no scoring is specified,the estimator passed should have a 'score' method. The estimator <class 'skorch.net.NeuralNet'>[uninitialized](
module=<class '__main__.run.<locals>.MultiLayerPredictor'>,) does not.*
解决方法
来自docs:
NeuralNet
仍然没有评分方法。如果需要,则必须自己实施。
这是问题所在。如错误所述,NeuralNet
没有score
方法。文档说“您必须自己实现”。您也可以检查一下source-code。
正如Berriel所说,这失败了,因为您的神经网络实例未实现score()
方法。这是默认设置,因为不清楚对于任意学习任务应返回什么分数。
这也发生在sklearn网格搜索中,您通过传递scoring='neg_mean_squared_error'
来绕过它。您也可以在这里执行此操作:
r = permutation_importance(net,X_test,y_test,scoring='neg_mean_squared_error',n_repeats=30,random_state=0)
或者说,因为您也需要在其他地方评分,因此您可以自己实现score
方法:
class MyNet(NeuralNetwork):
def score(self,X,y):
y = self.predict(X)
return sklearn.metrics.mean_squared_error(y,y_pred)
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。