【发布时间】:2021-03-11 00:26:21
【问题描述】:
我是机器学习的新手。在二元分类问题中,我们编码/转换目标变量,如 yes=1 和 No=0(直接在数据集中),它会给出以下结果
- 准确度:95
- 召回:90
- 精度:94
- F1: 92
但是如果我们像 yes=0 和 No=1(直接在数据集中)那样对目标变量进行反向编码/转换,那么它会给出这些结果
- 准确度:95
- 召回:97
- 精度:94
- F1:95
我正在使用 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
【问题讨论】:
-
每次运行代码时是否得到相同的结果?我的意思是每次使用相同的编码都具有相同的精度?
-
@coderina 是的,每次我使用相同的结束编码运行代码时,我都会得到相同的精度、f1、召回率、准确度结果。
-
@MuhammadIbrar:这种行为的原因可能是机器学习模型通常使用随机种子,该种子是固定的,因此结果是可重复的。如果您不喜欢这样,则应在每次训练模型时将种子设置为随机数,并为
train_test_split或折叠设置。 -
对于
XGBClassifier,我猜这个参数被命名为random_state。试试random_state=random.randint(0, 2147483647)。刚刚认识到,您将train_test_split的random_state明确修复为1,因此它始终会为训练和测试选择相同的记录。 -
顺便说一句。这与 light-gbm 完全相同。如果您在此处省略种子参数,则每次运行时所有随机种子都会初始化为常量 int,因此如果数据或参数没有任何变化,您将得到完全相同的结果。
标签: python machine-learning classification xgboost precision-recall