模型选择准则:利用IQtree结果计算AIC&BIC

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了模型选择准则:利用IQtree结果计算AIC&BIC相关的知识,希望对你有一定的参考价值。

参考技术A 赤池信息准则(Akaike Information Criterion,AIC)
贝叶斯信息准则(Bayesian Information Criterion,BIC)

https://blog.csdn.net/baidu_38172402/article/details/89075582
https://blog.csdn.net/xianlingmao/article/details/7891277
https://blog.csdn.net/lfdanding/article/details/50732762

AIC是衡量统计模型拟合优良性的一种标准,由日本统计学家赤池弘次在1974年提出,它建立在熵的概念上,提供了权衡估计模型复杂度和拟合数据优良性的标准。训练模型时,增加参数数量,也就是增加模型复杂度,会增大似然函数,但是也会导致过拟合现象,针对该问题,AIC和BIC均引入了与模型参数个数相关的惩罚项,BIC的惩罚项比AIC的大,考虑了样本数量,样本数量过多时,可有效防止模型精度过高造成的模型复杂度过高。

原理不是多说,直接利用IQtree计算。

AIC=2k−2ln(L)

BIC=kln(n)−2ln(L)

k为模型参数个数,n为位点数量,L为似然函数。

IQtree运行以后产生的文件:

.dat与.phy是我对齐序列文件以及分区文件。
.best_scheme与.best_scheme.nex里面是每个分区所匹配的模型。如果是iqtree不分区的情况不会有这个文件产生。
会有两个树文件一个是.contree一个是.treefile。

.treefile对应的是ML树。
.contree是一个由1000bootstrap trees为引导树生成的共有树。

计算AIC&BIC的数据在.iqtree里面。
打开以后向下滑动找到SEQUENCE ALIGNMENT
分区会有显示是9个partitions

这个是37个分区

不分区的结果里面不会显示分区情况,也就是整一个序列是一个区。

咱们记录分区与位点数量

接着往下找到MAXIMUM LIKELIHOOD TREE
这个是ML树的一些信息,IQtree是计算好了AIC与BIC的。
可以自己验证一下计算是否正确。

补充一下K值来源

计算下面跟着的CONSENSUS TREE的结果,这个IQtree没有给算AIC与BIC。
取Log-likelihood的值,这个值其实已经是ln(L)。所以后面计算中不用再ln。

直接在excel计算即可:
AIC就是AIC=2k−2(Log-likelihood)

BIC是BIC=k*ln(n)−2(Log-likelihood)

这里面需要选择AIC最小的值作为最优模型。
2lg(BF)与RBF是检查最优模型与次优模型之间的差距。

2 lg(BF)就是=2*LOG([最大的Log-likelihood]-[当前模型的Log-likelihood])

RBF是=2*LOG([最大的Log-likelihood]-[当前模型的Log-likelihood])/(([最大的Log-likelihood的模型参数]-[当前模型的模型参数])

5、LASSO模型选择:交叉验证-AIC-BIC

参考技术A 5、LASSO模型选择:交叉验证-AIC-BIC

import time

import numpy as np

import matplotlib.pyplot as plt

from sklearn.linear_model import LassoCV, LassoLarsCV, LassoLarsIC

from sklearn import datasets

plt.rcParams['font.sans-serif'] = ['SimHei']

plt.rcParams['axes.unicode_minus'] = False

# 这是为了在执行np.log10时避免被零除

EPSILON = 1e-4

X, y = datasets.load_diabetes(return_X_y=True)

rng = np.random.RandomState(42)

X = np.c_[X, rng.randn(X.shape[0], 14)]  # 增加一些不好的特性

# 按照Lars的方法对数据进行规范化,以便进行比较

X /= np.sqrt(np.sum(X ** 2, axis=0))

# LassoLarsIC: 基于BIC/AIC准则的最小角回归

model_bic = LassoLarsIC(criterion='bic')

t1 = time.time()

model_bic.fit(X, y)

t_bic = time.time() - t1

alpha_bic_ = model_bic.alpha_

model_aic = LassoLarsIC(criterion='aic')

model_aic.fit(X, y)

alpha_aic_ = model_aic.alpha_

def plot_ic_criterion(model, name, color):

    criterion_ = model.criterion_

    plt.semilogx(model.alphas_ + EPSILON, criterion_, '--', color=color,

                linewidth=3, label='%s criterion' % name)

    plt.axvline(model.alpha_ + EPSILON, color=color, linewidth=3,

                label='alpha: %s estimate' % name)

    plt.xlabel(r'$\alpha$')

    plt.ylabel('criterion')

plt.figure()

plot_ic_criterion(model_aic, 'AIC', 'b')

plot_ic_criterion(model_bic, 'BIC', 'r')

plt.legend()

plt.title('信息-模型选择的标准 (训练时间: %.3fs)'

          % t_bic)

# LassoCV: 坐标下降

# 计算路径

print("Computing regularization path using the coordinate descent lasso...")

t1 = time.time()

model = LassoCV(cv=20).fit(X, y)

t_lasso_cv = time.time() - t1

# 显示结果

plt.figure()

ymin, ymax = 2300, 3800

plt.semilogx(model.alphas_ + EPSILON, model.mse_path_, ':')

plt.plot(model.alphas_ + EPSILON, model.mse_path_.mean(axis=-1), 'k',

        label='Average across the folds', linewidth=2)

plt.axvline(model.alpha_ + EPSILON, linestyle='--', color='k',

            label='alpha: CV estimate')

plt.legend()

plt.xlabel(r'$\alpha$')

plt.ylabel('Mean square error')

plt.title('每个折叠上的均方误差:坐标下降'

          '(训练时间 : %.2fs)' % t_lasso_cv)

plt.axis('tight')

plt.ylim(ymin, ymax)

# LassoLarsCV:最小角回归

# 计算路径

print("Computing regularization path using the Lars lasso...")

t1 = time.time()

model = LassoLarsCV(cv=20).fit(X, y)

t_lasso_lars_cv = time.time() - t1

# 显示结果

plt.figure()

plt.semilogx(model.cv_alphas_ + EPSILON, model.mse_path_, ':')

plt.semilogx(model.cv_alphas_ + EPSILON, model.mse_path_.mean(axis=-1), 'k',

            label='Average across the folds', linewidth=2)

plt.axvline(model.alpha_, linestyle='--', color='k',

            label='alpha CV')

plt.legend()

plt.xlabel(r'$\alpha$')

plt.ylabel('Mean square error')

plt.title('每折均方误差: Lars (训练时间 : %.2fs)'

          % t_lasso_lars_cv)

plt.axis('tight')

plt.ylim(ymin, ymax)

plt.show()

以上是关于模型选择准则:利用IQtree结果计算AIC&BIC的主要内容,如果未能解决你的问题,请参考以下文章

模型选择的几种方法--AIC,BIC,HQ准则

模型选择的方法:AIC,k-折交叉验证

5、LASSO模型选择:交叉验证-AIC-BIC

交叉验证Cross-Validation

PRML 1.3 模型选择 1.4 维度灾难

R语言glm拟合logistic回归模型:模型评估(计算模型拟合的统计显著性)模型评估(赤信息AIC指标计算)