在这一部分,我们将对数据进行特征工程处理,包括特征选择、数据预处理以及数据集划分,为后续建模做准备。
3.1 特征选择
我们需要确定哪些特征对于欺诈交易检测是重要的,可能需要去除无用特征或构造新的特征。
(1)去除无关特征
数据集中包含 Time 和 Amount 两个原始特征,其余 V1-V28 为 PCA 变换后的特征,我们需要判断 Time 是否对欺诈检测有价值。
此外,我们对 Amount 进行标准化处理,以适应模型需求。
# 去除无关特征 'Time'
df = df.drop(columns=['Time'])
# 归一化交易金额 'Amount'
from sklearn.preprocessing import StandardScaler
scaler = StandardScaler()
df['Amount'] = scaler.fit_transform(df[['Amount']])
# 查看数据处理后的信息
print("数据集处理后信息:")
print(df.head())
3.2 处理类别不平衡问题
由于欺诈交易的数量远远少于正常交易,我们需要采用适当的方法来平衡数据,避免模型倾向于预测多数类别。
(1)欠采样(Under-sampling)
我们可以减少正常交易的数量,使其与欺诈交易数量相当。
from imblearn.under_sampling import RandomUnderSampler
X = df.drop(columns=['Class']) # 选择特征
y = df['Class'] # 目标变量
# 进行欠采样,使欺诈交易和正常交易数量相等
rus = RandomUnderSampler(random_state=42)
X_resampled, y_resampled = rus.fit_resample(X, y)
# 重新合并成 DataFrame
df_resampled = pd.concat([pd.DataFrame(X_resampled, columns=X.columns), pd.DataFrame(y_resampled, columns=['Class'])], axis=1)
# 重新检查类别分布
print("欠采样后数据类别分布:")
print(df_resampled['Class'].value_counts())
3.3 训练集和测试集划分
在进行建模前,我们需要将数据划分为训练集和测试集,以评估模型的泛化能力。
from sklearn.model_selection import train_test_split
# 划分训练集和测试集,80% 作为训练集,20% 作为测试集
X_train, X_test, y_train, y_test = train_test_split(X_resampled, y_resampled, test_size=0.2, random_state=42, stratify=y_resampled)
# 输出数据集划分结果
print(f"训练集样本数:{X_train.shape[0]}")
print(f"测试集样本数:{X_test.shape[0]}")
3.4 小结
- 去除了
Time特征,保留Amount并进行了标准化处理。 - 解决类别不平衡问题,使用欠采样 使正常交易与欺诈交易的数量相当。
- 划分训练集和测试集,为后续模型训练做好准备。
© 版权声明
文章版权归作者所有,未经允许请勿转载。
THE END











请登录后查看评论内容