本案例主要是通过对不均衡的28万组数据建立模型,分析预测欺诈用户,采用sigmod函数作为损失函数,采用交叉验证的方法
和l1正交法则,比对了不同惩罚函数下的模型的召回率,也通过预测值和实际值做出混淆矩阵更加直观看到各种预测结果。
也比较了sigmod函数下的不同阈值下的模型预测的精度和召回率。
以下是部分数据格式,代码中对每一步如何做以及为什么做了详细的说明。可能有某些库的版本不同会出现错误。
数据格式:
Python源码:
#!/usr/bin/env python
# encoding: utf-8
"""
@Company:华中科技大学电气学院聚变与等离子研究所
@version: V1.0
@author: Victor
@contact: [email protected] or [email protected] 2018--2020
@software: PyCharm
@file: LG.py
@time: 2018/11/16 16:32
@Desc:
"""
import pandas as pd
import matplotlib.pyplot as plt
import numpy as np
data = pd.read_csv("creditcard.csv")
data.head()
##该案列中Class是分类,1表示该用户是欺诈用户,0表示为好用户
count_classes = pd.value_counts(data['Class'],sort=True).sort_index()##取出Class列中不同数的个数,并按照大小排序
print(count_classes)
plt.figure(1)
count_classes.plot(kind='bar')###直接调用pd中的plot画直方图
plt.title("Fraud class histogram")
plt.xlabel("Class")
plt.ylabel("Frequency")
from sklearn.preprocessing import StandardScaler
data['normAmount']=StandardScaler().fit_transform(data['Amount'].reshape(-1,1))##因为机器默认Amout大小与某个特征数据的大小相对应,影响建模,所以对Amount进行标准化
data = data.drop(['Time','Amount'],axis=1)
data.head(3)
X = data.ix[:,data.columns != 'Class']##取得除去Class列的所有数据
y = data.ix[:,data.columns == 'class']
#X.head()
#y.head()
number_records_fraud = len(data[data.Class == 1])##class为1的数量
fraud_indices = np.array(data[data.Class == 1].index)###取出所有class为1在源文件中编号
##print(fraud_indices)
normal_indices = data[data.Class == 0].index
##向下采样:保证数据一样少
random_normal_indices = np.random.choice(normal_indices,number_records_fraud,replace=False)
#print(random_normal_indices)
random_normal_indices = np.array(random_normal_indices)##将其变为数组形式,方便使用
#print(random_normal_indices)
##将class为0和1的等量样本数据的编号整合到一起
under_sample_