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 发现的问题
- Time 属性没有价值
- Amount的数据值范围远超其他属性的规模,并需采用标准化转换
- 数据类别严重失衡时应采取过采样或下采样的策略
3.2 方案
通用的预处理:
- 移除Time属性
- 对Amount实施标准化处理
- 实现数据平衡
3.1 过采样算法(SMOTE)
3.2 欠采样技术(Under sampling) - 先将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技术生成新的小类样本点直至使两类样本的比例达到均衡;最后利用平衡后的数据集进行模型训练

