Task2 模型评估

1.任务描述

记录7个模型(逻辑回归、SVM、决策树、随机森林、GBDT、XGBoost和LightGBM)关于accuracyprecisionrecallF1-scoreauc值的评分表格,并画出ROC曲线

2.评分方法介绍

模型的‘好坏’是相对的,什么样模型是好的,不仅取决于算法和数据好决定于任务需求。性能度量反映了任务需求,在对比不同模型的能力时,不同的性能度量往往会导致不同的评判结果。

回归问题:

均方误差。

分类问题:(源自西瓜书)

  • accuracy 精度

分类正确的样本占总样本的比例:

(概率密度p(.)

  • precision  准确率(查准率)

预测为正例的样本中有多少是真正例。(西瓜书上的说法:挑出的瓜中(表示你认为是好瓜)有多少是好瓜。)

混淆矩阵:

  • recall  召回率(查全率)

正例中有多少样本被成功预测为正例。(西瓜书上的说法:所有的好瓜中有多少比例被挑了出来)

查准率和查全率是一对矛盾的度量。

  • P-R曲线

根据学习器的预测结果对样例进行排序,排在前面的为最可能的正例,排在最后面的是最不可能的正例。逐个吧样本作为正例进行预测,根据此时的查准率查全率可以得到查准率-查全率曲线(P-R曲线)

采用P-R曲线下的面积在一定程度上反应了查准率和查全率取得双高的比例。单这个值不容易估算

平衡点(Break-Event Point,BEP)查准率=查全率的点。过于简化

  • F1-score

查准率和查全率的调和平均:

更一般的形式,表达出对查准率和查全率的不同偏好:

  • auc值(Area Under ROC Curve)

ROC曲线下的面积.

估算方法:

(Xi,Yi)为ROC曲线按序连接的点。

AUC与排序误差有密切联系。排序误差为:

排序损失是ROC曲线之上的面积,则有:

  • ROC曲线(Receiver Operating Characteristic)

受试者工作特征曲线:

纵轴是真正例率(True Positive Rate,TPR)【正例中有多少被预测为正例】

横轴是假正例率(False Positive Rate,FPR)【反例中有多少被预测为正例】

ROC图如下,对角线对应于随机猜测:

  • 代价敏感错误率和代价曲线

不同类型的错误造成不同的损失,即非均等代价。

代价敏感错误率为:

代价曲线,横轴为正例概率代价,纵轴是归一化代价:

(横)(纵)

(ROC曲线上的每一点对应代价曲线上的一条线段)

3.代码实现

  • 包导入以及数据预处理
from pandas import Series,DataFrame
import pandas as pd
from sklearn.preprocessing import StandardScaler
from sklearn.model_selection import train_test_split
from sklearn import svm
from sklearn import tree
from sklearn.linear_model import LogisticRegression
import lightgbm as lgb
import xgboost as xgb
from sklearn.ensemble import RandomForestClassifier
from sklearn.ensemble import GradientBoostingClassifier

from sklearn.metrics import precision_score
from sklearn.metrics import recall_score
from sklearn.metrics import f1_score
from sklearn.metrics import accuracy_score
from sklearn.metrics import confusion_matrix
from sklearn.metrics import auc
from sklearn.metrics import roc_auc_score
from sklearn.metrics import roc_curve

import matplotlib.pyplot as plt

#数据读入
data = pd.read_csv(r'data_all.csv')

#划分训练及和测试集
X = data.drop(['status'],axis = 1)
y = data['status']

X_train,X_test,y_train,y_test = train_test_split(X,y,test_size = 0.3,random_state = 2018)
scaler = StandardScaler()
scaler.fit(X_train)

X_train = scaler.transform(X_train)
X_test = scaler.transform(X_test)
  • 模型评价函数:
#评分和绘制ROC曲线
def model_evaluation(y_label,y_predict,y_predict_pro):
    accuracy = accuracy_score(y_label,y_predict)
    precision = precision_score(y_label,y_predict)
    recall = recall_score(y_label,y_predict)
    f1 = f1_score(y_label,y_predict)
    auc = roc_auc_score(y_label,y_predict_pro)
    
    fpr,tpr,thresholds = roc_curve(y_label,y_predict_pro)
    plt.figure()
    lw = 2
    plt.plot(fpr, tpr, color='darkorange',
             lw=lw, label='ROC curve (area = %0.2f)' % auc)
    plt.plot([0, 1], [0, 1], color='navy', lw=lw, linestyle='--')
    plt.xlim([0.0, 1.0])
    plt.ylim([0.0, 1.05])
    plt.xlabel('False Positive Rate')
    plt.ylabel('True Positive Rate')
    plt.title('Receiver operating characteristic')
    plt.legend(loc="lower right")
    plt.show()
    
    print 'accuracy:',accuracy
    print 'precision:',precision
    print 'recall:',recall
    print 'f1_score:',f1
    print 'roc_auc_score:',auc
  • 各个模型训练和评估
#SVM
clf_svm = svm.SVC(random_state  = 2018)
clf_svm.fit(X_train,y_train)
#训练集预测标签和概率输出
train_svm_predict = clf_svm.predict(X_train)
train_svm_predict_pro = clf_svm.decision_function(X_train)
#测试集预测标签和概率输出
test_svm_predict = clf_svm.predict(X_test)
test_svm_predict_pro = clf_svm.decision_function(X_test)
#训练集评分
model_evaluation(y_train,train_svm_predict,train_svm_predict_pro)
#测试集评分
model_evaluation(y_test,test_svm_predict,test_svm_predict_pro)


#决策树
clf_tree = tree.DecisionTreeClassifier(random_state  = 2018)
clf_tree.fit(X_train,y_train)
#训练集预测标签和概率输出
train_tree_predict = clf_tree.predict(X_train)
train_tree_predict_pro = clf_tree.predict_proba(X_train)[:,1]
#测试集预测标签和概率输出
test_tree_predict = clf_tree.predict(X_test)
test_tree_predict_pro = clf_tree.predict_proba(X_test)[:,1]
#训练集评分
model_evaluation(y_train,train_tree_predict,train_tree_predict_pro)
#测试集评分
model_evaluation(y_test,test_tree_predict,test_tree_predict_pro)


#LR
clf_lr = LogisticRegression(random_state=2018)
clf_lr.fit(X_train,y_train) 
#训练集预测标签和概率输出
train_lr_predict = clf_lr.predict(X_train)
train_lr_predict_pro = clf_lr.predict_proba(X_train)[:,1]
#测试集预测标签和概率输出
test_lr_predict = clf_lr.predict(X_test)
test_lr_predict_pro = clf_lr.predict_proba(X_test)[:,1]
#训练集评分
model_evaluation(y_train,train_lr_predict,train_lr_predict_pro)
#测试集评分
model_evaluation(y_test,test_lr_predict,test_lr_predict_pro)


#随机森林
clf_rf = RandomForestClassifier(random_state  = 2011)
clf_rf.fit(X_train,y_train)
#训练集预测标签和概率输出
train_rf_predict = clf_rf.predict(X_train)
train_rf_predict_pro = clf_rf.predict_proba(X_train)[:,1]
#测试集预测标签和概率输出
test_rf_predict = clf_rf.predict(X_test)
test_rf_predict_pro = clf_rf.predict_proba(X_test)[:,1]
#训练集评分
model_evaluation(y_train,train_rf_predict,train_rf_predict_pro)
#测试集评分
model_evaluation(y_test,test_rf_predict,test_rf_predict_pro)


#GBDT
clf_gbdt = GradientBoostingClassifier()
clf_gbdt.fit(X_train,y_train)
#训练集预测标签和概率输出
train_gbdt_predict = clf_gbdt.predict(X_train)
train_gbdt_predict_pro = clf_gbdt.predict_proba(X_train)[:,1]
#测试集预测标签和概率输出
test_gbdt_predict = clf_gbdt.predict(X_test)
test_gbdt_predict_pro = clf_gbdt.predict_proba(X_test)[:,1]
#训练集评分
model_evaluation(y_train,train_gbdt_predict,train_gbdt_predict_pro)
#测试集评分
model_evaluation(y_test,test_gbdt_predict,test_gbdt_predict_pro)


#XGBoost
clf_xgb = xgb.XGBClassifier()
clf_xgb.fit(X_train,y_train)
#训练集预测标签和概率输出
train_xgb_predict = clf_xgb.predict(X_train)
train_xgb_predict_pro = clf_xgb.predict_proba(X_train)[:,1]
#测试集预测标签和概率输出
test_xgb_predict = clf_xgb.predict(X_test)
test_xgb_predict_pro = clf_xgb.predict_proba(X_test)[:,1]
#训练集评分
model_evaluation(y_train,train_xgb_predict,train_xgb_predict_pro)
#测试集评分
model_evaluation(y_test,test_xgb_predict,test_xgb_predict_pro)


#lightGBM
clf_lgb = lgb.LGBMClassifier()
clf_lgb.fit(X_train,y_train)
#训练集预测标签和概率输出
train_lgb_predict = clf_lgb.predict(X_train)
train_lgb_predict_pro = clf_lgb.predict_proba(X_train)[:,1]
#测试集预测标签和概率输出
test_lgb_predict = clf_lgb.predict(X_test)
test_lgb_predict_pro = clf_lgb.predict_proba(X_test)[:,1]
#训练集评分
model_evaluation(y_train,train_lgb_predict,train_lgb_predict_pro)
#测试集评分
model_evaluation(y_test,test_lgb_predict,test_lgb_predict_pro)
  • 结果比较
模型accuracyprecisionrecallF1-scoreauc值
LR

训练集:0.8049

测试集:0.7877

训练集:0.7069

测试集:0.6609

训练集:0.3789

测试集:0.3203

训练集:0.4934

测试集:0.4315

训练集:0.8198

测试集:0.7657

SVM

训练集:0.8428

测试集:0.7806

训练集:0.9147

测试集:0.7017

训练集:0.4113

测试集:0.2228

训练集:0.5674

测试集:0.3383

训练集:0.9218

测试集:0.7531

决策树

训练集:1.0

测试集:0.6854

训练集:1.0

测试集:0.3840

训练集:1.0

测试集:0.4150

训练集:1.0

测试集:0.3989

训练集:1.0

测试集:0.5956

随机森林

训练集:0.9811

测试集:0.7617

训练集:1.0

测试集:0.5629

训练集:0.9245

测试集:0.2367

训练集:0.9607

测试集:0.3333

训练集:0.9990

测试集:0.7096

GBDT

训练集:0.8623

测试集:0.7799

训练集:0.8837

测试集:0.6087

训练集:0.5192

测试集:0.3509

训练集:0.6541

测试集:0.4452

训练集:0.9207

测试集:0.7622

XGBoost

训练集:0.8512

测试集:0.7919

训练集:0.8645

测试集:0.6550

训练集:0.4820

测试集:0.3649

训练集:0.6189

测试集:0.4687

训练集:0.9186

测试集:0.7707

LightGBM

训练集:0.9958

测试集:0.7701

训练集:1.0

测试集:0.5689

训练集:0.9823

测试集:0.3565

训练集:0.9915

测试集:0.4383

训练集:1.0

测试集:0.7535

应该是因为参数的问题,模型之间差异不大,集成学习也没有体现出应有的优势。

  • ROC结果

(LR)(SVM)

(决策树(随机森林)

(GBDT)(XGBoost)

(LightGBM)

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值