数据挖掘实战(二)—— 类不平衡问题_信用卡欺诈检测
写在jupyter里面比较漂亮:
In [34]: import pandas as pd import matplotlib.pylab as plt import numpy as np %matplotlib inline In [35]: data = pd.read_csv('creditcard.csv') data.head() # 0 - 正常的样本,1 - 有问题的数据
Out[35]:
In [36]: count_classes = pd.value_counts(data['Class'], sort=True).sort_index() count_classes.plot(kind = 'bar', alpha=0.5) plt.title('Fraud class histogram') plt.xlabel('Class') plt.ylabel('Frequency') # 此时无缺陷的样本数非常多,有缺陷的样本非常的少,可以明显看到 样本分布非常不平衡 Out[36]: <matplotlib.text.Text at 0xfc64470>
样本不均衡解决方案
-
下采样 (两者一样小)
- 从0的样本中选取 跟 1的样本一样小
-
过采样 (两者一样多)
- 1的样本中采取生成策略,生成的数据和 0号样本一样多
标准化
- 比如Amount,数据量区间很大,会对模型有一个“数据大就重要的”误区; 所以要进行归一化,或者标准化
- 把他们区间放在 [-1,1] 或者[0, 1]区间上
In [37]: # 这个sklearn库: 预处理操作 => 标准化的模块 from sklearn.preprocessing import StandardScaler # fit_transform(): 对数据进行一个变化了; 变化好的列成为一个新属性添加到 data data['normAmount'] = StandardScaler().fit_transform(data['Amount'].reshape(-1, 1)) data = data.drop(['Time', 'Amount'], axis=1) data.head()
Out[37]: