基于AIC评价指标的向后回归法——Python语言实现

常用评价指标简介

       当前统计学以计算机科学作为支撑,机器于人工的优势是计算速度,但机器无法自行判断运算何时退出,因此需要定量指标作为运算退出的标志。对于预测类的统计模型来说,常见的指标有赤池信息准则(AIC)、贝叶斯信息准则(BIC)、R方、ROC曲线下方的面积大小(AUC)等指标。指标无优劣之分,在实际运用中很多情况甚至会出现不同评价指标相悖的情况,因此作为模型开发者不能只追求好看的评估指标。在本文中,实现模型时选择AIC作为评价指标,AIC是一种基于残差平方和进行变形的评价指标,因此AIC越小模型拟合效果越好。作为一种容易理解评估指标,AIC的数学公式为  AIC=2k+n(log(RSS/n)),其中RSS为残差平方和,n为观测数,k为变量数。从公式可以看出该指标综合考虑了模型的简洁性(变量个数)和准确性。

逻辑回归变量筛选方法简介

        逻辑回归的变量选择中,目前主要使用的方法有向前回归法、向后回归法和逐步回归。向前回归法是将自变量依次加入模型,每加入一个特征都利用检验指标检验,保留使模型指标更优的自变量,依次不断迭代加入,直到评估指标不能再优化。向后回归法是将所有变量都放入模型之后,一次迭代剔除变量,将某一自变量拿出模型,若模型评估指标更优化,则剔除此变量,对全部变量进行迭代,直到评估指标不能再优化。逐步回归综合向前和向后两种方法,在每一次加入新特征后(即向前法加入),再依次删掉每个特征(即向后法删除),考虑所加入的新变量对每个已有变量的影响。

        基于其原理,其运行效率从高到低依次为 向前≥向后≥逐步(不同的变量情况可能会导致向后和逐步法的效率不一致),这是因为向前回归依次加入自变量计算评估指标数值,但一般由于不断剔除特征并不会整的会对全部自变量进行运算,而向后法在运算之初就需要使用全部特征进行运算,其效率自然会低一些,逐步回归由于每一次迭代同时进行了依次向前回归和向后回归,因此其效率最低。根据原理其效果应该为 逐步≥向后≥向前,但在实际应用中三者差别并不会太大。

向后回归法python代码实现

代码逻辑思路:

  1. 计算全部特征的AIC,作为初始化AIC选择的标准;
  2. 在全部特征中依次计算每次去掉一个特征的AIC,比如有n个特征则需要循环n次得到n个AIC值;
  3. 选择AIC值最小的值作为,在候选特征中删掉得到最小AIC的特征;
  4. 循环执行2、3步,直到剔除变量不能使得模型更优。

基于以上原理,使用python进行实现

'''
1. 传入参数
data     : DataFrame格式,传入包含target的数据集
response :String格式,指明target的列名
2. 返回值
return   : 返回运算后的最优statsmodel模型
'''
import statsmodels.formula.api as smf
import statsmodels.api as sm

def backward_select(data, response):
    selected = set(data.columns)
    selected.remove(response)
    selected = list(selected)

    removed = []
    # 初始化赋值
    best_new_score = float('inf')
    # 全部特征的AIC作为初始参数
    formula = "{} ~ {}".format(
                response,' + '.join(selected))
    current_score = smf.glm(
        formula=formula, data=data, 
        family=sm.families.Binomial(sm.families.links.logit)
    ).fit().aic
    print ('initial aic is {}!'.format(current_score))
    print('initial formula is {}'.format(formula))
    while selected:
        aic_with_candidates=[]
        for candidate in selected:
            select_tmp = selected.copy()
            select_tmp.remove(candidate)
            formula = "{} ~ {}".format(
                response,' + '.join(select_tmp))
            aic = smf.glm(
                formula=formula, data=data, 
                family=sm.families.Binomial(sm.families.links.logit)
            ).fit().aic
            aic_with_candidates.append((aic, candidate))
        aic_with_candidates.sort(reverse=True)
        best_new_score, best_candidate=aic_with_candidates.pop()
        if current_score > best_new_score: 
            selected.remove(best_candidate)
            removed.append(best_candidate)
            current_score = best_new_score
            print ('aic is {},continuing!'.format(current_score))
            if len(selected) <= 1:
                break
        else:        
            print ('backward selection over!')
            break
            
    formula = "{} ~ {} ".format(response,' + '.join(selected))
    print('final formula is {}'.format(formula))
    model = smf.glm(
        formula=formula, data=data, 
        family=sm.families.Binomial(sm.families.links.logit)
    ).fit()
    return(model)

与另一位博主(链接见文末)写的向前回归法和本文实现的向后回归法对同一数据集进行训练和预测,主要输出数据和评价指标如下:

迭代过程:

基于AIC评价指标的向后回归法——Python语言实现_第1张图片 向前回归输出的迭代信息
基于AIC评价指标的向后回归法——Python语言实现_第2张图片 向后回归输出的迭代信息

评价指标:

基于AIC评价指标的向后回归法——Python语言实现_第3张图片 向前法和向后法AUC对比

根据输出信息可见,向后回归法比向前回归法迭代次数更多,其最终的结果也优于向前法。统计模型作为一门计算密集型的技术,算力可以决定能使用的算法,从而在很大程度上决定模型效果。

 

附本文参考的向前回归法链接:https://blog.csdn.net/weixin_44835596/article/details/89763300

 

你可能感兴趣的:(统计模型,逻辑回归,python,数据挖掘,机器学习)