目录
假设检验
常见的假设检验有:T检验(Student’s t Test),F检验(方差齐性检验),卡方验证等。无论任何假设检验,它们都遵循如下图所示的流程:
- 做两个假设:一般如果假设对象是两组样本的话,都会假设这两组样本均值相等(T检验的假设),方差满足齐次性(F检验的假设)等。而另一个假设其实就是两组样本均值不相等(T检验的假设),方差不满足齐次性(F检验的假设)等,其实这两个假设就是一对非此即彼的选项。这两个假设在教科书上就叫做原假设H_0,和备择假设H_1。
- 设置一个显著性值:就是如果真实的情况偏离原假设的程度。
1).如果真实情况和原假设差异不大(P值高于显著性值),那证明原假设是对的,接受原假设。
2).如果真实情况和原假设差异太大(P值低于显著性值),那证明原假设错了,我们得拒绝原假设,接受备择假设。 - 显著性值的选择是个经验值:一般和样本量有关,样本量越大,显著性值越大,一般几百左右的样本量P值一般选择0.05,样本量在两千左右时P值一般选择0.001,样本量再大,P值就没有作用了,所以做假设检验时样本量一般不会超过5千,样本量超过5千时P值就没什么意义了。
- 收集证据:用手头的数据去验证第一步定义的假设。这一步就是对样本进行统计计算等操作。
- 得到结论:结论一般不外乎这两种:
1).如果P>0.05(上方第二步设定的显著性的值),原假设成立;
2).如果P< 0.05(上方第二步设定的显著性的值),原假设不成立,备择假设成立。
特征X和目标Y的数值类型经常会出现两类:1. 连续型数值,2. 离散性数值(类别特征可以编码成离散型特征)。
特征X和目标Y在不同数值类型的组合下,应该采用不同的假设检验手段去做特征相关性分析。下图罗列了特征X和目标Y在各种数值类型组合时最适合的假设检验方法。
3大抽样分布
- 卡方分布
- t分布
- F 分布
分类 : 卡方检验, 方差分析, 互信息
回归 : 相关系数
卡方检验及应用
思想: 卡方检验中我们要测试的是被检验的特征与类别是否独立,零假设是 特征与类别独立,若拒绝零假设,则特征与类别相关。
1. 卡方分布
- 卡方分布定义:
设 X 1 , X 2 , X 3 . . . X_1,X_2,X_3... X1,X2,X3... 符合N(0,1),令 X = ∑ i = 1 n X i 2 X=\sum_{i=1}^n X_i^2 X=∑i=1nXi2,则称X 是自由度为n的卡方变量,其分布称为自由度为n的卡方分布。
自由度越大,就越对称,越接近正态分布。
2. 卡方检验
-
卡方检验:
特征选择:目的是为了去除和结果无关的特征。
如果判断无关特征?
对于分类问题:一般假设与标签独立的特征为无关特征,卡方检验就是进行 独立性检验。
如果检验结果是某个特征与标签独立,就可以去除该特征。卡方检验的计算公式: x 2 = ∑ ( A − T ) 2 / T x^2 = \sum(A-T)^2/T x2=∑(A−T)2/T
其中A 是实际值, T为理论值。
x 2 x^2 x2用于衡量实际值与理论值之间的差异程度(这是卡方检验的核心思想),包含了两个信息:1)实际值与理论值偏差的绝对大小(由于平方的存在,差异是被放大的)。2)差异程度与理论值的相对大小。 -
举例
喝牛奶对感冒发病率有没有影响:
下面是实际统计值:
通过简单的统计我们得出喝牛奶组和不喝牛奶组的感冒率为30.94%和25.00%,两者的差别可能是抽样误差导致,也有可能是牛奶对感冒率真的有影响。
为了确定真实原因,我们先假设喝牛奶对感冒发病率是没有影响的,即喝牛奶喝感冒时独立无关的,所以我们可以得出感冒的发病率实际是(43+28)/(43+28+96+84)= 28.29%
所以,理论的表应该如下表所示:
计算结果:
如果喝牛奶喝感冒真的是独立无关的,那么四格表里的理论值和实际值差别应该会很小。
计算:
卡
方
=
(
43
−
39.3231
)
2
/
39.3231
+
(
28
−
31.6848
)
2
/
31.6848
+
(
96
−
99.6769
)
2
/
99.6769
+
(
84
−
80.3152
)
2
/
80.3152
=
1.077
卡方 = (43 - 39.3231)^2 / 39.3231 + (28 - 31.6848)^2 / 31.6848 + (96 - 99.6769)^2 / 99.6769 + (84 - 80.3152)^2 / 80.3152 = 1.077
卡方=(43−39.3231)2/39.3231+(28−31.6848)2/31.6848+(96−99.6769)2/99.6769+(84−80.3152)2/80.3152=1.077
卡方分布的临界值:
上一步我们得到了卡方的值,但是如何通过卡方的值来判断喝牛奶和感冒是否真的是独立无关的?也就是说,怎么知道无关性假设是否可靠?
–>查询卡方分布的临界值表。
这里需要用到一个自由度的概念,自由度等于V = (行数 - 1) * (列数 - 1),对四格表,自由度V = 1。
对V = 1,喝牛奶和感冒95%概率不相关的卡方分布的临界概率是:3.84。当卡方值小于临界值的时候,拒绝原假设,即认为两个变量显著相关。
显然1.077<3.84,没有达到卡方分布的临界值,所以喝牛奶和感冒独立不相关的假设不成立。
总之,卡方检验: 若各理论数与相应实际数相差越小,卡方值越小;如两者相同,则卡方值必为零。
3. 卡方检验在机器学习中的应用
## https://scikit-learn.org/stable/modules/feature_selection.html#univariate-feature-selection
## 注意 label 必须是离散的格式的(这里是 label 0 1 2)
from sklearn.feature_selection import SelectKBest
from sklearn.feature_selection import chi2
from sklearn.datasets import load_iris
#导入IRIS数据集
iris = load_iris()
iris.data#查看数据
array([[5.1, 3.5, 1.4, 0.2],
[4.9, 3. , 1.4, 0.2],
[4.7, 3.2, 1.3, 0.2],
[4.6, 3.1, 1.5, 0.2],
[5. , 3.6, 1.4, 0.2],
[5.4, 3.9, 1.7, 0.4],
[4.6, 3.4, 1.4, 0.3],
[5. , 3.4, 1.5, 0.2],
[4.4, 2.9, 1.4, 0.2],
[4.9, 3.1, 1.5, 0.1],
[5.4, 3.7, 1.5, 0.2],
[4.8, 3.4, 1.6, 0.2],
[4.8, 3. , 1.4, 0.1],
[4.3, 3. , 1.1, 0.1],
[5.8, 4. , 1.2, 0.2],
[5.7, 4.4, 1.5, 0.4],
[5.4, 3.9, 1.3, 0.4],
[5.1, 3.5, 1.4, 0.3],
[5.7, 3.8, 1.7, 0.3],
...
iris.target
array([0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2])
model1 = SelectKBest(chi2, k=2)#选择k个最佳特征
model1.fit_transform(iris.data, iris.target)#iris.data是特征数据,iris.target是标签数据,该函数可以选择出k个特征
array([[1.4, 0.2],
[1.4, 0.2],
[1.3, 0.2],
[1.5, 0.2],
[1.4, 0.2],
[1.7, 0.4],
[1.4, 0.3],
[1.5, 0.2],
[1.4, 0.2],
[1.5, 0.1],
[1.5, 0.2],
[1.6, 0.2],
[1.4, 0.1],
....
P值是一种概率,一种在原假设为真的前提下出现观察样本以及更极端情况的概率。
下面的值表示:在 原假设为 特征与结果无关的情况下,出现特征观测值的概率。所以p值越小,越有把握拒绝原假设,也就是 p值越小,特征与结果相关性就越高。
model1.pvalues_ #特征得分的p-values
##第3个p值最小,其次是第4个。 所以这两个与target相关性 比前2个 高。
array([4.47651499e-03, 1.56395980e-01, 5.53397228e-26, 2.75824965e-15])
F 检验及应用
1. 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
2
d_1 和d_2
d1和d2 的卡方分布,即
(
X
1
∼
χ
2
(
d
1
)
,
;
X
2
∼
χ
2
(
d
2
)
)
(X_1 \sim \chi^2(d_1), ; X_2 \sim \chi^2(d_2))
(X1∼χ2(d1),;X2∼χ2(d2)),且
X
1
X_1
X1与
X
2
X_2
X2 独立,则随机变量
F
F
F服从自由度为
(
(
d
1
,
d
2
)
)
((d_1, d_2))
((d1,d2)) 的F分布,记为
F
∼
F
(
d
1
,
d
2
)
F \sim \text{F}(d_1, d_2)
F∼F(d1,d2) 。
2.F检验
F检验是看F分布,而F value是SSB/SSE,组间平方和(SSB)和组内平方和(SSE),如果我们把组间平方和理解为两组之间的差异,组内平方和理解为两组内部不同数据的差异的话,那么简单点说,两个数据在有差异的前提下,究竟是组间的差异大,还是组内的差异大呢?如果是组间的差异大,那么这两组数据本身不一致的概率就非常大了,对应F值比较大
基本思想: 按照不同的标签类别将特征划分为不同的总体,我们想要检验的是不同总体之间均值是否相同 (或者是否有显著性差异)。
F检验是一类建立在F分布基础上的假设检验方法。
3. F 检验在机器学习中应用
scikit-learn中有2种F检验方法:
- 分类: f_classif (单因素方差分析)
- 回归: f_regression (线性相关分析)
3.1 方差分析:ANOVA
-
零假设:划分的不同总体的均值都相等,备择假设:各个总体的均值不相等(说明特征有意义)
-
方差分析的原理:
设共有 k个类别,总样本数为 n,第 j个类别的样本数为 n j n_j nj , x i j x_{ij} xij 表示第 j 个类别的第 i 个样本,$ \bar{x_j}$表示第 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ˉ=nj∑i=1njxij.
x ˉ \bar{x} xˉ 为总样本均值 x ˉ = ∑ j = 1 k ∑ i = 1 n j x i j n \bar{x} = \frac{\sum_{j=1}^k \sum_{i=1}^{n_j}x_{ij}}{n} xˉ=n∑j=1k∑i=1njxij,那么样本的总体变异为:
S S T = ∑ j = 1 k ∑ i = 1 n j ( x i j − x ˉ ) 2 SST = \sum\limits_{j=1}^k \sum\limits_{i=1}^{n_j} (x_{ij} - \bar{x})^2 SST=j=1∑ki=1∑nj(xij−xˉ)2SST可以分解为两部分 —— 类别内差异 SSE 和类别间差异 SSB :
S S E = ∑ j = 1 k ∑ i = 1 n j ( x i j − x j ˉ ) 2 SSE = \sum\limits_{j=1}^k \sum\limits_{i=1}^{n_j} (x_{ij} - \bar{x_j})^2 SSE=j=1∑ki=1∑nj(xij−xjˉ)2
S S B = S S T − S S E = ∑ j = 1 k n j ( x j ˉ − x ˉ ) 2 SSB = SST - SSE = \sum\limits_{j=1}^k n_j (\bar{x_j} - \bar{x})^2 SSB=SST−SSE=j=1∑knj(xjˉ−xˉ)2
(SSE) 衡量每个类别内部样本之间的差异,可以认为是随机误差。(SSB) 则衡量不同类别之间的差异。方差分析的基本思想是将不同类别之间的变异与随机误差作比较,如果二者之比大于某一临界值,则可拒绝零假设接受备选假设,即不同类别间样本均值不全相等,这也意味着样本特征对于类别有一定的区分度。
而对于如何确定临界值,则终于要用 F 分布了, 上面已经定义了服从F分布的随机变量,注意到分子分母都要除以自由度,而 SSE 和 SSB 的自由度分别为 k-1和 n-k ,因而统计检验量 F:
F = 类 别 间 方 差 类 别 内 方 差 = M S B M S E = S S B / ( k − 1 ) S S E / ( n − k ) F = \frac{类别间方差}{类别内方差} = \frac{MSB}{MSE} = \frac{SSB \,/\, (k-1)}{SSE\, / \, (n-k)} F=类别内方差类别间方差=MSEMSB=SSE/(n−k)SSB/(k−1)
服从分子自由度为 k-1,分母自由度为 n-k 为的 F 分布,即 M S B M S E ∼ F ( k − 1 , n − k ) \frac{MSB}{MSE} \sim F(k-1, \,n-k) MSEMSB∼F(k−1,n−k) 。
于是按假设检验的套路,零假设成立的情况下算出 F 值,查 F 分布表,若p值小于0.05 (或0.01),则拒绝零假设接受备选假设,不同类别间均值不相等。
方差分析可用于控制一个或多个自变量来检验其与因变量的关系,进而检测某种实验效果, 就一般的特征选择问题而言,和卡方检验一样,我们依然比较关心的是特征的相对重要性,所以可以按每个特征 F 值的大小进行排序,去除F值小的特征。
3.2 线性相关分析
对于特征和标签皆为连续值的回归问题,要检测二者的相关性,最直接的做法就是求相关系数
r
x
y
r_{xy}
rxy:
r
x
y
=
c
o
v
(
x
,
y
)
σ
x
σ
y
=
∑
i
=
1
n
(
x
i
−
x
ˉ
)
(
y
i
−
y
ˉ
)
∑
i
=
1
n
(
x
i
−
x
ˉ
)
2
∑
i
=
1
n
(
y
i
−
y
ˉ
)
2
r_{xy} = \frac{cov(x,y)}{\sigma_x \sigma_y} =\frac{\sum_{i=1}^n (x_i - \bar{x})(y_i - \bar{y})}{\sqrt{\sum_{i=1}^n(x_i - \bar{x})^2} \sqrt{\sum_{i=1}^n (y_i - \bar{y})^2}}
rxy=σxσycov(x,y)=∑i=1n(xi−xˉ)2∑i=1n(yi−yˉ)2∑i=1n(xi−xˉ)(yi−yˉ)
但 scikit-learn 中的 f_regression 采用的是先计算相关系数,然后转化为F值。究竟是如何转换的?在线性回归中常使用判定系数
R
2
R^2
R2 作为回归方程拟合数据点的程度,或者说是因变量的总体方差能被自变量解释的比例。
R
2
R^2
R2 的定义以及和相关系数
r
x
y
r_{xy}
rxy 的关系如下:
R
2
=
S
S
R
S
S
T
=
1
−
S
S
E
S
S
T
=
r
x
y
2
R^2 = \frac{SSR}{SST} = 1- \frac{SSE}{SST} = r_{xy}^2
R2=SSTSSR=1−SSTSSE=rxy2
其中 SSE为误差平方和:
S
S
E
=
∑
i
=
1
n
(
y
i
−
y
^
i
)
2
SSE = \sum_{i=1}^n (y_i - \hat{y}_i)^2
SSE=i=1∑n(yi−y^i)2,SSR为回归平方和:
S
S
R
=
∑
i
=
1
n
(
y
^
i
−
y
ˉ
)
2
SSR = \sum_{i=1}^n (\hat{y}_i - \bar{y})^2
SSR=i=1∑n(y^i−yˉ)2 ,SST 为总体平方和:
S
S
T
=
∑
i
=
1
n
(
y
i
−
y
ˉ
)
2
SST = \sum_{i=1}^n (y_i - \bar{y})^2
SST=i=1∑n(yi−yˉ)2 。可以看到这些式子与方差分析中的式子非常类似,不过注意这里计算的是都是标签值 y,而不是方差分析中的 x 。这其中的原理都是相通的,我们同样可以用 SSR 和 SSE来计算检验统计量 F (SSR 和 SSE 的自由度分别为1和 n-2 ):
F
=
M
S
R
M
S
E
=
S
S
R
/
1
S
S
E
/
(
n
−
2
)
=
S
S
R
/
S
S
T
S
S
E
/
S
S
T
×
(
n
−
2
)
=
r
x
y
2
1
−
r
x
y
2
×
(
n
−
2
)
F = \frac{MSR}{MSE} = \frac{SSR \,/\, 1}{SSE \,/\, (n-2)} = \frac{SSR / SST}{SSE / SST} \times (n-2) = \frac{r_{xy}^2}{1-r_{xy}^2} \times (n-2)
F=MSEMSR=SSE/(n−2)SSR/1=SSE/SSTSSR/SST×(n−2)=1−rxy2rxy2×(n−2)
即
M
S
R
M
S
E
∼
F
(
1
,
n
−
2
)
\frac{MSR}{MSE} \sim F(1, \,n-2)
MSEMSR∼F(1,n−2)。这样就可以方便地将相关系数转化为 F 值了,接下来的步骤与之前的假设检验一样。该方法的缺点是只能检测线性相关关系,但不相关不代表独立,可能是非线性相关关系。
T检验及应用
1. T分布
正态分布的两个参数μ和σ决定了正态分布的位置和形态。为了应用方便,常将一般的正态变量X通过u变换[(X-μ)/σ]转化成标准正态变量u,以使原来各种形态的正态分布都转换为μ=0,σ=1的标准正态分布(standard normaldistribution),亦称u分布。根据中心极限定理,通过抽样模拟试验表明,在正态分布总体中以固定 n 抽取若干个样本时,样本均数的分布仍服从正态分布,即N(μ,σ)。所以,对样本均数的分布进行u变换,也可变换为标准正态分布N (0,1)。
由于在实际中,往往σ(总体方差)是未知的,常用s(样本方差)作为σ的估计值,为了与u变换区别,称为t变换,统计量t 值的分布称为t分布。
2. T检验
要求: 一组样本二分类,一组样本连续值。 仅仅适用于该情况。
T检验分单样本T检验和双样本T检验
- 单样本T检验检验的是样本的均值是否能代表总体的均值。
- 双样本T检验检验的是两个独立样本所代表的总体数据均值差异是否显著。换句话说就是检验两个总体是否是存在差异。
双样本T检验适用条件如下:
两样本均来自于正态总体
两样本相互独立
满足方差齐性,方差齐次性指的是样本的方差在一个数量级水平上(通过方差齐性检验)
接下来按照假设检验流程:
- 1.原假设:两个独立样本所代表的总体数据均值相同(H_0),备择假设:两个独立样本所代表的总体数据均值不相同(H_1);
- 2.P值定为0.05;
- 3.计算两组样本的均值,标准差然后带入下图所示的公式后求得t值,然后查T检验表得到P值。其中 x ‾ 1 \overline x_1 x1 和$\overline x_2 $分别指这两组样本的均值,s_1 和s_2分别代表两组样本的标准差, n_1 和n_2分别代表两组样本的样本量;
- 4.如果P< 0.05,则两组数据均值不同,数据间存在差异,如果P> 0.05,则两组数据均值相同。
3. T检验的简单应用
from scipy import stats
import pandas as pd
from sklearn.datasets import load_boston
%matplotlib inline
data_value = load_boston().data
data_target = load_boston().target
feature = load_boston().feature_names
data = pd.DataFrame({i:j for i,j in zip(feature, [data_value[:,index] for index in range(len(feature))])})
data['Price'] = data_target
data[:10]
"""
price 是预测列y, 其他列都是特征x.
如果X 和Y 中一个为二分类数值类型,一个为连续的数值类型,就可以用双样本T检验
下面选择CHAS 这列(二分类数值类型:471:0, 35:1), Price是一个连续的数值类型。 针对这两列采用双T 检验, 检验CHAS(0或者1)的不同是否会对房价有影响,也就是说检验CHAS这列特征和房价是否有关系。
(CHAS:查尔斯河虚拟变量 (= 1 如果土地在河边;否则是0))
"""
data['CHAS'].value_counts()
'''
data['CHAS'].value_counts()
0.0 471
1.0 35
Name: CHAS, dtype: int64
'''
data['Price'].plot()
## 将CHAS=0的房价样本和CHAS=1的房价样本分别抽取出来
CHAS_0 = list(data[data['CHAS']==0].Price)
CHAS_1 = list(data[data['CHAS']==1].Price)
## T-test步骤1: 方差齐次性检验
stats.levene(CHAS_0, CHAS_1)
#这里我们只需要关注p value.
# P=0.03小于0.05,证明方差齐次性检验的原假设不成立,说明两组样本方差不满足齐次性。
#LeveneResult(statistic=4.590342218715871, pvalue=0.03263097600633006)
## T-test步骤2:做双样本T检验。
## 注意由于两组样本之间的方差不满足齐次性,需要加一个参数 equal_var=False
stats.ttest_ind(CHAS_0,CHAS_1, equal_var=False)
#Ttest_indResult(statistic=-3.113291312794837, pvalue=0.003567170098137517)
## P=0.003小于0.05,证明双样本T检验的原假设不成立,即两个总体之间的均值存在差异。
## 即CHAS=0和CHAS=1 对应的房价 均值有差异。也就是说 CHAS 这一个特征对房价用影响。
## 这里看一下房价均值
data.groupby('CHAS').mean()['Price']
## CHAS=0:均值22,CHAS=1:均值28.
## 单变量特征选择
import numpy as np
import matplotlib.pyplot as plt
from sklearn.datasets import load_iris
from sklearn.feature_selection import SelectPercentile, chi2
from sklearn.model_selection import cross_val_score
from sklearn.pipeline import Pipeline
from sklearn.preprocessing import StandardScaler
from sklearn.svm import SVC
# #############################################################################
# Import some data to play with
X, y = load_iris(return_X_y=True)
# Add non-informative features
np.random.seed(0)
X = np.hstack((X, 2 * np.random.random((X.shape[0], 36))))
# #############################################################################
# Create a feature-selection transform, a scaler and an instance of SVM that we
# combine together to have an full-blown estimator
clf = Pipeline([('anova', SelectPercentile(chi2)),
('scaler', StandardScaler()),
('svc', SVC(gamma="auto"))])
# #############################################################################
# Plot the cross-validation score as a function of percentile of features
score_means = list()
score_stds = list()
percentiles = (1, 3, 6, 10, 15, 20, 30, 40, 60, 80, 100)
for percentile in percentiles:
clf.set_params(anova__percentile=percentile)
this_scores = cross_val_score(clf, X, y, cv=5)
score_means.append(this_scores.mean())
score_stds.append(this_scores.std())
plt.errorbar(percentiles, score_means, np.array(score_stds))
plt.title(
'Performance of the SVM-Anova varying the percentile of features selected')
plt.xticks(np.linspace(0, 100, 11, endpoint=True))
plt.xlabel('Percentile')
plt.ylabel('Accuracy Score')
plt.axis('tight')
plt.show()
参考:
http://www.likecs.com/show-54117.html
https://blog.csdn.net/jetFlow/article/details/78884619