如何用精确率与召回率判断模型好坏?一起来信用卡诈骗分析

我们都知道,信用卡诈骗相对于违约来说比例极低,但是危害重大,如何通过以往的交易数据分析出眉笔交易是否正常呢?

算法:

逻辑回归,logistic 其实是分类,主要解决二分类问题,当然也可以解决多分类问题。
算法:


微信图片_20190715162140.jpg

展示图:


微信图片_20190715162151.jpg

函数以0.5为中心,x无穷大则y接近于1,x无穷小则y接近于0。将0视为发生,将1视为不会发生,则测试值更接近那一边,就被分到哪边,从而达到分类效果。

模型公式:
from sklearn.linear_model import LogisticRegression
LogisticRegression(penalty,solver,max_liter,n_jobs)

1、penalty:惩罚项,取值为|1或|2,默认为|2
2、solver:代表的是逻辑回归损函数的优化方法,默认为liblinear,适用于数据量小的数集,数据集较大可用sag或saga.
3、max_iter:选代次数,默认为10.
4、n_jobs:拟合和预测的时候CPU的核,默认为1.

模型评估方法:

这里先介绍下数据预测的四种情况:TP、FP、TN、FN。我们用第二个字母 P 或 N 代表预测为正例还是负例,P 为正,N 为负。第一个字母 T 或 F 代表的是预测结果是否正确,T 为正确,F 为错误。

所以四种情况分别为:

TP:预测为正,判断正确;

FP:预测为正,判断错误;

TN:预测为负,判断正确;

FN:预测为负,判断错误。

我们知道样本总数 =TP+FP+TN+FN,预测正确的样本数为 TP+TN,因此准确率 Accuracy = (TP+TN)/(TP+TN+FN+FP)。

由于数据的比例差别特别大,所以不能用普通的方法去预测准确率,这里要用到,精确率和召回率,F1值。

精确率 P = TP/ (TP+FP),对应上面诈骗分子这个例子,在所有判断为诈骗分子的人数中,真正是诈骗分子的比例。

召回率 R = TP/ (TP+FN),也称为查全率。代表的是诈骗分子被正确识别出来的个数与诈骗分子总数的比例。


微信图片_20190715163903.jpg

综合精确率与召回率才能真正判断,模型好坏,所以这里用F1值,F1越大拟合越好。

建模与可视化步骤:

1、数据加载与探索

2、数据规范化,特征选择,准备训练集与测试集

3、模型建立,代入训练集与测试集

4、预测样本的置信分数

5、求混淆矩阵值,混淆矩阵可视化
用cm = confusion_matrix(test_y, predict_y),# 代入真实值与预测值,形成tp,tn,fp,fn四维数组,然后计算精确率,召回率和F1值;将数据代入形成混淆矩阵可视化。

6、用precision,recall,thresholds=precision_recall_curve(test_y,score_y)计算精确率、召回率,阀值用于可视化。

具体代码:
import pandas as pd
import numpy as np
import seaborn as sns
import matplotlib.pyplot as plt
import itertools
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import confusion_matrix,precision_recall_curve
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
import warnings
warnings.filterwarnings('ignore')
#1、数据加载与探索
data=pd.read_csv("E:/数据学习网站/credit_fraud/creditcard.csv")
plt.rcParams["font.sans-serif"]=["SimHei"]
#绘制类别分布
# plt.figure()
# ax=sns.countplot(x='Class',data=data)
# plt.title("类别分布")
# plt.show()

#2、数据规范化与特征选择
data["Amount_Norm"]=StandardScaler().fit_transform(data['Amount'].values.reshape(-1,1))#将数值转化为1列数组(-1 相当于自适应行数与列数)
y=np.array(data.Class.tolist())
data=data.drop(['Time','Amount','Class'],axis=1)
x=np.array(data.as_matrix())
train_x,test_x,train_y,test_y=train_test_split(x,y,test_size=0.1,random_state=33)
#3、模型建立
model=LogisticRegression()
model.fit(train_x,train_y)
predict_y=model.predict(test_x)
#4预测样本的置信分数
score_y=model.decision_function(test_x)

#5、求混淆矩阵值,混淆矩阵可视化
def plot_confusion_matrix(cm,classes,normalize=False,title="混淆矩阵展示图",cmap=plt.cm.Blues):
    plt.figure()
    plt.imshow(cm,interpolation="nearest",cmap=cmap)
    plt.title(title)
    tick_marks=np.arange(len(classes))#图像刻度值
    plt.xticks(tick_marks,classes,rotation=0)#x轴刻度数,刻度范围
    plt.yticks(tick_marks,classes)#y轴刻度数,刻度范围
    thresh=cm.max()/2.
    for i,j in itertools.product(range(cm.shape[0]),range(cm.shape[1])):
        plt.text(j,i,cm[i,j],
                 horizontalalignment='center',
                 color="white" if cm[i,j]>thresh else "black")
    plt.xlabel("真实值")#标签
    plt.ylabel("预测值")
    plt.show()

def show_metrics():
    tp=cm[1,1]
    fn=cm[1,0]
    fp=cm[0,1]
    tn=cm[0,0]
    x1 = format(tp / (tp + fp))  # 精确率
    y1 = format(tp / (tp + fn))
    print('精确率:',x1)
    print('召回率:',y1)
    print('F1值:',format(2*(((tp/(tp+fp))*(tp/(tp+fn)))/((tp/(tp+fp))+(tp/(tp+fn))))))

#执行函数
cm = confusion_matrix(test_y, predict_y)  # 混淆矩阵计算,代入真实值与预测值,形成tp,tn,fp,fn四维数组
class_names=[0,1]
plot_confusion_matrix(cm, classes=class_names, title="逻辑回归 混淆矩阵")# 图像函数执行
show_metrics()

#6、绘制精确率召回线
def plot_precision_recall():
    plt.step(recall, precision, color='g', alpha=0.2, where='post')#曲线分段,代入x=召回值,y=精确值
    plt.fill_between(recall,precision,step='post',alpha=0.2,color='g')#绘制填充多边形,代入x=召回值,y=精确值
    plt.plot(recall,precision,linewidth=2)
    plt.xlim([0.0,1])#获取当前值的y限制
    plt.ylim([0.0,1.05])
    plt.xlabel('召回率')
    plt.title('精确率')
    plt.title('精确率-召回率 曲线')
    plt.show()

#计算精确率、召回率,阀值用于可视化
precision,recall,thresholds=precision_recall_curve(test_y,score_y)#代入真实值与估计的概率(置信分数),得到精确率、召回率
plot_precision_recall()

结果显示:

精确率:0.841
召回率:0.617
F1值:0.712
1.png

如图混淆矩阵,tp=28414,fp=7,tn=23,fn=37

2.png

这里也可用SVM.LinerSVC()来试一试:

结果:

精确率: 0.8333333333333334
召回率: 0.6666666666666666
F1值: 0.7407407407407408
SVM.png
svm1.png

通过F1值的对比:
最终的结果是SVM.LinerSVC()模型的准确率>LogisticRegression()
????我前面介绍那么久逻辑回归干嘛!!本篇重点是比例失衡时的模型评估方法啦!

数据:
链接:https://pan.baidu.com/s/14F8WuX0ZJntdB_r1EC08HA 提取码:58gp
自己可以动手试试呀~

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 215,463评论 6 497
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,868评论 3 391
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 161,213评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,666评论 1 290
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,759评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,725评论 1 294
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,716评论 3 415
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,484评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,928评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,233评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,393评论 1 345
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,073评论 5 340
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,718评论 3 324
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,308评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,538评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,338评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,260评论 2 352

推荐阅读更多精彩内容