使用的数据集为creditcard.csv,先使用pandas读取数据集并查看下数据集的内容。
# 读取数据集并查看数据属性
data = pd.read_csv("creditcard.csv")
print(data.head())
图一
观察上面的数据后,由于这是一个分类问题,所以说我们需要查看数据的类别分布是否是均衡的,如果不均衡则会影响分类的结果。由于绘制的图形不是很难,所以使用pandas自带的绘图API即可(series.plot)。
# 作为一个二分类问题,先查看下样本分布是否均衡
count_classes = pd.value_counts(data['Class'], sort=True).sort_index()
print(type(count_classes))
# 绘制分布图
count_classes.plot(kind = 'bar')
plt.title("Fraud class histogram")
plt.xlabel("Class")
plt.ylabel("Frequency")
plt.show()
由图像可以看出,数据集的类别分布十分不均匀,大部分都是0类(正常用户),而1类用户(欺诈用户)是笔记少的,所以我们需要对数据进行处理,这里的话可以采用两种方式,向上采样和向下采样,向上采样的意思是对于不足的类别进行生成(最简单的办法每个属性分布使用其属性的均值即可),向下采样(数量多的样本选取出一定数目的样本用于训练,使其数目和数量少的样本保持一致)。
而再处理向上采样和向下采样之前,我们需要先对数据进行一些预处理。由图一可以看出,数据集中Amount属性的分布十分不均匀,或大或小,而且和其他属性的值相差过大,这样对于大部分模型来说,会让算法误以为这个属性十分重要,但是这个是不一定的,所以我们需要对这个属性进行预处理,一般来说是使用归一化或者标准化即可,在这里我们使用标准化。而time属性很明显是一个无关的属性,所以我们选择直接舍弃这个属性。
# 由于Amount属性不均衡,所以对其进行归一化处理
data['normAmount'] = StandardScaler().fit_transform(data['Amount'].reshape(-1, 1))
data = data.d