Advertisement

4.实操(Credit Card Fraud Detection)

阅读量:

目录

  • 三、问题+方案

    • 3.1 发现的问题
    • 3.2 方案
  • 四、Data Preprocessing

    • 4.1 Standardization
    • 4.2 Under sample
    • 4.3 Data split
    • 4.4 SMOTE
  • 第五章 模型构建

  • 5.1 使用Logistic回归模型

  • 5.2 经过多类过采样处理后的测试样本集被用于性能评估

  • 5.3 对未经过采样处理的原始测试集进行性能验证

  • 5.4 通过SMOTE方法生成合成样本以提升模型训练效果

  • 5.5 将过采样技术和SMOTE方法相结合用于模型优化

一、数据挖掘流程

  • 读取数据
    • 分析数据架构及其分布情况,并识别潜在问题
    • 针对发现的问题提出多样化的解决方案策略
    • 进行标准化、归一化以及缺失值处理等预处理工作
    • 将数据集划分为训练集、验证集和测试集以便后续建模流程开展
    • 基于准确率、召回率等指标选择合适的评估方法以确保模型效果可测性
    • 构建多元化的机器学习模型框架以适应不同场景需求
    • 记录建模过程并进行结果分析与性能优化以提升模型泛化能力
    • 对不同方案进行对比研究以确定最优策略以实现最佳效果平衡

二、Data Preview

2.1 data. shape

(284807, 31)

2.2 data. head()

在这里插入图片描述
  • 可观察到该数据集的属性包含Time, V1至V28以及Amount。
  • 除Amount外其余的均经过Standardization处理。
  • Time属性无用且计划予以删除。
  • 仍需进一步确认是否对Amount进行标准化缩放处理。

2.3 data.describe()

复制代码
    data.descirbe(include='all')

可以看到Amount的统计量:

  • mean:88.34
  • std:250
  • min:0
  • 25%:5.6
  • 50%:22
  • 75%:77.2
  • max:25691

2.4 check NaN

此案例没有缺失值

2.5 Class Distribution

0 : 284315 (99.8%)
1 : 492 (0.2%)
isFraud发生的极其少,数据极不平衡,之后需要SMOTE或者Under sample

2.6 correlation heatmap

复制代码
    import seaborn as sns
    corr = data.corr()  #传入要看相关性的属性或全部列data.corr()
    plt.figure(figsize=(15,15))
    sns.heatmap(corr,square=True) ##annot=Ture 显示每个方格的数据  fmt参数控制字符属性
    plt.show()
在这里插入图片描述

难以识别哪些属性变量之间具有较高的相关性程度;主要原因可能是由于严重失衡所导致的

三、问题+方案

3.1 发现的问题

  1. Time 属性没有价值
  2. Amount的数据值范围远超其他属性的规模,并需采用标准化转换
  3. 数据类别严重失衡时应采取过采样或下采样的策略

3.2 方案

通用的预处理:

  1. 移除Time属性
  2. 对Amount实施标准化处理
  3. 实现数据平衡
    3.1 过采样算法(SMOTE)
    3.2 欠采样技术(Under sampling)
  4. 先将notFraud样本欠采样至约600个数量级,并随后应用SMOTE技术。

四、Data Preprocessing

4.1 Standardization

复制代码
    from sklearn.preprocessing import StandardScaler
    data['Amount'] =  StandardScaler().fit_transform(data['Amount'].values.reshape(-1,1))

如果fit_transform传入的数据只有一列需要加values.reshape(-1,1)

4.2 Under sample

复制代码
    # undersample 抽取data中所有的fraud 样本400多个,然后在剩下的class=0的样本中sample相等数量的样本就行
    fraud_data = data[data["Class"]==1]   # fraud_data dataframe
    number_records_fraud = len(fraud_data) # how many fraud samples:492
    not_fraud_data = data[data["Class"]==0].sample(n=number_records_fraud)   
    training_data_1 = pd.concat([fraud_data,not_fraud_data])

tips:这里新生成的training_data_1的索引是未经过重排序的,是乱的

进行feature和class的分离

复制代码
    X_under = training_data_1.drop(['Class'],axis=1)
    y_under = training_data_1['Class']

基于under-sampled数据集进行分析后绘制各属性的相关性热力图
研究发现,在分析各变量之间的关系时能够明显看出变量组 V₁₆至 V₁₈之间存在较强的正相关关系
此外,在其他变量如 V₁ 和 V₂ 之间也显示出较强的负相关关系

在这里插入图片描述

4.3 Data split

对原始数据进行分离

复制代码
    from sklearn.model_selection import train_test_split
    train_x, test_x, train_y, test_y = train_test_split(X, y, test_size=0.3, random_state=33)

对undersample的数据进行分离

复制代码
    train_x_under, test_x_under, train_y_under, test_y_under = train_test_split(X_under, y_under, test_size=0.3, random_state=33)

4.4 SMOTE

复制代码
    from imblearn.over_sampling import SMOTE,ADASYN
    features_data,label_data = SMOTE().fit_resample(features_data,np.ravel(label_data))
    X_smote,y_smote = SMOTE(random_state=33).fit_resample(X,np.ravel(y))
    X_smote = pd.DataFrame(X_smote,columns=features_name)
    y_smote = pd.DataFrame({"Class":y_smote})

五、模型构建

5.1 Logistic Regression

复制代码
    from sklearn.linear_model import LogisticRegression
    from sklearn.model_selection import GridSearchCV
    parameters={'penalty':['l1','l2'],'C':[0.01,0.1,1,3,10]} 
    #C是惩罚力度,与直觉相反,C越小惩罚力度越大
    
    clf = LogisticRegression(n_jobs=-1)
    model = GridSearchCV(estimator=clf,param_grid=parameters,cv=8,n_jobs=-1,scoring='recall')
    model.fit(train_x_under,train_y_under)
    print(model.best_score_)
    print(model.best_params_)

用于GridSearchCV输入不同评估指标Recall和AUC

5.2 使用undersample后的测试数据进行评估

复制代码
    train_x_under, test_x_under, train_y_under, test_y_under
复制代码
    clf = LogisticRegression(C=1,penalty='l1')
    clf.fit(train_x_under,train_y_under)
    predict = clf.predict(test_x_under)

再使用evaluate方法

在这里插入图片描述

5.3 对原始数据的测试集进行评估

复制代码
    train_x, test_x, train_y, test_y
复制代码
    clf = LogisticRegression(C=1,penalty='l1')
    clf.fit(train_x,train_y)
    predict = clf.predict(test_x)
    evaluate(predict,test_y,[0,1])
在这里插入图片描述

fraud的recall rate偏低,所有151个fraud样本中只有62%被找出来

5.4 使用SMOTE训练

SMOTE过后的数据 0:1 = 28万:28万

复制代码
    clf = LogisticRegression(C=0.01,penalty='l1')
    clf.fit(X_smote,y_smote)
    predict = clf.predict(test_x)
在这里插入图片描述

误报率提高了好多,正常的被分类成fraud的有2000多个

5.5 结合undersample 和 SMOTE

随后将notFraud样本进行比例缩减至7:1(即从原先的约492增至700),使得抽样后的比例达到7:1;随后应用SMOTE技术生成新的小类样本点直至使两类样本的比例达到均衡;最后利用平衡后的数据集进行模型训练

在这里插入图片描述

全部评论 (0)

还没有任何评论哟~