一条SQL搞定卡方检验计算

作者介绍 : 周东谕,2011年加入腾讯,现任职于腾讯互娱运营部数据中心,主要从事游戏相关的数据分析和挖掘工作。

引言

上一篇文章《一条SQL搞定信息增益的计算》介绍了在机器学习特征工程中,如何使用SQL来进行信息增益的计算。卡方检验作为一种数理统计中的假设检验方法,也常用于特征选择中。本文简单介绍了卡方检验的原理,并用Hive SQL实现卡方检验值的计算。

卡方检验原理

卡方检验最基本的思想就是通过观察实际值与理论值的偏差来确定理论的正确与否。对应到我们实际工作中,我们的理论假设是:假设某特征(如性别、年龄)分布与Target值(以二分类为例,是否流失、是否付费,通常用0,1表示)的分布相互独立,通常我们把这个理论假设叫做“原假设”,用一句通俗的话来解释就是“用户是不是流失跟他/她的性别没有关系”。

然后我们手上有一堆样本数据了,我们要通过观察样本数据来判断我们的“原假设”是否成立。如果不成立,我们就要推翻“原假设”,证明实际情况是“用户流失跟他/她的性别可能有关系”。卡方检验值就是用来上述假设的P值。它的计算公式如下:

为例便于理解,公式还是以“性别对于用户流失是否有影响”为例进行描述。其中et表示特征的枚举,ec是Target枚举。N表示特征和Target划分下的数据量,用SQL描述就是特征维度和Target维度进行group by后count的量。从这里可以看出,卡方检验要求特征值为离散型的。E表示期望值,以特征为male,Target为1为例,计算其期望值如下:

这样分别求出特征与Target各种组合下的期望以及该特征的卡方值。还是以上文的一个例子来描述这个计算的过程:

数据如下:

统计数据如下:

根据统计结果,我们可以计算得如下表:

一共10项,每一项表示特征与Target各种组合下卡方值,然后求和得每个特征的卡方值:

通过查卡方值的P值表,我们可以看出来,sex性别的卡方值小于P=0.1的较为宽泛假设卡方值,此时我们要支持原假设,认为性别和是否流失相互独立的,不存在关联。而活跃度act的卡方值11.4大于P=0.001,此时我们要否定原假设,支持活跃度和是否流失可能相互不独立。

从结果来看,活跃度的卡方值更大,所以我们得出的结论是用户活跃度的大小和他/她是否流失关系相对于性别特征来说更大。

SQL代码及说明:

SELECT
feature_name,SUM(chi_square) as chi_square
FROM
(
	SELECT
	t1.feature_name,
	t1.feature_value,
	t1.label,
	--推导以后
	(NVL(Nab,0)*N-Na*Nb)*(NVL(Nab,0)*N-Na*Nb)/(Na*Nb*N) as chi_square
	FROM
	(
		SELECT t1.feature_name,feature_value,label,Na,Nb 
		FROM
		(
			SELECT feature_name,feature_value,COUNT(1) as Na FROM chi_squre_test_caculate
			GROUP BY feature_name,feature_value
		)t1 join 
		(
			SELECT feature_name,label,COUNT(1) as Nb FROM chi_squre_test_caculate
			GROUP BY feature_name,label
		)t2 on t1.feature_name=t2.feature_name
	)t1 
	left join 
	(
	
		SELECT feature_name,feature_value,label,COUNT(1) as Nab FROM chi_squre_test_caculate
		GROUP BY feature_name,feature_value,label
	)t2 on t1.feature_name=t2.feature_name and t1.feature_value=t2.feature_value and t1.label=t2.label
	left join 
	(
		SELECT feature_name,COUNT(1) as N FROM chi_squre_test_caculate GROUP BY feature_name
	)t3 on t1.feature_name=t3.feature_name
)GROUP BY feature_name

参考文献:

1 机器学习特征选择之卡方检验与互信息

http://blog.csdn.net/yihucha166/article/details/50646615

原创声明,本文系作者授权云+社区-专栏发表,未经许可,不得转载。

如有侵权,请联系 yunjia_community@tencent.com 删除。

编辑于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏深度学习自然语言处理

调参的一些个人拙见

最近的事。。浓缩成下面的一张图。 ? 调参有哪些方法呢? 语料处理。这个是之后一切操作的基础。有人或许认为算法是最重要的,其实不然,语料处理真的真的是最重要的。...

2725
来自专栏编程坑太多

2018年最受欢迎Python机器学习库介绍

1303
来自专栏华章科技

数据挖掘:手把手教你做文本挖掘

文本挖掘指的是从文本数据中获取有价值的信息和知识,它是数据挖掘中的一种方法。文本挖掘中最重要最基本的应用是实现文本的分类和聚类,前者是有监督的挖掘算法,后者是无...

352
来自专栏PPV课数据科学社区

数据挖掘比赛通用框架

作者|穆文 报名啦CDA数据分析师认证培训Level 1 国内权威的数据分析师系统 培养学员超过上千人理论结合实际 更有多重福利提供 点击文末“阅读原文”...

3706
来自专栏AI研习社

基于 Tensorflow eager 的文本生成,注意力,图像注释的完整代码

我总是发现生成和序列模型令人着迷:他们提出的问题与我们刚开始学习机器学习时常遇到的问题不同。当我第一次开始学习ML时,我学了分类和回归(和大多数人一样)。这些帮...

852
来自专栏量子位

OpenAI发布可扩展的元学习算法Reptile | 论文+代码+Demo

昨天,OpenAI发布了一种新型的可扩展元学习算法Reptile,还能在线试玩。 何为Reptile?难道是—— ? 咳咳严肃一点。 据OpenAI官方博客显示...

3295
来自专栏人工智能LeadAI

TF使用例子-情感分类

这次改写一下,做一个简单的分类模型和探讨一下hidden layer在聚类的应用场景下会有什么效果。为了能写的尽可能让读者理解,本文也会写一下keras来实现(...

4363
来自专栏racaljk

中文分词基本算法主要分类

基于词典的方法、基于统计的方法、基于规则的方法、(传说中还有基于理解的-神经网络-专家系统)

904
来自专栏xingoo, 一个梦想做发明家的程序员

Spark MLlib中的OneHot哑变量实践

在机器学习中,线性回归和逻辑回归算是最基础入门的算法,很多书籍都把他们作为第一个入门算法进行介绍。除了本身的公式之外,逻辑回归和线性回归还有一些必须要了解的内...

25410
来自专栏CSDN技术头条

递归神经网络不可思议的有效性

递归神经网络(RNNs)有一些不可思议的地方。我仍然记得我训练的第一个用于图片字幕的递归网络。从花几十分钟训练我的第一个婴儿模型(相当随意挑选的超参数)开始,到...

1919

扫码关注云+社区