前面我们花了3节的时间介绍了关于机器学习常用的numpy、pandas、matplotlib库。 今天我们综合介绍一下它们的联合使用。
##关于信用卡欺诈的案例分析
我们今天读取一个信用卡的统计信息, 来分析样本的信息。
下面的代码中, ‘Class’列的数据信息, 0表示正常,1表示异常, 那么会表现出来这个样本数据是极度的不均衡的数据(均衡的数据,比方一些网站信息统计男女比率等)
1 | import pandas as pd |
通过上图我们可以得到一个柱状图,显示出现正常数据和异常数据之前的分布关系。
由于这种极度不均衡的数据,假如一共1000条的数据, 其中0表示的数据有990条, 1表示的数据有10条, 那么在设置训练集中,很容易建立出来一个模型, 要么这个‘class’都是0, 要么这个‘class’的精度是99%, 但在实际中缺没有任何实际的意义。
那么,对于这种情况这里可以用到的常规方案:
- 下采样方案 (让两端的数据一样的少, 比如在990条中选出来10条0的数据, 再与1的数据10条组合成训练集, 再训练模型)
- 过采样方案(让两端的数据一样的多, 设置将1的条数,变换出来990条, 让1的数据与0的数据一样的多, 再训练模型)
当然还有其他的方案,比方按照比率关系来采样。
###预处理的操作
####1、标准化操作(归一化操作)
一些特征数据的值差异比较大, 比如:Amount字段, 有的数据是140.3, 有的数据只有2.34, 那么我们通过以下代码操作:
1 | from sklearn.pregrocessing import StandardSCaler |
将里面一个列的数据,转到到一个区间上。 并删除之前不用关注或者不再使用的列。
重点: 标准化的操作很重要,可以消除数据本身单位造成的影响。
例如:
一组数据中有A,B列, A列中的数据都是0-1之间的数据, B列中的数据是500-1000的数据。
如果我们不做标准化的处理, 那么根据线性方程计算公式
y = w1 * x1 + w2 * x2
(假如不考了w1,w2权重的情况), x1代表A列数据特征, x2代表B列数据特征;
那么由于A,B列的数据值本身的取值范围就不同, 假如在w1=w2的情况, x2如果不做标准化的处理,那么计算出来的结果,会使得这个y更收x2的影响, 所以我们为了保证两者的取值范围相同,就需要先使用这种标准化的预处理的操作。
####2、下采样方案
首先将所有class=0的数据,和class=1的数据分开。
1 | #x,y 代表特征和label分开 |
接着,我们在所有class=0的数据,随机找出来n条数据, (n的值与class=1的所有数据的个数相等)
1 |
|
最后,我们将class=1和class=0的数据,组合在一起(形成一个新的训练集)
1 | #组合成一个新的训练集 |
最后获取了下采样后的class=0和class=1的数据集了
####3、对采样的数据进行分割
这里我们使用的一个新的库 sklearn, 比如我们的数据一共有100个, 我们可以通过sklearn,将其中3/4的数据当做训练集, 将1/4的数据当做测试集, 当然这个分割为几份是我们自定义的。
1 | from sklearn.cross_validation import train_testsplit |