3. 特征工程

在这一部分,我们将对数据进行特征工程处理,包括特征选择、数据预处理以及数据集划分,为后续建模做准备。

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
喜欢就支持一下吧
点赞8 分享
评论 抢沙发
头像-大赛人网
欢迎您留下宝贵的见解!
提交
头像-大赛人网

昵称

取消
昵称

    请登录后查看评论内容