2019-08-13

模型评估

指标说明

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曲线。

# -*- coding: utf-8 -*-

"""

Created on Tue Aug 13 08:24:48 2019

@author: Sandra

"""

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


2019-08-13_第1张图片
图1

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

决策树

结果:

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

随机森林

运行结果:

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

运行结果:

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

总结


2019-08-13_第2张图片

你可能感兴趣的:(2019-08-13)