模型评估
指标说明
accuracy、precision,recall和F1-score、auc值的指标定义如下
accuracy(分类准确率)
分类准确率分数是指所有分类正确的百分比。分类准确率这一衡量分类器的标准比较容易理解,但是它不能告诉你响应值的潜在分布,并且它也不能告诉你分类器犯错的类型。预测对的(包括原本是对预测为对,原本是错的预测为错两种情形)占整个的比例(越大越好,1为理想状态)
precision(预测)
预测为对的当中,原本为对的比例(越大越好,1为理想状态)
recall(召回率)
召回率 =提取出的正确信息条数 /样本中的信息条数。通俗地说,原本为对的当中,预测为对的比例(越大越好,1为理想状态)
F1-score(F1分数)
F1分数是分类问题的一个衡量指标。一些多分类问题的机器学习竞赛,常常将F1-score作为最终测评的方法。它是精确率和召回率的调和平均数,最大为1,最小为0。
auc值
auc值指:ROC曲线下的面积(越大越好,1为理想状态)
而ROC曲线是由fp rate、tp rate做出的曲线
fp rate的含义是:原本是错的预测为对的比例(越小越好,0为理想状态)
tp rate的含义是:原本是对的预测为对的比例(越大越好,1为理想状态)
目标设定
使用5个模型(逻辑回归、SVM、决策树、随机森林、XGBoost),预测还款,并
记录5个模型关于accuracy、precision,recall和F1-score、auc值的评分表格,并画出ROC曲线。
代码实现
数据处理部分的代码就省略了,可以参考任务三的博客
各参数指标计算代码
def model_evaluate(model, X_train, X_test, y_train, y_test):
# 训练集和测试集分别使用模型进行预测
predict_of_y_train = model.predict(X_train)
predict_of_y_test = model.predict(X_test)
# predict_proba返回的是一个n行k列的数组,
# 第i行第j列上的数值是模型预测第i个预测样本的标签为j的概率。
# 此时每一行的和应该等于1。
proba_of_y_train = model.predict_proba(X_train)[:, 1]
proba_of_y_test = model.predict_proba(X_test)[:, 1]
# accuracy
print('accuracy:')
print('训练集:', '%.4f' % accuracy_score(y_train, predict_of_y_train))
print('测试集:', '%.4f' % accuracy_score(y_test, predict_of_y_test))
# precision
print('precision:')
print('训练集:', '%.4f' % precision_score(y_train, predict_of_y_train))
print('测试集:', '%.4f' % precision_score(y_test, predict_of_y_test))
# recall
print('recall:')
print('训练集:', '%.4f' % recall_score(y_train, predict_of_y_train))
print('测试集:', '%.4f' % recall_score(y_test, predict_of_y_test))
# f1-score
print('F1-score:')
print('训练集:', '%.4f' % f1_score(y_train, predict_of_y_train))
print('测试集:', '%.4f' % f1_score(y_test, predict_of_y_test))
# AUC
print('AUC:')
print('训练集:', '%.4f' % roc_auc_score(y_train, proba_of_y_train))
print('测试集:', '%.4f' % roc_auc_score(y_test, proba_of_y_test))
# ROC曲线
fpr_train, tpr_train, thresholds_train = roc_curve(y_train, proba_of_y_train, pos_label=1)
fpr_test, tpr_test, thresholds_test = roc_curve(y_test, proba_of_y_test, pos_label=1)
label = ["Train - AUC:{:.4f}".format(auc(fpr_train, tpr_train)),
"Test - AUC:{:.4f}".format(auc(fpr_test, tpr_test))]
plt.plot(fpr_train, tpr_train)
plt.plot(fpr_test, tpr_test)
plt.plot([0, 1], [0, 1], 'd--')
plt.xlabel('False Positive Rate')
plt.ylabel('True Positive Rate')
plt.legend(label, loc=4)
plt.title("ROC Curve")
plt.show()
逻辑回归
clf = LogisticRegression(C=0.1, penalty='l1')
model = clf.fit(X_train, y_train)
运行结果为:
accuracy:
训练集: 0.7956
测试集: 0.8066
precision:
训练集: 0.7139
测试集: 0.7452
recall:
训练集: 0.3179
测试集: 0.3314
F1-score:
训练集: 0.4399
测试集: 0.4588
AUC:
训练集: 0.8012
测试集: 0.8014
SVM分类器
clf = SVC(C=0.01, kernel='linear', probability=True)
model = clf.fit(X_train, y_train)
结果:
accuracy:
训练集: 0.7851
测试集: 0.7905
precision:
训练集: 0.7706
测试集: 0.7935
recall:
训练集: 0.2119
测试集: 0.2068
F1-score:
训练集: 0.3324
测试集: 0.3281
AUC:
训练集: 0.8038
测试集: 0.8132
决策树
clf = DecisionTreeClassifier(max_depth=5, min_samples_split=50, min_samples_leaf=60, max_features=9, random_state=2018)
model = clf.fit(X_train, y_train.values)
结果:
accuracy:
训练集: 0.7773
测试集: 0.7722
precision:
训练集: 0.7089
测试集: 0.6346
recall:
训练集: 0.2000
测试集: 0.1870
F1-score:
训练集: 0.3120
测试集: 0.2888
AUC:
训练集: 0.7520
测试集: 0.7113
随机森林
clf = RandomForestClassifier(oob_score=True, random_state=2018)
model = clf.fit(X_train, y_train.values)
运行结果:
accuracy:
训练集: 0.9838
测试集: 0.7772
precision:
训练集: 0.9987
测试集: 0.6207
recall:
训练集: 0.9369
测试集: 0.2550
F1-score:
训练集: 0.9668
测试集: 0.3614
AUC:
训练集: 0.9996
测试集: 0.7112
XGBoost
clf = XGBClassifier(learning_rate=0.1, n_estimators=80, max_depth=3, min_child_weight=5,
gamma=0.2, subsample=0.8, colsample_bytree=0.8, reg_alpha=1e-5,
objective='binary:logistic', nthread=4, scale_pos_weight=1, seed=27)
model = clf.fit(X_train, y_train.values)
运行结果:
accuracy:
训练集: 0.8413
测试集: 0.8031
precision:
训练集: 0.8406
测试集: 0.7069
recall:
训练集: 0.4583
测试集: 0.3484
F1-score:
训练集: 0.5932
测试集: 0.4668
AUC:
训练集: 0.8918
测试集: 0.7962
总结
将上述五个模型的结果汇总如下
模型 | 准确率 | 精准率 | 召回率 | f1-score | AUC值 | ROC曲线 |
---|---|---|---|---|---|---|
逻辑回归 | 训练集: 0.7956, 测试集: 0.8066 | 训练集: 0.7139,测试集: 0.7452 | 训练集: 0.3179,测试集: 0.3314 | 训练集: 0.4399,测试集: 0.4588 | 训练集: 0.8012,测试集: 0.8014 | |
SVM模型 | 训练集: 0.7851, 测试集: 0.7905 | 训练集: 0.7706,测试集: 0.7935 | 训练集: 0.2119,测试集: 0.2068 | 训练集: 0.3324,测试集: 0.3281 | 训练集: 0.8038,测试集: 0.8132 | |
决策树 | 训练集: 0.7773, 测试集: 0.7722 | 训练集: 0.7089,测试集: 0.6346 | 训练集: 0.2000,测试集: 0.1870 | 训练集: 0.3120,测试集: 0.2888 | 训练集: 0.7520,测试集: 0.7113 | |
随机森林 | 训练集: 0.9838, 测试集: 0.7772 | 训练集: 0.9987,测试集: 0.6207 | 训练集: 0.9369,测试集: 0.2550 | 训练集: 0.9668,测试集: 0.3614 | 训练集: 0.9996,测试集: 0.7112 | |
SVM模型 | 训练集: 0.8413, 测试集: 0.8031 | 训练集: 0.8406,测试集: 0.7069 | 训练集: 0.4583,测试集: 0.3484 | 训练集: 0.5932,测试集: 0.4668 | 训练集: 0.8918,测试集: 0.7962 |