【推荐系统】WOE、IV、OR值、信息增益、卡方检验

目录

特征起因

评分卡模型中的IV和WOE详解

信息增益

OR值

卡方检验

GaussRank

高基数数据


特征起因

特征工程综述常看常新

工业级推荐系统中的特征工程 - 杨旭东的文章 - 知乎​​​​​​​

评分卡模型中的IV和WOE详解

IV值衡量了某个特征对目标的影响程度

风控模型—WOE与IV指标的深入理解应用 - 求是汪在路上的文章 - 知乎(看一遍就懂!)

评分卡模型中的IV和WOE详解_J-JunLiang的博客-CSDN博客_iv模型统计学上是什么意思

woe sql 

pos_ratio_1d “母婴”品类正样本占全部品类正样本比例
neg_ratio_1d “母婴”品类负样本占全部品类负样本比例
woe = ln(pos_ratio_1d /neg_ratio_1d)

LN(1e - 6 + pos_ratio_1d /(1e - 6 + neg_ratio_1d)) AS woe_1d

IV sql

-- pos_ratio_1d “母婴”品类正样本数量/全部品类正样本数量
-- neg_ratio_1d “母婴”品类负样本数量/全部品类负样本数量

-- 后半段LN(1e - 6 + pos_ratio_1d /(1e - 6 + neg_ratio_1d)) 就是woe值



(pos_ratio_1d - neg_ratio_1d) 
* LN(1e - 6 + pos_ratio_1d /(1e - 6 + neg_ratio_1d))

AS info_value_1d 

信息增益

如何通过计算信息熵,进行决策树的分裂_不凡De老五的博客-CSDN博客

-- “母婴”品类所有样本
-- 所有品类样本
-- 衡量“母婴”这个品类占全部品类的比例
total_cnt_1d /(global_pos_cnt_1d + global_neg_cnt_1d) match_prop_1d


----------------------------------------------------------------------------------------
-- “母婴”品类正样本比例
-- 在“母婴”品类中正样本/ “母婴”品类所有样本
-- 品类维度有“母婴”、“家电”、“零食”
pos_cnt_1d / total_cnt_1d) AS precision_1d


----------------------------------------------------------------------------------------
-- 除母婴外其余品类的正样本(global_pos_cnt_1d - pos_cnt_1d)
-- 除母婴外其余品类的所有样本(global_pos_cnt_1d + global_neg_cnt_1d - total_cnt_1d)
-- 衡量其余品类的正样本比例
(global_pos_cnt_1d - pos_cnt_1d) /(global_pos_cnt_1d + global_neg_cnt_1d - total_cnt_1d) AS unmatch_precision_1d


----------------------------------------------------------------------------------------
-- gini
match_prop_1d * 2 *  -- “母婴”这个品类占全部品类的比例
precision_1d *(1 - precision_1d) -- “母婴”品类正样本比例*“母婴”品类负样本比例

+(1 - match_prop_1d) * 2 * -- 除母婴外其余品类占全部品类的比例
unmatch_precision_1d *(1 - unmatch_precision_1d)  -- 其余品类的正样本比例*其余品类的负样本比例
AS gini_1d

OR值

优势比意味着“爱丽丝点击相对于不点击的可能性”和“其他人点击相对于不点击的可能性“相比有多大。

优势比的值有可能会非常小或非常大(例如,可能会有几乎不会点击的用户),因此我们可以对其进行简化,并加一个log转换使得除法变成减法:log(N+)−log(N−)。

-- pos_cnt_1d是该“母婴”品类中正样本比例
-- neg_cnt_1d是该“母婴”品类中负样本比例

LN(1e - 6 + pos_cnt_1d) - LN(1e - 6 + neg_cnt_1d) 

AS odds_1d

卡方检验

卡方检验 连续变量 是如何计算的? - 张春宇的回答 - 知乎(例子挺容易理解的)

一条SQL搞定卡方检验计算 - 腾讯云开发者社区-腾讯云

-- ABS(pos_cnt_1d *(global_neg_cnt_1d - neg_cnt_1d) - neg_cnt_1d *(global_pos_cnt_1d - pos_cnt_1d))
-- “母婴”品类正样本量*其余品类负样本量 - “母婴”品类负样本量*其余品类正样本量


-- total_cnt_1d “母婴”品类bucket所有样本量
-- LN(global_pos_cnt_1d + global_neg_cnt_1d - total_cnt_1d) 除母婴外其余品类所有样本量


2 * LN(1e - 8 +  ABS(pos_cnt_1d *(global_neg_cnt_1d - neg_cnt_1d) - neg_cnt_1d *(global_pos_cnt_1d - pos_cnt_1d))  ) 
- LN(total_cnt_1d) 
- LN(global_pos_cnt_1d + global_neg_cnt_1d - total_cnt_1d)

) AS chi_square_1d,

在链接2中,说明下这个表,

【推荐系统】WOE、IV、OR值、信息增益、卡方检验_第1张图片

总共有15条样本,特征有性别(男女)、活跃度(高中低),15条样本中有正样本5条,负样本10条。 以男女分类,其中5个正样本里是男的有3条,女的有2条。

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

GaussRank

还在用归一化和标准化?了解下RankGauss! - 刘秋言的文章 - 知乎​​​​​​​

高基数数据

高基数(high-cardinality)类别型特征也有必要做特征分箱。这是因为高基数特征相对于低基数特征处于支配地位(尤其在tree based模型中),并且容易引入噪音,导致模型过拟合。甚至一些值可能只会出现在训练集中,另一些可能只会出现在测试集中。

类别型特征的分箱方法通常有如下三种:

  1. 基于业务理解自定义分箱规则,比如可以把城市划分为华南区、华北区、华东区等。
  2. 基于特征的频次合并低频长尾部分(back-off)。
  3. 基于决策树模型。

高基数数据特性是什么意思 - 腾讯云开发者社区-腾讯云

在 SQL 中,基数(cardinality)的定义为一个数据列中独一无二数据的数量。

高基数(High-Cardinality)的定义为在一个数据列中的数据基本上不重复,或者说重复率非常低。

例如我们常见的识别号,邮件地址,用户名等都可以被认为是高基数数据。 例如我们常定义的 USERS 数据表中的 USER_ID 字段,这个字段中的数据通常被定义为 1 到 n。

每一次一个新的用户被作为记录插入到 USERS 表中,一个新的记录将会被创建, 字段 USER_ID 将会使用一个新的数据来标识这个被插入的数据。

因为 USER_ID 中插入的数据是独一无二的,因此这个字段的数据技术就可以被考虑认为是 高基数(High-Cardinality) 数据。

特征哈希方案

import pandas as pd
from category_encoders.hashing import HashingEncoder  

df_X = pd.DataFrame([1,2,3,4,1,2,4,5,8,7,66,2,24,5,4,1,2,111,1,31,3,23,13,24],columns=list("A"))
print(df_X.shape) # (24, 1)

he = HashingEncoder(cols=["A"],return_df=True)
df_X = he.fit_transform(df_X)
df_X

【推荐系统】WOE、IV、OR值、信息增益、卡方检验_第2张图片

你可能感兴趣的:(推荐系统,推荐算法)