首先导入所需要的工具包。
import pandas as pd
import matplotlib.pyplot as plt
import numpy as np
%matplotlib inline
接下来导入数据
点击下方链接获取数据:
https://download.csdn.net/download/weixin_42410915/12822262
data = pd.read_csv('c:/users/lenovo/Desktop/card.csv')
data.head() #默认展示数据的前5行记录
原始数据为个人交易记录,该数据总共31列,其中数据特征有30列,Time列暂时不考虑,Amount列表示贷款的金额,Class列表示分类结果,0为交易记录正常,若Class为1代表交易异常。
实际生活中,正常交易占绝大多数,异常交易仅占一小部分。由于数据太多,查看异常交易的情况有些麻烦,value_counts()函数可以算出数据中有哪些不同值,并计算每个值有多少个重复值。由此可以得到异常交易的数量。
count_classes = data['Class'].value_counts()
count_classes
结果如下:
但是绘制一张图表是不是更能清晰地表达交易状况呢?
此时需要将pandas和matplotlib库结合一下。
count_classes.plot(kind='bar')
plt.title('Fraud class histogram')
plt.xlabel('Class')
plt.ylabel('Frequency')
结果如下:
不管从数据还是从图表中都可知异常数据非常少,而我们的目标就是找到异常数据,如果搭建的模型不重视极少数数据,结果就没有意义了,所以,要改进数据的不平衡性。 解决数据不平衡问题,让两者的数据相差不大即可。通常采用下采样、过采样这两种方法。
下采样:若一组的数据非常少,让另一组数据变少,使两者比例均衡。即从正常数据中随机抽取大约500条数据即可。看似方法挺简单,但只利用了上万条数据中的一小部分,会不会对结果产生影响呢?
过采样:不放弃任何一条数据,通过制造出一些异常数据,让两组数据一样多。数据生成也是现阶段常见的一种方法。但是假设得到的数据是否符合真实情况,对结果造成影响呢?
前辈说:数据特征决定结果的上限,模型的调优只决定如何接近这个上限。 机器学习的核心其实都在数据处理中,数学建模只是其中一部分。
from sklearn.preprocessing import StandardScaler
#将Amount标准化,并赋给新的列NormAmount
data['NormAmount'] = StandardScaler().fit_transform(data['Amount'].values.reshape(-1,1))
data = data.drop([&#