ANOVA与机器学习

2023-05-16

文章目录

  • 方差分析ANOVA
    • 组间变异和组内变异
    • 均方差
    • F分布与F值
    • 方差分析的关键条件
  • Anova在机器学习中的应用: 特征选择
  • 总结
  • 更多阅读:

方差分析ANOVA

anova, analysis of variance, 方差分析, 又称"变异数分析", 用于两个或两个以上样本均数差别的显著性检验.

由于各种因素的影响, 观测数据呈现波动的形状, 造成波动的原因可以分为:

  1. 不可控的随机因素
  2. 可控因素, 这是在研究中施加的控制结果的参数引起的

组间变异和组内变异

换个角度理解, 任何观察值的总变异都可以分解为组间变异和组内变异. 假设n为样本总数, m为组数.

  • 总变异(total variation)
    所有测量值之间总的变异程度 :
    S S T = ∑ i = 1 m ∑ j = 1 m i ( X i j − X ˉ ) 2 SS_T = \sum_{i=1}^{m} \sum_{j=1}^{m_i} (X_{ij}-\bar{X})^2 SST=i=1mj=1mi(XijXˉ)2

  • 组间变异
    各组均数与总均数的离均差平方和:
    S S b = ∑ i = 1 m m i ( X i ˉ − X ˉ ) 2 SS_b =\sum_{i=1}^{m} m_i(\bar{X_i}-\bar{X})^2 SSb=i=1mmi(XiˉXˉ)2
    组间变异反映了各组均数的变异程度, 组间变异=随机误差+处理因素作用

  • 组内变异
    用各个组内测量值 X i j X_{ij} Xij 与其所在组的均数差值的平方和来表示

S S w = ∑ i = 1 m ∑ j = 1 m i ( X i j − X i ˉ ) SS_w = \sum_{i=1}^{m} \sum_{j=1}^{m_i}(X_{ij}-\bar{X_i}) SSw=i=1mj=1mi(XijXiˉ)

组内变异 S S w SS_w SSw反映了随机误差的影响,包括了个体误差和测量误差。

均方差

变异程度出了与离均差平方和的大小有关以外,还与其自由度有关,由于各部分的自由度并不相等,因此各个部分的自由度不能直接比较,应该用各个部分的离均差平方和除以自由度,称为均方差(Mean Square, MS)组内均方和组间均方分别为:

  • 组内均方
    组内自由度: d f b = m − 1 dfb = m-1 dfb=m1, 组内均方:
    M S b = S S b / d f b MS_b=SS_b/dfb MSb=SSb/dfb

  • 组间均方
    组间自由度: d f w = n − m dfw = n-m dfw=nm, 组间均方:
    M S w = S S w / d f w MS_w=SS_w/dfw MSw=SSw/dfw

组间均方与组内均方比值越接近1,样本越可能是来自一个样本,比值越大,样本越可能来自不同的样本。

F分布与F值

如果各组样本都来自同一个总体,控制因素没有起到作用,那么组间变异和组内变异都只是反映了随机误差的大小。组间均方和组内均方的比值就称为F统计量:
F = M S w M S b F = \frac{MS_w}{MS_b} F=MSbMSw
F分布更为严格的定义为:
若总体 X   N ( 0 , 1 ) X~N(0,1) X N(0,1), ( X 1 , X 2 , . . . , X n 1 ) (X_1, X_2, ..., X_{n_1}) (X1,X2,...,Xn1) ( Y 1 , Y 2 , . . . , Y n 2 ) (Y_1,Y_2, ...,Y_{n_2}) (Y1,Y2,...,Yn2)为来自X的两个独立样本,那么统计量
F = ∑ i = 1 n 1 X i 2 n 1 / ∑ i = 1 n 2 X i 2 n 2 F = \frac{\sum_{i=1}^{n_1}X_i^2}{n_1} / \frac{\sum_{i=1}^{n_2}X_i^2}{n_2} F=n1i=1n1Xi2/n2i=1n2Xi2
服从自由度为 n 1 , n 2 n_1, n_2 n1,n2的F分布。F分布是一个非对称分布,有两个自由度,且自由度的前后顺序不可互换。
F分布

通常,假设控制因素没有起作用,即H0(null hypothesis)按照公式计算F值,并查F分布表,得到F分布的单尾临界值 F a ( n 1 , n 2 ) F_{a(n_1,n_2)} Fa(n1,n2)
假设a=0.05, 如果 F ≥ F 0.05 ( n 1 , n 2 ) F\geq{F_{0.05(n_1,n_2)}} FF0.05(n1,n2) 时, p ≤ 0.05 p\leq0.05 p0.05,拒绝H0,认为两组间有显著差异。

方差分析的关键条件

  • 各组服从正态分布
  • 各组符合方差齐性
  • 独立性

说明: 方差齐性检验
方差齐性检验方法有Bartlett检验法,LeveneF检验,此外,如果最大方差于最小方差之比<3,就可以初步认为方差齐同。

如果数据不符合上述方差分析的条件,那么应该采取方差齐性转换/正态性转换,或者采用非参数检验的方法。

Anova在机器学习中的应用: 特征选择

利用Anova,可以比较样本间不同特征差异的显著性,在数据进入分类器/回归器训练之前进行特征提取,效果类似于数据降维。

以iris数据集为例,首先在数据集中人为地加入了一些噪声信息,然后分别用Anova方差分析选择具有统计显著性的特征,对比p值和SVM支撑向量系数的分布。根据ANOVA的结果,可以看出在iris数据集中主要是前4个特征非常显著地给出了不同类别之间的差异信息。但是SVM的支撑向量中,除了这4个特征外,还零散地选择了一些其它并不重要的特征。

将anova提取的特征信息作为SVM的输入,

clf_selected = svm.SVC(kernel='linear')
clf_selected.fit(selector.transform(X_train), y_train)

可以看到在柱形图中,浅蓝色的SVM weighs after selection就没有那些不重要的特征了。当数据噪声增加的时候,可以提高SVM的表现。

import numpy as np
import matplotlib.pyplot as plt
from sklearn.model_selection import train_test_split
from sklearn import datasets, svm
from sklearn.feature_selection import SelectPercentile, f_classif

# #############################################################################
# Import some data to play with

# The iris dataset
iris = datasets.load_iris()

# Some noisy data not correlated
E = np.random.uniform(0, 1, size=(len(iris.data), 20))

# Add the noisy data to the informative features
X = np.hstack((iris.data, E))
y = iris.target

X_train, X_test, y_train, y_test = train_test_split(X, y,train_size=0.7)


plt.figure(1)
plt.clf()

X_indices = np.arange(X_train.shape[-1])

######################################################
# Univariate feature selection with F-test for feature scoring
# We use the default selection function: the 10% most significant features
selector = SelectPercentile(f_classif, percentile=10)
selector.fit(X_train, y_train)
scores = -np.log10(selector.pvalues_)
scores /= scores.max()
plt.bar(X_indices - .45, scores, width=.2,
        label=r'Univariate score ($-Log(p_{value})$)', color='darkorange',
        edgecolor='black')

####################################################
# Compare to the weights of an SVM
clf = svm.SVC(kernel='linear')
clf.fit(X_train, y_train)

svm_weights = (clf.coef_ ** 2).sum(axis=0)
svm_weights /= svm_weights.max()

plt.bar(X_indices - .25, svm_weights, width=.2, label='SVM weight',
        color='navy', edgecolor='black')

clf_selected = svm.SVC(kernel='linear')
clf_selected.fit(selector.transform(X_train), y_train)

svm_weights_selected = (clf_selected.coef_ ** 2).sum(axis=0)
svm_weights_selected /= svm_weights_selected.max()

plt.bar(X_indices[selector.get_support()] - .05, svm_weights_selected,
        width=.2, label='SVM weights after selection', color='c',
        edgecolor='black')

plt.title("Comparing feature selection")
plt.xlabel('Feature number')
plt.yticks(())
plt.axis('tight')
plt.legend(loc='upper right')
plt.show()

y_pred = clf.predict(X_test)
y_pred_selected = clf_selected.predict(selector.transform(X_test))

print(' less noise ')
print('------------------')
print('only SVM:')
print(classification_report(y_test, y_pred))
print('anova_SVM:')
print(classification_report(y_test, y_pred_selected))
######################################################
# increase noise rate
E = np.random.uniform(0, 1, size=(len(iris.data), 100))

# Add the noisy data to the informative features
X = np.hstack((iris.data, E))
y = iris.target

X_train, X_test, y_train, y_test = train_test_split(X, y,train_size=0.7)

# SVM only
clf = svm.SVC(kernel='linear')
clf.fit(X_train, y_train)

# SVM with anova feature selection
selector = SelectPercentile(f_classif, percentile=10)
selector.fit(X_train, y_train)
clf_selected = svm.SVC(kernel='linear')
clf_selected.fit(selector.transform(X_train), y_train)

y_pred = clf.predict(X_test)
y_pred_selected = clf_selected.predict(selector.transform(X_test))

print('more noise')
print('------------------')
print('only SVM:')
print(classification_report(y_test, y_pred))
print('anova_SVM:')
print(classification_report(y_test, y_pred_selected))
X_sel = selector.transform(X_test)
print(X_sel.shape)
print(X_test.shape)

输出:

less noise 
------------------
only SVM:
             precision    recall  f1-score   support

          0       1.00      1.00      1.00        11
          1       1.00      0.89      0.94        18
          2       0.89      1.00      0.94        16

avg / total       0.96      0.96      0.96        45

anova_SVM:
             precision    recall  f1-score   support

          0       1.00      1.00      1.00        11
          1       1.00      0.94      0.97        18
          2       0.94      1.00      0.97        16

avg / total       0.98      0.98      0.98        45

more noise
------------------
only SVM:
             precision    recall  f1-score   support

          0       1.00      1.00      1.00        13
          1       0.78      0.82      0.80        17
          2       0.79      0.73      0.76        15

avg / total       0.84      0.84      0.84        45

anova_SVM:
             precision    recall  f1-score   support

          0       1.00      1.00      1.00        13
          1       0.94      0.94      0.94        17
          2       0.93      0.93      0.93        15

avg / total       0.96      0.96      0.96        45

(45, 11)
(45, 104)

上述代码还可以通过构建pipeline实现,例如

from sklearn.svm import SVC
svc = SVC(kernel='linear')

# Define the dimension reduction to be used.
# Here we use a classical univariate feature selection based on F-test,
# namely Anova. When doing full-brain analysis, it is better to use
# SelectPercentile, keeping 5% of voxels
# (because it is independent of the resolution of the data).
from sklearn.feature_selection import SelectPercentile, f_classif
feature_selection = SelectPercentile(f_classif, percentile=5)

# We have our classifier (SVC), our feature selection (SelectPercentile),and now,
# we can plug them together in a *pipeline* that performs the two operations
# successively:
from sklearn.pipeline import Pipeline
anova_svc = Pipeline([('anova', feature_selection), ('svc', svc)])

总结

假设n为样本总数, m为组数, 方差分析假设不同组的平均数差别来自:

  1. 实验条件, 也就是说由于不同处理造成的差异, 称为组间差异, 用变量在各个组的均值与总均值偏差的平方和表示, 记作SSb, 组间自由度记做dfb(dfb=m-1)
    2.随机误差, 例如测量误差造成的差异,或者个体之间的差异(组内差异), 可以用变量在各组的均值与该组内变量值的偏差平方和表示, 记做SSw, 组内自由度dfw(dfw = n-m)

总偏差的平方和 : SSt = SSb + SSw
组间均方差: MSw= SSw/dfw
组内均方差: MSb = SSb/dfb

F = M S w M S b F = \frac{MS_w}{MS_b} F=MSbMSw
F值符合F分布,通过查F分布表,可以得到显著性判断,拒绝H0假设或者接受H0假设。

更多阅读:

Anova中的P值F值,正态分布到卡方分布再到F分布:
https://blog.csdn.net/zhangjipinggom/article/details/82315232
详解方差分析: https://zhuanlan.zhihu.com/p/47175790

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

ANOVA与机器学习 的相关文章

随机推荐

  • 创新者的孤独

    我在刚入行的时候 xff0c 经常看 JavaEye 现在的 Iteye 论坛 xff0c 那个时候有个猛人开发了一个web框架 Douyu 在论坛里一炮走红 他通过改写 Java 编译器来实现很多原先实现不了的动态能力并且抛弃了 Java
  • shell脚本选项设置及解析

    shell脚本的选项 比较复杂的shell脚本通常都会支持多个选项及其输入 通常形式为 a z A Z filename settings 在控制台输入脚本名称时 还会显示出帮助信息 显示帮助 可以定义一个Usage 函数作为脚本的帮助函数
  • 磁共振影像分析之: 基于FSL的VBM分析(2)

    统计分析 生成好study specific模板 下来要做统计分析组间差异了 如果用fsl提供的vbm方案 这一步对应的就是fslvbm 3 proc这个命令了 fslvbm 3 proc 这一步和实验设计和研究问题本身很有关系 这里讲讲f
  • shell脚本中 LC_ALL=C 的含义

    在shell脚本中常见到如下语句 export LC ALL 61 C 这一句的作用是为了去除所有本地化的设置 xff0c 让命令能正确执行 Linux的运行环境 在Linux中通过locale来设置程序运行的不同语言环境 xff0c lo
  • XNAT神经影像多中心数据管理开源平台vagrant虚拟机部署方案

    XNAT extensible Neuroimaging Archive Toolkit 是一个开源的软件平台 xff0c 旨在帮助神经影像及其相关数据的管理和挖掘 XNAT包括一个加密的后端数据库和一个基于万维网的丰富的人机界面 xff0
  • vagrant入门指南(一) : 安装与基本配置

    vagrant介绍 vagrant是用来构建虚拟开发环境的工作 非常适合php python ruby java开发web应用 在生产环境中经常利用vagrant封装一个Linux开发环境 分发给团队成员 每个成员可以在自己的桌面系统上开发
  • vagrant入门指南(二): 创建vagrant项目

    创建vagrant项目的第一步应该是新建Vagrantfile文件 在Vagrantfile中应该明确两个问题 1 明确项目的root文件夹位置 vagrant的很多配置选项都是根据root文件夹的位置设置的 2 描述项目需要的机器和资源
  • 机器学习之:流形与降维概述

    流形与降维 xff1a 概述 降维算法概述流形学习距离的定义 KNN图与流形降维KNN图SNE算法 降维算法概述 降维 xff0c 顾名思义就是把数据或者特征的维度降低 xff0c 一般分为线性降维和非线性降维 线性降维有 xff1a PC
  • 机器学习之:载入数据

    加载公共的开放数据 通过url链接下载 通常网上有很多开放数据供算法测试 通常要用到urllib从给定的链接下载 例如从UCI机器学习数据仓库中下载的数据 xff1a span class token keyword import span
  • shell脚本:如何记录计算时长以及如何保存日志文件

    python和matlab都有非常友好的记录时间的方式 xff0c 且不说python的time xff0c datetime工具包 xff0c matlab的tic xff0c toc命令简单好记 xff0c 都是程序时间很好的记录工具
  • MRI-FSL pipeline 多进程并发和并发数控制

    shell脚本并发 在MRI预处理pipeline串行执行非常耗时 非常有必要将pipeline并行化 在linux环境下 并行计算可以有多种实现方法 例如在shell中通过转入后台的方式 或者用xargs多进程并发 还可以用fifo管道实
  • 增长黑客 - 开源项目增长利器

    2012 年我开源了自己的第一个项目 https github com allwefantasy ServiceFramework 这个项目并不成功 xff0c 但对我个人的价值还是比较大的 xff0c 一直作为我工具箱用到现在 从 16
  • vagrant(三):网络配置

    网络配置 所有的网络设置都可以通过配置Vagrantfile来实现 具体来说 xff0c 就是在Vagrantfile中调用config vm network进行相关的设置 vagrant支持以下三种网络配置 xff1a Forwarded
  • vagrant(四):共享目录

    vagrant共享目录 共享目录synced folder 参数共享目录类型 共享目录 共享目录可以设置Vagrant在宿主机 host 和虚拟机 guest 之间同步文件 xff0c 这样做的好处是可以在宿主机上开发 xff0c 在虚拟机
  • FSL的python和R语言接口

    FSL除了本身支持shell命令调用以外 还有一些其他语言的工具包 例如 python和R fsl的python编程库称为fslpy 是可视化工具FSLeyes的一部分 fslpy目前支持python 3 5 3 6 and 3 7开发环境
  • linux rm 命令误删文件恢复

    不小心用rm命令删错了文件 该怎么办 查看分区和文件格式 误删的文件在哪里 首先 用rm命令误删了文件 并不是不可以恢复 首先需要查看一下误删文件所在的分区和文件格式 df T 文件系统 类型 1K 块 已用 可用 已用 挂载点 dev s
  • MRI相关的基本概念

    磁共振基础 磁共振 磁共振 mageticresonanceMR xff1b 在恒定磁场中的核子 xff08 氢质子 xff09 xff0c 在相应的射频脉冲激发后 xff0c 其电磁能量的吸收和释放 xff0c 称为磁共振 基本参数 TR
  • 服务器搭建: 用户管理

    文章目录 查看当前用户用户类型多用户管理用户和用户组的概念添加用户adduser命令useradd命令 用户组管理给用户添加sudo权限删除用户 备注 xff08 1 xff09 etc passwd文件 xff08 2 xff09 etc
  • scikit learn工具箱pipeline模块:串联方法

    scikit learn工具箱pipeline模块 xff1a 串联方法 pipeline模块 scikit learn工具箱的pipeline模块提供了将算法模型串联 并联的工具 xff0c 多个estimator并联起来用于模型结果比较
  • ANOVA与机器学习

    文章目录 方差分析ANOVA组间变异和组内变异均方差F分布与F值方差分析的关键条件 Anova在机器学习中的应用 特征选择总结更多阅读 方差分析ANOVA anova analysis of variance 方差分析 又称 34 变异数分