一、相关性分析(Correlation):快速构建特征间的“关系矩阵”
在特征工程过程中,我们常常需要识别不同变量之间的关联程度。例如:
- 哪些特征之间存在高度相关性,可能导致信息冗余?
- 某个输入特征与目标变量的相关性强弱如何?
- 是否存在明显的线性趋势,值得进一步建模关注?
为了解决这些问题,最常用的统计工具是相关系数。常见的类型包括:
- Pearson 相关系数:用于衡量两个变量之间的线性相关程度。
- Spearman 相关系数:基于数据排序的秩次计算,适用于非线性但单调的关系。
在 Spark MLlib 中,可以对包含向量列的数据直接计算出完整的相关性矩阵。
Correlation
API 使用说明:Correlation.corr
在 PySpark 环境下,可以通过以下方式调用相关性计算功能:
from pyspark.ml.linalg import Vectors
from pyspark.ml.stat import Correlation
data = [
(Vectors.sparse(4, [(0, 1.0), (3, -2.0)]),),
(Vectors.dense([4.0, 5.0, 0.0, 3.0]),),
(Vectors.dense([6.0, 7.0, 0.0, 8.0]),),
(Vectors.sparse(4, [(0, 9.0), (3, 1.0)]),)
]
df = spark.createDataFrame(data, ["features"])
# 默认使用 Pearson 方法
r1 = Correlation.corr(df, "features").head()
print("Pearson correlation matrix:\n" + str(r1[0]))
# 使用 Spearman 方法
r2 = Correlation.corr(df, "features", "spearman").head()
print("Spearman correlation matrix:\n" + str(r2[0]))
关键点总结:
- 输入的 DataFrame 必须包含一个向量类型的列,如 features 列所示。
"features"
Correlation.corr(df, "features", method)
head()[0]
DenseMatrix
Pearson 与 Spearman 如何选择?
Pearson 相关系数特点:
- 假设变量间呈线性关系。
- 对异常值较为敏感。
- 是最经典、应用最广泛的相关性度量方法。
Spearman 相关系数特点:
- 先将原始数值转换为秩(rank),再计算 Pearson 相关性。
- 不要求线性关系,只要变量呈现单调变化即可有效反映相关性。
- 对异常值具有更强的鲁棒性。
实践建议:
- 当分析连续型特征且预期为线性关系时,优先选用 Pearson。
- 若数据呈现明显非线性趋势或含有较多离群点,则推荐尝试 Spearman。
典型应用场景:特征筛选与多重共线性检测
可通过构造一个整合多个特征的向量列,并利用相关性分析方法得到整体的相关系数矩阵:
features
Correlation.corr
- 对于相关系数绝对值较高(如 |ρ| > 0.9)的特征对,可能存在多重共线性问题,可考虑进行降维处理或保留其中一个代表特征。
- 若某些特征与标签的相关性极弱,可视情况剔除或降低其模型权重——但需注意,不能仅依赖相关系数决策,还需结合业务背景综合判断。
二、假设检验与卡方检验(ChiSquareTest):判断离散特征与标签是否有关联?
核心问题:离散特征真的影响标签吗?
在分类任务中,常遇到类别型或离散型特征,例如:
- 用户职业:学生 / 上班族 / 自由职业
- 设备类型:iOS / Android / Web
- 地理位置:省份 / 城市
我们关心的核心问题是:这些分类特征与目标标签(如“是否点击”、“是否购买”、“是否违约”)之间,是否存在统计意义上的显著关联?
此时,卡方检验(Chi-square test)是一种有效的解决方案。
MLlib 中的 ChiSquareTest:检验特征与标签的独立性
Spark MLlib 提供了 ChiSquareTest 工具,能够对每个特征维度与标签执行Pearson 卡方独立性检验:
- 针对每一维特征,构建对应的列联表(contingency table)。
- 计算卡方统计量(χ)、自由度以及 p-value。
- 据此判断是否拒绝“特征与标签相互独立”的原假设。
spark.ml.stat.ChiSquareTest
前提条件:特征和标签都必须是离散型或类别型变量。
Python 示例代码
from pyspark.ml.linalg import Vectors
from pyspark.ml.stat import ChiSquareTest
data = [
(0.0, Vectors.dense(0.5, 10.0)),
(0.0, Vectors.dense(1.5, 20.0)),
(1.0, Vectors.dense(1.5, 30.0)),
(0.0, Vectors.dense(3.5, 30.0)),
(0.0, Vectors.dense(3.5, 40.0)),
(1.0, Vectors.dense(3.5, 40.0))
]
通过上述结构化数据,可调用 ChiSquareTest.test(df, "features", "label") 来获取各特征维度的检验结果,包括卡方值、自由度和显著性水平(p-value),从而辅助进行特征重要性评估和筛选。
df = spark.createDataFrame(data, ["label", "features"])
r = ChiSquareTest.test(df, "features", "label").head()
print("pValues: " + str(r.pValues))
print("degreesOfFreedom: " + str(r.degreesOfFreedom))
print("statistics: " + str(r.statistics))
ChiSquareTest.test(df, "features", "label")
返回一个包含每次测试结果的 DataFrame
.head()
提取第一行的结果进行查看
r.pValues
每个特征维度都会对应一个 p-value 值
r.degreesOfFreedom
每个特征也都有其对应的自由度数值
r.statistics
同时还会输出与之对应的卡方统计量
pValue < 0.05
5. 如何理解这些输出结果?
原假设 H:特征与标签之间相互独立,无关联
备择假设 H:特征与标签不独立,存在一定的统计相关性
通常设定显著性水平 α = 0.05 作为判断标准:
当 p-value ≤ α 时:
拒绝原假设,认为该特征与标签具有显著的相关性,
可以保留作为有效特征使用。
当 p-value > α 时:
无法拒绝原假设,说明没有足够证据表明该特征与标签有关联,
此类特征可能对模型帮助较小,可考虑剔除。
pValue ≥ 0.05
5. 实际应用场景举例
- 类别型特征的筛选:
对数据集中所有离散型特征逐一进行卡方检验,
移除那些与目标变量几乎无关的字段,降低模型复杂度。
- 验证特征工程效果:
例如在进行了分箱或类别合并操作后,可通过卡方检验评估新构造特征是否提升了与标签的关联强度。
- 辅助模型解释与汇报:
向业务方展示“哪些分类特征与目标事件最相关”时,卡方检验提供了一种简单直观的统计依据。
三、Summarizer:一键计算向量列的核心统计信息
1. 场景引入:如何高效分析向量列的整体分布?
假设你的 DataFrame 中包含一列名为 features 的向量类型数据
"features"
每一行为一个样本的多维特征向量。你希望快速获取以下汇总信息:
- 各维度的均值和方差
- 最大值与最小值
- 非零元素的数量
- 总样本数(count)
此时可以借助 Spark MLlib 提供的 Summarizer 工具来实现高效统计。
Summarizer
2. 核心 API 使用说明:Summarizer.metrics
示例代码如下:
from pyspark.ml.stat import Summarizer
from pyspark.sql import Row
from pyspark.ml.linalg import Vectors
df = sc.parallelize([
Row(weight=1.0, features=Vectors.dense(1.0, 1.0, 1.0)),
Row(weight=0.0, features=Vectors.dense(1.0, 2.0, 3.0))
]).toDF()
# 创建 summarizer 实例并指定需计算的指标
summarizer = Summarizer.metrics("mean", "count")
# 计算加权情况下的统计量
df.select(summarizer.summary(df.features, df.weight)).show(truncate=False)
# 不使用权重时的统计结果
df.select(summarizer.summary(df.features)).show(truncate=False)
# 单独调用 mean 方法(带权重)
df.select(Summarizer.mean(df.features, df.weight)).show(truncate=False)
# 单独调用 mean 方法(无权重)
df.select(Summarizer.mean(df.features)).show(truncate=False)
关键要点解析:
Summarizer.metrics("mean", "count", "variance", ...)
—— 用于定义需要输出的统计指标集合
summarizer.summary(df.features, df.weight)
—— summary 方法接受两个参数:
第一个是向量列名(如 features)
第二个是可选的权重列(如 weight),若省略则默认等权处理
此外,还支持直接调用专用方法如:
Summarizer.mean(...)
—— 快速获取均值
Summarizer.variance(...)
—— 直接获得计数等
3. 权重的作用与适用场景
引入权重可以在多种实际情境中提升统计准确性,例如:
- 数据来源于聚合表,某条记录代表多个原始实例(出现频次不同)
- 某些用户或样本在建模中更为重要(如高价值客户需赋予更高权重)
- 使用抽样数据估算总体分布时,通过加权修正偏差
有了权重列的支持,即可准确计算出加权均值、加权方差等更贴近真实情况的指标。
weight
4. Summarizer 支持的统计指标列表
目前官方支持的主要统计量包括:
mean
—— 各维度均值
variance
—— 方差
std
—— 标准差
min
/max
—— 每列的最小值与最大值
sum
—— 各维度求和结果
numNonZeros
—— 非零元素数量(按列)
count
—— 总样本数量
上述指标已基本满足探索性数据分析(EDA)阶段的核心需求,便于快速了解特征分布特性。
四、将基础统计能力整合进机器学习 Pipeline
在机器学习项目中,
Correlation、ChiSquareTest 和 Summarizer 虽然表面上看似只是基础的统计工具,
但实际上它们能够无缝融入整个建模流程,在多个关键阶段发挥重要作用。
数据理解阶段
利用 Summarizer 可以快速查看各特征维度的基本统计量,例如均值、方差以及非零比例等,帮助识别出:
- 方差为零的常量特征
- 极度稀疏或高度密集的特征
Correlation
通过 Correlation 分析特征间的线性关系,初步掌握数据的整体结构,为后续处理提供方向。
特征筛选阶段
对于离散型特征,可使用 ChiSquareTest 来剔除与目标标签无关的变量,实现有效的特征过滤。
而对于连续型特征,则结合相关系数分析与业务逻辑进行初步筛选和降维,提升模型效率。
ChiSquareTest
模型调试与解释阶段
在不同特征处理步骤后,再次使用 Summarizer 检查数据分布的变化情况,确保变换过程合理可控。
同时,借助 Correlation 与 ChiSquareTest 提供的统计结果,为最终入选的特征组合提供可解释性的支持。
Summarizer
核心工具概览
从工程实践角度出发,Spark MLlib 中的基础统计模块并非装饰性功能,而是解决实际问题的“第一步”。
熟练掌握以下三类工具,能够在 EDA、特征工程乃至模型诊断中带来显著价值:
- Correlation(相关性分析):支持 Pearson 与 Spearman 方法,面向向量列输出相关性矩阵,适用于特征选择、多重共线性检测及数据探索。
- ChiSquareTest(卡方检验):用于判断分类特征与标签之间的独立性,返回 p-value、自由度和统计量,广泛应用于类别型变量的假设验证。
- Summarizer(汇总统计):计算向量列的均值、方差、最值、求和、非零项数量等指标,支持加权场景,是数据监控与探索分析的核心组件。
如果你正在基于 Spark 构建机器学习系统,建议将这些组件视为“统计瑞士军刀”。
善用这些基础但强大的工具,许多隐藏在数据背后的异常与问题,往往能在早期就被有效发现。
spark.ml.stat

雷达卡


京公网安备 11010802022788号







