我是机器学习的新手。在一个二进制分类问题中,我们对目标变量(如yes=1和No=0 (直接在数据集中))进行编码/转换,给出了相应的结果。
但是,如果我们在dataset中对目标变量进行反向编码/转换(如No=1(directly和yes=0 ),则给出这些结果。
我正在使用XGboost算法。所有其他变量都是数值变量(正变量和负变量),尽管两者的准确性是相同的,但我假设F1在这两种情况下也应该是相同的。那么为什么它给出了不同的结果。我知道scikit-learn可以处理编码,但是为什么F1在这两种情况下是不同的呢?
xtrain,xtest,ytrain,ytest=train_test_split(X,encoded_Y,test_size=0.3,random_state=100,shuffle=True)
clf_xgb = xgb.XGBClassifier(nthread=1,random_state=100)
clf_xgb.fit(xtrain, ytrain)
xgb_pred = clf_xgb.predict(xtest)
xgb_pred_prb=clf_xgb.predict_proba(xtest)[:,1]
print(confusion_matrix(xgb_pred,ytest))
# [984 57]
# [103 1856]
#Find Accuracy of XGBoost
accuracy_xgb = accuracy_score(ytest,xgb_pred)
print("Accuracy: {}".format(accuracy_xgb)
#Find Recall of XGBoost
recall_xgb = recall_score(ytest,xgb_pred)
recall_xgb
#Find Precision of XGBoost
precision_xgb = precision_score(ytest,xgb_pred)
precision_xgb
#Find F1 Score XGB
xgb_f1=f1_score(ytest,xgb_pred)
xgb_f1发布于 2020-11-28 15:30:37
这是因为f1评分与查全率和召回率是相互关联的。
这些公式是:
f1= 2/((recall^-1)+(precision^-1))和
recall= true_positives / (true_positives + false_negatives)
precision= true_positives / (true_positives + false_positives)因此,回忆和精确取决于您定义为正(1)的内容。如果你转换你的正负情况,就像你用不同的方式映射是/否一样,你会得到一个完全不同的结果。通过下面的计算,您可以看到这一点,假设您有100个“是”和“4900个”,并得到了相应的结果:
----------
|YES|NO |
|-------------|---|----|
|predicted_YES| 90| 5|
|-------------|---|----|
|predicted_NO | 10|4895|
------------------------然后,如果将YES定义为正(1),则可以得到
precision=90/(90+5)=0.947
recall=90/(90+10)=0.9
f1= 2/(precision^(-1) + recall^(-1))=0.923如果将NO定义为正(1),则得到:
precision=4895/(4895+10)=0.998
recall=4895/(4895+10)=0.999
f1= 2 / (precision^(-1) + recall^(-1))=0.998注意,如果YES是您的正类,则上面的矩阵分配给true_positives,.就像这样:
--------
|YES|NO|
|-------------|---|--|
|predicted_YES|TP |FP|
|-------------|---|--|
|predicted_NO |FN |TN|
----------------------如果将NO定义为正类,true_positives,.是这样分配的:
--------
|YES|NO|
|-------------|---|--|
|predicted_YES|TN |FN|
|-------------|---|--|
|predicted_NO |FP |TP|
----------------------https://stackoverflow.com/questions/65050583
复制相似问题