特征筛选--方差分析-f线性相关

  • 方差分析

卡方检验更多的会考虑在衡量两个离散变量是否独立时使用,如果是连续变量和离散变量之间的独立性,更常见的做法是进行方差分析。

方差分析也是一种假设检验,因此我们仍然会采用介绍假设检验的一般流程来介绍方差分析。

  • Step 1.提出假设

首先第一步是提出假设,不像卡方检验的零假设那样直接明了、就是假设变量之间相互独立,方差分析的零假设会更加复杂一些,而理解方差分析的零假设也会需要一些统计学背景知识。这里我们先提出方差分析的零假设,然后再解释为何这样的假设能够帮助我们判断连续变量和离散变量之间是否独立。

这里我们选取月消费金额和标签作为分析的对象,方差分析零假设如下:

H 0 : 流失用户群体和非流失用户群体的月消费金额没有差异 H_0:流失用户群体和非流失用户群体的月消费金额没有差异 H0:流失用户群体和非流失用户群体的月消费金额没有差异
H 1 : 流失用户群体和非流失用户群体的月消费金额存在显著差异 H_1:流失用户群体和非流失用户群体的月消费金额存在显著差异 H1:流失用户群体和非流失用户群体的月消费金额存在显著差异

这里有两点需要解释,其一是该假设如何帮助我们筛选特征,其二则是我们如何衡量两类不同的消费群体在月消费金额这个指标上是否存在差异。

首先,是关于该假设如何帮助我们进行特征筛选。

我们知道,在建模的过程中,如果月消费金额这一字段对标签取值的预测能够起到帮助作用,一定是因为这个字段对标签具备一定的区分度,例如流失用户可能普遍月消费金额比较低,那么我们就能通过月消费金额较低的角度对用户是否可能会流失进行提前的预判;而反之,如果流失用户和非流失用户,这两批用户在月消费金额的角度完全看不出差异,那么月消费金额这一字段也不太可能对后续建模提供任何有效信息,该字段完全可以考虑删除。

其次,是关于我们如何判别这两类不同的群体是否存在差异。

首先我们需要知道,统计学里判别两个样本是否存在差异,其实实在判别这两个样本是否取自不同的总体,也就是说这两个样本的差异(如果有的话),是否是统计误差导致、还是因为抽样自不同的总体。如果能判断样本取自不同的总体,则能判断两类样本存在明显差异,反之则不行。

那要怎么判断样本是否源于不同总体呢?这里就需要回顾此前介绍的,关于样本和总体的统计指标一致性的特点,也就是说很多时候,样本的统计指标会和总体趋于一致。例如样本的均值为1,则总体的均值很有可能也在1附近。基于此,如果现在的两个样本的均值相差巨大,则有较大把握两个样本是来自不同总体,反之则无法判断是否来自不同总体。很明显,为了通过均值差异程度而量化的判断是否取自不同总体,我们又需要构造统计量了。

  • Step 2.采集数据

此处我们就采用月消费金额MonthlyCharges和标签Churn字段进行分析。

X_train_OE['MonthlyCharges']
y_train

# 非流失用户
cat_0 = X_train_OE['MonthlyCharges'][y_train == 0]
# 流失用户
cat_1 = X_train_OE['MonthlyCharges'][y_train == 1]

  • Step 3.设计统计量

最关键的环节,肯定就是如何构造统计量来判断两类样本均值差异程度了,是一组专门用来衡量整体误差、组内误差和组间误差的概念。这里我们再通过严谨的数学公式描述一遍。假设目前有n条数据被分成k组(即标签有k个类别),其中第j个类别中包含 n j n_j nj条样本,并且 x i , j x_{i,j} xi,j表示第j个类别的第i条样本,则有样本整体偏差计算公式如下

S S T = ∑ j = 1 k ∑ i = 1 n j ( x i j − x ˉ ) 2 SST = \sum^k_{j=1}\sum^{n_j}_{i=1}(x_{ij}-\bar x)^2 SST=j=1ki=1nj(xijxˉ)2

及样本与均值的差值平方和,此处 x ˉ = ∑ j = 1 k ∑ i = 1 n j x i j n \bar x = \frac{\sum^k_{j=1}\sum^{n_j}_{i=1}x_{ij}}{n} xˉ=nj=1ki=1njxij

而如果我们更进一步,计算每个组内的样本与均值的差值的平方和,则可以算得如下结果:

S S E j = ∑ i = 1 n j ( x i j − x j ˉ ) 2 SSE_j = \sum^{n_j}_{i=1}(x_{ij}-\bar {x_j})^2 SSEj=i=1nj(xijxjˉ)2

即第j组的组内偏差平方和,其中 x j ˉ = ∑ i = 1 n j x i j n j \bar {x_j} = \frac{\sum_{i=1}^{n_j}x_{ij}}{n_j} xjˉ=nji=1njxij,为第j组数据的组内均值。而k个分组的组内偏差总和为:

S S E = ∑ j = 1 k S S E j = ∑ j = 1 k ∑ i = 1 n j ( x i j − x j ˉ ) 2 SSE = \sum_{j=1}^k SSE_j = \sum_{j=1}^k\sum^{n_j}_{i=1}(x_{ij}-\bar {x_j})^2 SSE=j=1kSSEj=j=1ki=1nj(xijxjˉ)2

SSE即为组内偏差平方和。此时(在欧式空间情况下)则可以通过数学公式推导得出,SST和SSE之间的差值如下:

S S B = S S T − S S E = ∑ j = 1 k n j ( x j ˉ − x ˉ ) 2 SSB=SST-SSE=\sum_{j=1}^k n_j (\bar{x_j}-\bar x)^2 SSB=SSTSSE=j=1knj(xjˉxˉ)2

即每个组的均值和总体均值的差值的平方加权求和的结果,其中权重就是每个组的样本数量。SSB也被称为组间偏差平方和。

关于组间偏差平方和,有很多种标记方法,包括SSA、SSR等。而线性回归中的决定系数则是 S S R S S T \frac{SSR}{SST} SSTSSR

在总体偏差不变的情况下(给定一组数据,就会有一个固定的SST),我们希望组内偏差越小越好、而组间偏差越大越好,因为这样就能证明组内数据彼此更加相似、而不同分组的数据彼此会更加不同。同样的观点也适用于当前情况,即在给定一个离散变量和连续变量的时候,我们就可以利用离散变量的不同取值对连续变量进行分组(例如根据是否流失,划分为流失用户组和非流失用户组),此时SST是一个确定的值,并且如果SSB很大、SSE很小,则说明不同组的组间差异越大、组内差异较小,而所谓的组间差异,其实也就是由均值的不同导致的,SSB越大则不同组的均值都和整体均值差异较大,并且由于此时SSE很小,也就说明每个组内的取值和该组的均值比较接近,此时我们会更倾向于判断不同组是取自不同总体;而反之,如果SSB很小而SSE很大,则倾向于判断不同组是取自同一个总体。

此外,我们也需要理解方差分析中方差的含义,在实际计算过程中,SST、SSE和SSB都可以看成是方差计算,其中SST衡量的数据整体方差、SSE衡量的组内方差,而SSB则衡量的是每一组的均值分布的方差,即每一组均值和整体均值的离散程度。

此处或许会有同学会觉得,根据SSB的计算公式,是否存在每个分组均值类似但都和整体均值相差较大的情况呢?此时也会发现SSB较大但并不能说明不同组的数据取自不同总体(因为均值类似)。需要注意的是,这种情况并不可能发生,原因是整体的均值是由每个分组均值决定的,如果分组数据的均值彼此接近,则整体数据的均值肯定也是一个接近这些分组均值的数,因此并不会存在分组均值接近但都和整体均值差距较大的情况。如果SSB较大,则只有一种可能,即分组均值的离散程度较大。

如此,我们就找到了如何衡量不同组均值差异的基础理论工具,接下来需要进一步的构造统计检验量,来更具体的量化的表示这种均值差异程度。此处构造的统计检验量就是F,F计算公式如下:

F = M S B M S E = S S B / d f B S S E / d f E = S S B / ( k − 1 ) S S E / ( n − k ) F=\frac{MSB}{MSE}=\frac{SSB/df_B}{SSE/df_E}=\frac{SSB/(k-1)}{SSE/(n-k)} F=MSEMSB=SSE/dfESSB/dfB=SSE/(nk)SSB/(k1)

此处 d f b df_b dfb就是统计量SSB的自由度,类似于卡方检验过程中(行数-1*列数-1)用于修正卡方值, d f b df_b dfb也是一个用于修正SSB计算量的值——为了防止分组的数量影响了SSB的计算结果;类似的 d f E df_E dfE就是SSE的自由度,用于修正样本数量对SSE计算结果的影响。目前来说我们并不用深究自由度的学术含义,只需要知道统计检验量会利用自由度对统计量进行数值上的修正,并且这些修正的值会在最一开始就确定,例如k(分成几类)、n(数据总量)等,并不会受到实际数据取值大小的影响。

而F作为统计检验量,也是有对应概率分布的,即满足F(k-1, n-k)的概率分布,并且根据此前介绍的基本原理我们可以判断,F值越大则SSB相比SSE越大,也就是组间差异越大、不同组的数据更倾向于抽样自不同总体、零假设成立的可能性(p值)越低,反之则零假设成立的可能性就越高。

  • Step 4-5.事件发生概率计算与统计推断

接下来我们通过带入数据,即可算出具体的F值大小,进一步通过查看F值在对应的F(k-1, n-k)中的概率结果,就能够判断是否接受或拒绝原假设。这里我们带入此前导入的月消费金额和标签进行计算:

cat_0_mean = cat_0.mean()
cat_1_mean = cat_1.mean()

SSE0 = np.power(cat_0 - cat_0_mean, 2).sum()
SSE1 = np.power(cat_1 - cat_1_mean, 2).sum()

SSE = SSE0 + SSE1
SSE
"""4574387.408963599"""

n0 = len(cat_0)
n1 = len(cat_1)

cat_mean = X_train_OE['MonthlyCharges'].mean()

SSB = n0 * np.power(cat_0_mean-cat_mean, 2) + n1 * np.power(cat_1_mean-cat_mean, 2)
SSB
"""156409.73213494403"""
#这里我们可以很简单检验SSE和SSB之和是否会等于SST:
SST = np.power(X_train_OE['MonthlyCharges'] - cat_mean, 2).sum()
SST
"""4730797.141098542"""
SSE + SSB
"""4730797.141098542"""
#接下来计算F值
MSB = SSB/(k-1)
MSE = SSE/(n-k)

F_score = MSB/MSE
F_score
"""180.53638921230166"""

对于F值为180的结果到底能否支撑我们接受或者推翻原假设,还需要结合F分布来进行判断,即需要计算当前F值作为随机变量时取得180的概率,这里我们也能查看F分布表进行查看,这里F分布表的查看需要同时注意 d f 1 df_1 df1 d f 2 df_2 df2,其中 d f 1 = k − 1 df_1=k-1 df1=k1 d f 2 = n − k df_2=n-k df2=nk

由于差值过大,查表并不方便,并且查看临界值表只能查到显著性水平为0.01时的临界值(即超过该值时p小于显著性水平),此处推荐使用scipy.special.fdtrc进行p值计算:

k = y_train.nunique()
n = len(y_train)

k, n
#(2, 5282)
scipy.special.fdtrc(k-1, n-k, F_score)
"""1.7018224028003695e-40"""
"""
能够看出,F取值180的概率几乎为零,也就是说零假设成立的概率几乎为零,
我们可以推翻零假设,即流失人群和非流失人群的月消费金额存在显著差异。
进一步应用到特征筛选环节,得到的结论就是月消费金额和标签存在显著的关联关系,
不同类别人群在月消费金额上存在显出差异,
可以从月消费金额入手进行分析和预测,月消费金额特征可以带入模型进行训练
"""

上面手动的计算有点复杂,可以借助scipy的f-oneway计算:

scipy.stats.f_oneway(cat_0, cat_1)
"""
F_onewayResult(statistic=180.5363892123, pvalue=1.7018224028019414e-40)

"""
  • one-way ANOVA
      所谓one-way ANOVA其实是特指单因素方差分析,即只有一个因素导致的数据分组,在当前情况下就是指依据是否流失这一个因素对用户进行分组。而除了单因素方差外,还有two-way ANOVA,指的是双因素方差分析,此时情况会更加复杂,我们即需要考虑不同因素对结果的影响,还要考虑双因素之间是否还有交互作用。对于特征筛选来说,由于我们往往是针对标签进行分组,因此不会涉及双因素方差分析的问题。

  • 方差分析与F检验
      尽管我们在方差分析中用到了F检验,但方差分析不同于F检验。F检验泛指一切借助F值进行检验的过程,而方差分析只是其中一种。换而言之,只要假设检验中的检验统计量满足F分布,则该过程就用到了F检验。

  • F检验与卡方检验
      从理论上来说,F计算量的分子和分母都是服从卡方分布的, F = S S B / ( k − 1 ) S S E / ( n − k ) F=\frac{SSB/(k-1)}{SSE/(n-k)} F=SSE/(nk)SSB/(k1)中,分子是服从自由度为n-k的卡方分布,而分母是服从自由度为n-k的卡方分布,且能够证明二者相互独立。也就是说,统计检验量F是借助卡方分布构建的,更进一步来说,只要是相互独立的、服从卡方分母的随机变量,相除构成的随机变量都是服从F分布的。而F统计量的标准表达公式如下: F = X 1 / d 1 X 2 / d 2 F=\frac{X_1/d_1}{X_2/d_2} F=X2/d2X1/d1其中 X 1 X_1 X1 X 2 X_2 X2相互独立且服从自由度为 d 1 d_1 d1 d 2 d_2 d2的卡方分布,此时随机变量F服从自由度为( d 1 , d 2 d_1,d_2 d1,d2)的F分布。

  • 方差分析与t检验
      另外需要拓展了解的一点是,除了方差分析以外,还有一种检验也能判断两个样本的均值是否一致,也就是t检验。所不同的是,方差分析能够同时检验多个样本,也就是如果是三分类标签、则对应三个不同的样本,卡方检验能够同时判断三个样本是否取自同一总体,进而判断该特征是否可用(从特征筛选的角度来看)。而t检验只能两两比较,很明显应如果是用于特征筛选环节,t检验并不够高效。而t检验、卡方检验和方差分析,被称作统计学三大检验。

借助sklean进行基于方差分析的特征筛选

#评分函数
from sklearn.feature_selection import f_classif
f_classif(X_train_OE['MonthlyCharges'].values.reshape(-1, 1), y_train.ravel())
"""
(array([180.53638921]), array([1.7018224e-40]))
而通过查看源码能够发现,sklearn中的f_classif也就是调用f_oneway函数进行的计算,
因此最终输出结果和此前实验结果完全一致。
同时f_classif本身也是评分函数,输出的F值就是评分。
很明显F值越大、p值越小、我们就越有理由相信两列存在关联关系,
反之F值越小则说明两列没有关系,可以考虑剔除。
"""
  • 特征筛选

接下来我们借助SelectKBest来进行基于方差分析评分的特征筛选。这里需要注意的是,基于方差分析的基本流程,即对分组后的变量进行均值方差计算等过程,我们不难发现方差分析其实并不适用于两个离散变量之间的检验。在sklearn中,尽管没有要求只能针对分类问题对连续特征进行检验,但实际上带入离散特征进行检验是毫无意义的。对于分类问题,离散特征的检验完全可以交给卡方检验。因此此处我们仅针对两个连续变量进行方差分析检验特征筛选:

numeric_cols
"""
['tenure', 'MonthlyCharges', 'TotalCharges']  这些是连续变量
"""
KB_CF = SelectKBest(f_classif, k=2)
KB_CF.fit(X_train_OE[numeric_cols], y_train)

KB_CF.scores_
#array([772.52712199, 180.53638921, 244.16941072])
KB_CF.pvalues_
#array([8.46456399e-159, 1.70182240e-040, 7.67071015e-054])
SelectName_P(P=0.01, KB=KB_CF)
#['tenure', 'MonthlyCharges', 'TotalCharges']

如果是针对分类问题,f_classif与chi2两个评分函数搭配使用,就能够完成一次完整的特征筛选,其中chi2用于筛选离散特征、f_classif用于筛选连续特征。在介绍完所有方法后我们会考虑将其封装在一个流程中使用。

线性相关性的F检验

  • f_regression的计算过程
      f_classif和chi2检验能够很好的解决分类问题的特征筛选。而如果是回归问题,sklearn提供了一种基于F检验的线性相关性检验方法f_regression,该检验方法并不常见,但却和方差分析过程非常类似,我们可以对比来进行理解:
"""
这里需要注意,该方法只能用于回归问题中,并且只能筛选出与标签呈现线性相关关系的连续变量。
当前数据集其实并不符合该要求,此处我们仅仅作展示使用:
"""
KB = SelectKBest(f_regression, k=10)
X_new = KB.fit_transform(X_train_OE, y_train)
KB.get_feature_names_out()
"""
array(['Partner', 'OnlineSecurity', 'OnlineBackup', 'DeviceProtection',
       'TechSupport', 'Contract', 'PaperlessBilling', 'tenure',
       'MonthlyCharges', 'TotalCharges'], dtype=object)
"""

猜你喜欢

转载自blog.csdn.net/weixin_44820355/article/details/126000881
今日推荐