楼主: 丛林肉搏
1557 0

[其他] Spark MLlib 基础统计模块相关性、卡方检验与向量汇总 [推广有奖]

  • 0关注
  • 0粉丝

等待验证会员

学前班

80%

还不是VIP/贵宾

-

威望
0
论坛币
0 个
通用积分
0
学术水平
0 点
热心指数
0 点
信用等级
0 点
经验
30 点
帖子
2
精华
0
在线时间
0 小时
注册时间
2018-7-8
最后登录
2018-7-8

楼主
丛林肉搏 发表于 2025-12-12 15:31:47 |AI写论文

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

求职就业群
赵安豆老师微信:zhaoandou666

经管之家联合CDA

送您一个全额奖学金名额~ !

感谢您参与论坛问题回答

经管之家送您两个论坛币!

+2 论坛币

一、相关性分析(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)
  • 输出结果是一个仅有一行一列的 DataFrame,其中唯一的元素即为相关性矩阵。
  • 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

二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

关键词:Spark Mllib 卡方检验 SPAR Park

您需要登录后才可以回帖 登录 | 我要注册

本版微信群
加好友,备注jltj
拉您入交流群
GMT+8, 2025-12-21 16:06