在AI和机器学习项目落地时,数据预处理和特征工程往往占据开发流程的大部分时间,很多开发者习惯用Python的Pandas、NumPy等工具完成这些工作,但实际上SQL本身就能高效实现大部分相关操作,还能减少数据导出导入的额外成本。

SQL实现AI模型数据预处理的常用操作
1. 缺失值处理
数据集中存在缺失值是很常见的情况,SQL可以通过条件判断完成缺失值填充,比如用均值、中位数或者特定值填充。以下示例是填充用户年龄缺失值的操作:
-- 计算年龄的中位数作为填充值
WITH age_median AS (
SELECT PERCENTILE_CONT(0.5) WITHIN GROUP (ORDER BY age) AS median_age
FROM user_info
WHERE age IS NOT NULL
)
-- 填充缺失的年龄数据
SELECT
user_id,
CASE
WHEN age IS NULL THEN (SELECT median_age FROM age_median)
ELSE age
END AS filled_age,
register_time
FROM user_info;2. 异常值处理
对于超出合理范围的异常值,SQL可以通过WHERE条件过滤,或者用边界值替换,以下是处理用户消费金额异常值的示例:
-- 计算消费金额的上下四分位数和四分位距
WITH consume_stats AS (
SELECT
PERCENTILE_CONT(0.25) WITHIN GROUP (ORDER BY consume_amount) AS q1,
PERCENTILE_CONT(0.75) WITHIN GROUP (ORDER BY consume_amount) AS q3
FROM user_consume
WHERE consume_amount IS NOT NULL
),
bounds AS (
SELECT
q1,
q3,
q1 - 1.5 * (q3 - q1) AS lower_bound,
q3 + 1.5 * (q3 - q1) AS upper_bound
FROM consume_stats
)
-- 替换超出边界的异常值为边界值
SELECT
user_id,
CASE
WHEN consume_amount < (SELECT lower_bound FROM bounds) THEN (SELECT lower_bound FROM bounds)
WHEN consume_amount > (SELECT upper_bound FROM bounds) THEN (SELECT upper_bound FROM bounds)
ELSE consume_amount
END AS processed_consume
FROM user_consume;3. 数据标准化与归一化
很多机器学习模型要求输入特征在相同量纲下,SQL可以实现Z-Score标准化和Min-Max归一化,以下是Z-Score标准化的示例:
-- 计算特征的均值和标准差
WITH feature_stats AS (
SELECT
AVG(feature_col) AS avg_val,
STDDEV(feature_col) AS std_val
FROM model_features
WHERE feature_col IS NOT NULL
)
-- 执行Z-Score标准化
SELECT
id,
(feature_col - (SELECT avg_val FROM feature_stats)) / (SELECT std_val FROM feature_stats) AS normalized_feature
FROM model_features;SQL在机器学习特征工程中的应用场景
1. 构造统计类特征
特征工程中经常需要构造用户的统计类特征,比如近7天消费次数、平均客单价等,SQL的聚合函数可以高效完成这类操作:
-- 构造用户近7天的消费统计特征
SELECT
user_id,
COUNT(DISTINCT order_id) AS consume_count_7d,
AVG(consume_amount) AS avg_consume_amount_7d,
SUM(consume_amount) AS total_consume_7d
FROM user_order
WHERE order_time >= CURRENT_DATE - INTERVAL '7' DAY
GROUP BY user_id;2. 处理类别型特征
类别型特征需要编码后才能输入模型,SQL可以实现独热编码和标签编码,以下是简单的标签编码示例:
-- 对城市字段做标签编码
SELECT
user_id,
city,
DENSE_RANK() OVER (ORDER BY city) AS city_label
FROM user_info;3. 时间特征提取
时间类型的字段可以提取出年、月、日、星期、是否节假日等特征,SQL的日期函数可以轻松实现:
-- 从注册时间提取多维度时间特征
SELECT
user_id,
EXTRACT(YEAR FROM register_time) AS register_year,
EXTRACT(MONTH FROM register_time) AS register_month,
EXTRACT(DOW FROM register_time) AS register_weekday,
CASE
WHEN EXTRACT(DOW FROM register_time) IN (0,6) THEN 1
ELSE 0
END AS is_weekend
FROM user_info;SQL用于数据预处理和特征工程的优势
首先,SQL直接在数据库层面操作,不需要把全量数据导出到外部工具,减少了数据传输和存储的成本,对于海量数据场景优势尤其明显。其次,SQL的逻辑直观,很多预处理逻辑可以用简单的查询语句实现,降低了开发门槛,熟悉数据库的开发人员不需要额外学习新的工具就能完成相关操作。另外,SQL处理后的结果可以直接对接后续的模型训练流程,比如把处理好的特征数据导出为CSV,或者直接对接支持SQL读取的机器学习框架,提升整个流程的连贯性。
不过也要注意,SQL并不适合处理所有场景,比如复杂的自然语言处理特征构造、图像特征提取等,还是需要结合Python等工具完成,实际项目中可以根据需求选择合适的工具组合,发挥不同技术的最大价值。