理解为什么预处理不是可选项——它 是任何成功机器学习模型的核心。学会在接触任何算法之前诊断数据集的健康状况。
"数据科学80%是数据清理,20%是抱怨清理数据。" ——匿名
在现实世界中,数据从不干净、有序且准备就绪。它通常带有:
NaN、None、""、?)直接后果: 将脏数据输入模型会导致其学习错误的模式。垃圾进→垃圾出。
在做任何事情之前,像侦探一样探索您的数据集。
import pandas as pd
# 加载数据集
df = pd.read_csv("欺诈数据.csv")
# 快速预览
print(df.head())
print(df.info()) # 数据类型和非空计数
print(df.describe()) # 描述性统计(仅数值)
# 查看分类列中的唯一值
print(df['交易类型'].unique())
print(df['国家'].value_counts())
# 检查空值
print(df.isnull().sum())
import seaborn as sns
import matplotlib.pyplot as plt
# 数值变量的直方图
sns.histplot(df['交易金额'], bins=50, kde=True)
plt.title("交易金额分布")
plt.show()
# 箱线图检测异常值
sns.boxplot(x=df['交易金额'])
plt.title("箱线图:发现金额中的异常值")
plt.show()
# 分类变量的条形图
sns.countplot(data=df, x='卡片类型')
plt.title("卡片类型分布")
plt.xticks(rotation=45)
plt.show()
选项1:删除行或列
# 删除包含任何NaN的行
df_clean = df.dropna()
# 删除包含超过50% NaN的列
df_clean = df.dropna(axis=1, thresh=len(df)*0.5)
⚠️ 注意: 仅在丢失少量数据点时建议使用。如果您删除了30%的行,您的模型可能会产生偏差。
选项2:插补(用值填充)
from sklearn.impute import SimpleImputer
# 对数值变量进行均值插补
imputer_num = SimpleImputer(strategy='mean')
df[['年龄', '交易金额']] = imputer_num.fit_transform(df[['年龄', '交易金额']])
# 对分类变量进行众数插补
imputer_cat = SimpleImputer(strategy='most_frequent')
df[['卡片类型']] = imputer_cat.fit_transform(df[['卡片类型']])
✅ 最佳实践: 使用ColumnTransformer对不同列应用不同策略(我们将在模块3中详细讨论)。
显著偏离其余数据的值。它可能是:
Q1 = df['交易金额'].quantile(0.25)
Q3 = df['交易金额'].quantile(0.75)
IQR = Q3 - Q1
下限 = Q1 - 1.5 * IQR
上限 = Q3 + 1.5 * IQR
异常值 = df[(df['交易金额'] < 下限) | (df['交易金额'] > 上限)]
print(f"检测到的异常值:{len(异常值)}")
df['交易金额'] = df['交易金额'].clip(lower=下限, upper=上限)
df['对数金额'] = np.log1p(df['交易金额']) # log(1+x)避免log(0)
建议数据集: 欺诈数据.csv(模拟数据,包含列:用户ID、金额、年龄、国家、卡片类型、一天中的时间、是否欺诈)
任务:
.info()和.describe()。金额中的异常值。应用基于IQR的封顶。年龄分布。是否存在不可能的值(例如,年龄<0或>120)?纠正它们。欺诈_清理.csv。