有人能帮我如何用python编写多类分类的F1分数???在
编辑:我编辑这个问题是为了更好地了解我想做什么
这是我的函数,用于5个类的多类问题的自定义评估f1分数度量。在
def evalerror(preds, dtrain):
labels = dtrain.get_label()
preds = preds.reshape(-1, 5)
preds = preds.argmax(axis = 1)
f_score = f1_score(preds, labels, average = 'weighted')
return 'f1_score', f_score, True
注意:我重塑的原因是validation true值的长度为252705,而preds是长度为1263525的数组,是实际值的5倍。原因是LGB为每个预测输出每个类的probab。在
下面我将把列车和验证数据转换成LGB可以接受的格式。在
^{pr2}$下面是我对培训数据进行拟合的LGB模型。如您所见,我已经将evalerror
自定义函数传递给了位于feval
的模型,同时还传递了验证数据dvalid
,我想在训练时查看f1的分数。
我正在训练模型进行10次迭代。在
evals_result = {}
num_round = 10
lgb_model = lgb.train(params,
dtrain,
num_round,
valid_sets = dvalid,
feval = evalerror,
evals_result = evals_result)
当模型接受10轮训练时,验证集上每次迭代的F1分数显示在下面,这是不正确的,因为我得到了0.18左右。在
[1] valid_0's multi_logloss: 1.46839 valid_0's f1_score: 0.183719
[2] valid_0's multi_logloss: 1.35684 valid_0's f1_score: 0.183842
[3] valid_0's multi_logloss: 1.26527 valid_0's f1_score: 0.183853
[4] valid_0's multi_logloss: 1.18799 valid_0's f1_score: 0.183909
[5] valid_0's multi_logloss: 1.12187 valid_0's f1_score: 0.187206
[6] valid_0's multi_logloss: 1.06452 valid_0's f1_score: 0.187503
[7] valid_0's multi_logloss: 1.01437 valid_0's f1_score: 0.187327
[8] valid_0's multi_logloss: 0.97037 valid_0's f1_score: 0.187511
[9] valid_0's multi_logloss: 0.931498 valid_0's f1_score: 0.186957
[10] valid_0's multi_logloss: 0.896877 valid_0's f1_score: 0.18751
在下面的代码中,我训练了10次迭代来预测下面的代码。在
lgb_prediction = lgb_model.predict(valid_X)
lgb_prediction = lgb_prediction.argmax(axis = 1)
lgb_F1 = f1_score(lgb_prediction, valid_Y, average = 'weighted')
print("The Light GBM F1 is", lgb_F1)
The Light GBM F1 is 0.743250263548
注意:我在这里没有像在自定义函数中那样重塑它是因为lgb_model.predict()
输出一个numpy数组(252705,5)
还要注意,我传递的是valid_X
,而不是dvalid
,因为在预测时,我们必须传递原始格式,而不是像我们在^{
当我在同一个验证数据集上进行预测时,我得到的F1分数是0.743250263548,这已经足够好了。所以我期望的是第10次迭代时的验证F1分数应该与我训练模型后预测的相同。在
有人能帮我解决我做错的事吗。谢谢
因此,根据这一点,你应该纠正:
^{pr2}$我也有同样的问题。在
Lgb预测以扁平数组的形式输出。在
通过检查,我发现它是这样的:
样本
a
到类i
的概率位于num_classes*(a-1) + i
位置至于你的代码,应该是这样的:
相关问题 更多 >
编程相关推荐