大数据分析实战-信用卡欺诈检测(二)-下采样方案和交叉验证
第一部分已经写到这里了,看完第一部分再看这一部分:大数据分析实战-信用卡欺诈检测
文章目录
- 下采样方案
- 交叉验证
下采样方案
下采样方案的实现过程比较简单,只需要对正常样本进行采样,得到与异常样本一样多的个数即可,代码如下∶
# 下采样# x是所有的非class行,y是class行,相当于把数据切分成了两部分
x =data.loc[:,data.columns != 'Class']
y =data.loc[:,data.columns == 'Class']# 统计交易异常的列数并取出index
number_records_fraud = len(data[data.Class == 1])
fraud_indices = np.array(data[data.Class == 1].index)#取出来class==1的数据# 正常交易的
normal_indices = data[data.Class == 0].index# 从正常值的索引中,选择和异常值相等个数的样本,保证样本的均衡:
# np.random.choice(a,size, replace, p):在a中以概率p随机选择size个数据,replace是指是否有放回;
random_normal_indices = np.random.choice(normal_indices, number_records_fraud, replace=False)
# 将数据转换成数组:
random_normal_indices = np.array(random_normal_indices)# concatenate:数据库的拼接;axis=1:按照对应行的数据进行拼接;
under_sample_indices = np.concatenate([fraud_indices, random_normal_indices])# loc["a","b"]:表示第a行,第b列;
# iloc[1,1]:按照行列来索引,左式为第二行第二列;
# 获取下标所在行的所有列,即得到训练所需要的数据集:
under_sample_data = data.iloc[under_sample_indices,:]
# 将数据集按照class列进行分类,
x_undersample = under_sample_data.iloc[:, under_sample_data.columns!='Class']
y_undersample = under_sample_data.iloc[:, under_sample_data.columns=='Class']
print("正常 样本所占整体 比 例∶",len(under_sample_data[under_sample_data.Class == 0]) /len(under_sample_data))
print("异常样本所占整体比例∶",len(under_sample_data[under_sample_data.Class == 1]) / len(under_sample_data))
print("下采样策略总体样本数量∶",len(under_sample_data))print(len(under_sample_data))
整体流程比较简单,首先计算异常样本的个数并取其索引,接下来在正常样本中随机选择指定个数样本,最后把所有样本索引拼接在一起即可。上述输出结果显示,执行下采样方案后,一共有984条数据,其中正常样本和异常样本各占 50%,此时数据满足平衡标准。
交叉验证
得到输入数据后,接下来划分数据集,在机器学习中,使用训练集完成建模后,还需要知道这个模型的效果,也就是需要一个测试集,以帮助完成模型测试工作。不仅如此,在整个模型训练过程中,也会涉及一些参数调整,所以,还需要验证集,帮助模型进行参数的调整与选择。突然出现很多种集合,感觉很容易弄混,再来总结一下。
首先把数据分成两部分,左边是训练集,右边是测试集,如图所示。训练集用于建立模型,例如以梯度下降来迭代优化,这里需要的数据就是由训练集提供的。测试集是当所有建模工作都完成后使用的,需要强调一点,测试集十分宝贵,在建模的过程中,不能加入任何与测试集有关的信息,否则就相当于透题,评估结果就不会准确。可以自己设定训练集和测试集的大小和比例,8∶2、9 ∶1都是常见的切分比例。
接下来需要对数据集再进行处理,如图所示,可以发现测试集没有任何变化,仅把训练集划分成很多份。这样做的目的在于,建模尝试过程中,需要调整各种可能影响结果的参数,因此需要知道每一种参数方案的效果,但是这里不能用测试集,因为建模任务还没有全部完成,所以验证集就是在建模过程中评估参数用的,那么单独在训练集中找出来一份做验证集(例如 fold5)不就可以了吗,为什么要划分出来这么多小份呢?
如果只是单独找出来一份,恰好这一份数据比较简单,那么最终的结果可能会偏高;如果选出来的这一份里面有一些错误点或者离群点,得到的结果可能就会偏低。无论哪种情况,评估结果都会出现一定偏差。
为了解决这个问题,可以把训练集切分成多份,例如将训练集分成 10份,如图所示。在验证某一次结果时,需要把整个过程分成 10步,第一步用前9份当作训练集,最后一份当作验证集,得到一个结果,以此类推,每次都依次用另外一份当作验证集,其他部分当作训练集。这样经过10步之后,就得到10个结果,每个结果分别对应其中每一小份,组合在一起恰好包含原始训练集中所有数据,再对最终得到的 10个结果进行平均,就得到最终模型评估的结果。这个过程就叫做交叉验证。
交叉验证看起来有些复杂,但是能对模型进行更好的评估,使得结果更准确,从后续的实验中,大家会发现,用不同验证集评估的时候,结果差异很大,所以这个套路是必须要做的。在sklearn工具包中,已经实现好数据集切分的功能,这里需先将数据集划分成训练集和测试集,切分验证集的工作等到建模的时候再做也来得及,代码如下
#划分训练测试集进行交叉检验
from sklearn.model_selection import train_test_split
# 对整个数据集
X_train,X_test,y_train,y_test=train_test_split(x,y,test_size=0.3,random_state=0)
print("Number transactions train dataset: ", len(X_train))
print("Number transactions test dataset: ", len(X_test))
print("Total number of transactions: ", len(X_train)+len(X_test))
# 下采样的数据集进行切分,这里是设的测试集比例为0.3
X_train_undersample, X_test_undersample, y_train_undersample, y_test_undersample = train_test_split(x_undersample,y_undersample,test_size = 0.3,random_state = 0)
print("")
print("Number transactions train dataset: ", len(X_train_undersample))
print("Number transactions test dataset: ", len(X_test_undersample))
print("Total number of transactions: ", len(X_train_undersample)+len(X_test_undersample))
通过输出结果可以发现,在切分数据集时做了两件事∶首先对原始数据集进行划分,然后对下采样数据集进行划分。我们最初的目标不是要用下采样数据集建模吗,为什么又对原始数据进行切分操作呢?这里先留一个伏笔,后续将慢慢揭晓。
大数据分析实战-信用卡欺诈检测(二)-下采样方案和交叉验证相关推荐
- 大数据分析实战-信用卡欺诈检测(五)-逻辑回归模型
大数据分析实战-信用卡欺诈检测(一) 大数据分析实战-信用卡欺诈检测(二)-下采样方案和交叉验证 大数据分析实战-信用卡欺诈检测(三)- 模型评估 大数据分析实战-信用卡欺诈检测(四)-正则化惩罚 逻 ...
- 大数据分析实战-信用卡欺诈检测(四)-正则化惩罚
大数据分析实战-信用卡欺诈检测(一) 大数据分析实战-信用卡欺诈检测(二)-下采样方案和交叉验证 大数据分析实战-信用卡欺诈检测(三)- 模型评估 文章目录 正则化惩罚 正则化惩罚 正则化惩罚,这个名 ...
- 大数据分析实战-信用卡欺诈检测(三)- 模型评估
大数据分析实战-信用卡欺诈检测(二)-下采样方案和交叉验证 大数据分析实战-信用卡欺诈检测(一) 文章目录 模型评估方法 模型评估方法 接下来,没错,还没到实际建模任务,还需要考虑模型的评估方法,为什 ...
- 大数据分析实战-信用卡欺诈检测
文章目录 数据分析与预处理 数据读取与分析 样本不均衡解决方案 特征标准化 数据分析与预处理 假设有一份信用卡交易记录,遗憾的是数据经过了脱敏处理,只知道其特征,却不知道每一个字段代表什么含义,没关系 ...
- 机器学习项目实战----信用卡欺诈检测(二)
六.混淆矩阵: 混淆矩阵是由一个坐标系组成的,有x轴以及y轴,在x轴里面有0和1,在y轴里面有0和1.x轴表达的是预测的值,y轴表达的是真实的值.可以对比真实值与预测值之间的差异,可以计算当前模型衡量 ...
- 【机器学习】信用卡欺诈检测 (下采样、SMOTE过采样、集成学习、Pytorch)
2022.4.17 补充 视频:[参考:6-01 信用卡交易欺诈数据检测 _哔哩哔哩_bilibili] [参考:机器学习/Kaggle/信用卡欺诈检测/Tommy/数据不平衡.ipynb · mya ...
- 毕业设计 - 题目:基于大数据的信用卡欺诈检测
文章目录 0 简介 1 数据集 2 分析流程 3 数据预览 3.1 数据浏览 3.1.1 查看数据分布 4 数据规范化 4.1 amount特征缩放并去除time字段 4.2 解决样本不均衡问题 5 ...
- python之逻辑回归项目实战——信用卡欺诈检测
信用卡欺诈检测 1.项目介绍 2.项目背景 3.分析项目 4.数据读取与分析 4.1 加载数据 4.2 查看数据的标签分布 5.数据预处理 5.1 特征标准化 5.2. 使用下采样解决样本数据不均衡 ...
- 机器学习项目实战----信用卡欺诈检测
一.任务基础 数据集包含由欧洲人于2013年9月使用信用卡进行交易的数据.此数据集显示两天内发生的交易,其中284807笔交易中有492笔被盗刷.数据集非常不平衡,正例(被盗刷)占所有交易的0.172 ...
最新文章
- 优质免费在线学习网站【自用】
- MongoDB和MySQL的区别
- Eclipse 工作目录被破坏,导致Eclipse 打不开
- 从完整的新手到通过TensorFlow开发人员证书考试
- 第五课 机器学习中的特征工程
- linux jar和zip,Linux命令———zip和jar文件压缩解压
- 【数据库基础知识】数据库表格——主键和外键
- tensorflow 在加载大型的embedding模型参数时,会遇到cannot be larger than 2GB
- 什么是TensorBoard?
- Android 别踩白块 源码分析
- 传海思为 PC 开发 CPU/GPU ;小米将发布第二款 5G 手机;Firefox 68.0.2 发布 | 极客头条...
- IS-IS详解(六)——IS-IS LSP机制详解
- 油猴脚本(tampermonkey)推荐与下载
- leetcode:骑士在棋盘上的概率
- asp.net MVC使用 jsQR 扫描二维码
- EXCEL对比重复数据
- 世界各个国家及其国家代码
- 传教士 野人 过河问题
- 狂神说Linux笔记
- 工业软件国产化路在何方?INTEWELL助力民族工业落地生“根”
热门文章
- python中elif可以单独使用吗_python中elif可以单独使用吗
- opcua协议服务器端口号,opc ua服务器 数据配置
- vmware VCenter6.7以上版本导出ova
- java 事件类型_Spring框架中有哪些不同类型的事件?
- 线性回归用matlab怎么做,matlab中如何应用regress()函数进行线性回归分析?
- jeesite中activiti中的流程表梳理
- 6-10 阶乘计算升级版(20 分)
- [LeetCode]819. 最常见的单词
- 换linux服务器 验证码不显示
- mysql5.7.17安装问题