import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif'] = ['SimHei']
raw_credit = pd.read_csv('creditcard.csv')#数据可以在kaggle上获取
raw_credit.head()
plt.pie(pd.value_counts(raw_credit['Class']),explode=[0,0.2],
labels=['不欺诈','欺诈'],autopct='%.2f%%',
colors=['lightgreen','red'])
plt.axis('equal')
plt.show()
样本类别中99%多都是为非欺诈类别,样本类别严重不平衡,就算把欺诈类别分类错误的,也可以得到很高正确率
所有对于这个数据应该采用其他衡量指标
1: 混淆矩阵
2:F1score
3:auc
对数据重采样:对小类的数据样本进行采样来增加小类的数据样本个数,即过采样(over-sampling ,采样的个数大于该类样本的个数。
对大类的数据样本进行采样来减少该类数据样本的个数,即欠采样(under-sampling,采样的次数少于该类样本的个素。
smote:Synthetic Minority Over-Sampling Technique,对少数类样本进行分析并根据少数类样本人工合成新样本添加到数据集中
各种采样的优缺点:
过采样只是简单复制了小类,会过分强调已有的小类,导致对小类的过拟合
欠采样抛弃了很多大类的样本,弱化了大类的影响,会导致模型偏差较大。
因此有一种做法:重复欠采样,每个子样本都使用全部小类,而大类采用不重复采样,生成 大类/小类 个子样本,训练 大类/小类 个模型,最后
集成结果。这种做法的缺点:
要训练多个模型,增加了计算开销,小类数据被反复使用,容易造成过拟合。
from sklearn.preprocessing import StandardScaler
sc = StandardScaler()
raw_credit['norm_amount'] = sc.fit_transform(raw_credit['Amount'][:,np.newaxis])
credit = raw_credit.drop(['Time','Amount'],axis=1)
x = credit.drop('Class',axis=