如何进行特征工程-案例电商平台用户欺诈检测
数据概览
假设我们有一个包含以下字段的原始交易数据集:
user_id:用户ID
transaction_id:交易ID
transaction_time:交易时间(时间戳)
transaction_amount:交易金额
product_category:商品类别
payment_method:支付方式(如信用卡、支付宝、微信等)
is_fraud:是否为欺诈行为(目标变量)
目标
通过特征工程,提取出可以有效帮助机器学习模型识别欺诈行为的特征,并通过这些特征训练出一个模型来预测新交易是否为欺诈。
1. 数据清洗
数据清洗的主要任务是去除无用数据、处理缺失值和异常值,保证数据的质量。
处理缺失值:检查数据中是否有缺失值。假设 payment_method 有部分缺失,我们可以使用众数填充,或者如果缺失值过多,选择删除这些记录。
去除重复值:检查是否有重复交易(通过 transaction_id 或 user_id 和 transaction_time 的组合进行去重)。
异常值检测:
交易金额 transaction_amount 如果过大(例如超过了一个合理阈值)或过小(例如0),可以考虑将其标记为异常值并去除。
通过可视化工具(如箱线图)识别异常数据。
2. 特征构造
特征构造是从现有的数据中提取出新的、更具代表性的信息。
时间特征:
交易时段:将 transaction_time 转化为小时、星期几、月等信息,帮助我们识别交易是否发生在不寻常的时间。例如,如果一个用户在深夜频繁交易,可能是欺诈行为。
是否是工作日:通过 transaction_time 判断交易是否发生在周末或节假日。
代码示例:
python
df['transaction_time'] = pd.to_datetime(df['transaction_time'])
df['hour'] = df['transaction_time'].dt.hour
df['day_of_week'] = df['transaction_time'].dt.weekday
df['is_weekend'] = df['day_of_week'].apply(lambda x: 1 if x >= 5 else 0)
用户行为特征:
- 单日交易频次:统计每个用户在当天的交易次数。如果用户在一天内进行大量交易,可能存在欺诈行为。
- 历史交易金额的均值和标准差:计算每个用户的历史交易金额的均值和标准差,帮助判断某个交易是否异常。
代码示例:
python
df['transaction_date'] = df['transaction_time'].dt.date
user_transaction_count = df.groupby(['user_id', 'transaction_date']).size().reset_index(name='transaction_count')
user_transaction_stats = df.groupby('user_id')['transaction_amount'].agg(['mean', 'std']).reset_index()
df = df.merge(user_transaction_count, on=['user_id', 'transaction_date'], how='left')
df = df.merge(user_transaction_stats, on='user_id', how='left')
商品类别与支付方式特征:
- 支付方式统计:计算每个用户使用不同支付方式的比例。如果用户频繁更换支付方式,可能存在欺诈风险。
- 商品类别统计:计算用户购买不同类别商品的次数,某些高风险商品类别可能和欺诈行为有关。
代码示例:
python
payment_method_count = df.groupby('user_id')['payment_method'].value_counts().unstack(fill_value=0)
product_category_count = df.groupby('user_id')['product_category'].value_counts().unstack(fill_value=0)
df = df.merge(payment_method_count, on='user_id', how='left')
df = df.merge(product_category_count, on='user_id', how='left')
3. 特征选择
特征选择旨在去除冗余或无关特征,保留对模型最有帮助的特征。
相关性分析:通过计算各个特征之间的相关性,去除高度相关的特征。例如,如果 transaction_amount 和 user_transaction_count 有较高的相关性,我们可能会选择保留其中一个特征。
代码示例:
python
correlation_matrix = df.corr()
L1正则化(Lasso回归):Lasso回归通过L1正则化来进行特征选择,可以自动把一些不重要的特征的系数收缩为0。
代码示例:
python
from sklearn.linear_model import Lasso
X = df.drop(columns=['is_fraud'])
y = df['is_fraud']
lasso = Lasso(alpha=0.01)
lasso.fit(X, y)
important_features = X.columns[(lasso.coef_ != 0)]
df_selected = df[important_features]
递归特征消除(RFE):通过递归删除不重要的特征,保留最有用的特征。
代码示例:
python
from sklearn.feature_selection import RFE
from sklearn.linear_model import LogisticRegression
model = LogisticRegression()
selector = RFE(model, n_features_to_select=10)
selector = selector.fit(X, y)
selected_features = X.columns[selector.support_]
df_selected = df[selected_features]
4. 特征转换
特征转换的目的是将特征转化为适合模型输入的形式,或者通过数学变换提升特征的表现力。
数值特征的标准化与归一化:
对于 transaction_amount 等数值型特征,可以使用标准化或归一化方法进行处理,以避免数值范围差异对模型造成影响。
代码示例:
python
from sklearn.preprocessing import StandardScaler
scaler = StandardScaler()
df['transaction_amount_scaled'] = scaler.fit_transform(df[['transaction_amount']])
类别特征的独热编码(One-Hot Encoding):
对于 payment_method 和 product_category 这样的类别特征,我们使用独热编码(One-Hot Encoding)将它们转化为数值型特征。
代码示例:
python
df = pd.get_dummies(df, columns=['payment_method', 'product_category'], drop_first=True)
5. 模型训练与评估
最终,使用构建好的特征来训练一个机器学习模型,判断哪些交易是欺诈的。
模型选择:我们选择一个分类模型来训练,比如随机森林、XGBoost或逻辑回归。
训练模型:将处理后的数据分为训练集和测试集,用训练集训练模型,测试集评估模型性能。
模型评估:通过混淆矩阵、准确率、召回率、F1-score等指标评估模型效果。
代码示例:
python
from sklearn.model_selection import train_test_split
from sklearn.ensemble import RandomForestClassifier
from sklearn.metrics import classification_report
X = df_selected.drop(columns=['is_fraud'])
y = df_selected['is_fraud']
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
model = RandomForestClassifier(n_estimators=100, random_state=42)
model.fit(X_train, y_train)
y_pred = model.predict(X_test)
print(classification_report(y_test, y_pred))
- 总结
在本案例中,我们通过以下步骤实现了一个电商平台的欺诈检测模型:
数据清洗:处理缺失值、去除重复值和异常值。
特征构造:提取时间特征、用户行为特征、支付方式和商品类别特征。
特征选择:通过相关性分析、Lasso回归、RFE等方法选择最有用的特征。
特征转换:对数值特征进行标准化,对类别特征进行独热编码。
模型训练与评估:使用随机森林模型训练并评估模型性能。
特征工程是机器学习成功的关键,它通过精心设计的特征能够帮助模型更好地学习数据中的潜在规律,提高模型的预测准确性。在实际应用中,不同的数据集和问题需要灵活地调整特征工程的策略。