【Python】逐步回归

【参考】

1.  https://datascience.stackexchange.com/questions/937/does-scikit-learn-have-forward-selection-stepwise-regression-algorithm

2. 特征工程(一):前向逐步回归(R语言):https://zhuanlan.zhihu.com/p/31614564

 

【代码】

1.向前逐步回归

备注:以下使用的评估模型效果的方法为AIC/BIC;


def forward_selected(data, target, method):
    '''
    向前逐步回归:
	1. 遍历属性的一列子集,选择使模型效果最好的自变量。
	2. 接着寻找与其组合效果最好的第二个自变量,而不是遍历所有的两列子集。
	3. 以此类推,每次遍历时,子集都包含上一次遍历得到的最优子集。这样,每次遍历都会选择一个新的自变量添加到特征集合中,直至特征集合中特征个数不能再增加。
    参数说明:
    data:dataframe数据集;
    target:因变量名;
    method:评估模型效果的方法。(这里选用的是aic/bic,越小越好)
    '''
    variate = set(data.columns) 
    variate.remove(target)  # 原始自变量集
    selected = [] # 最终自变量集
    current_score, best_new_score = float('inf'), float('inf')  # 设置分数的初始值为无穷大(因为aic/bic越小越好)
    # 循环筛选变量
    while variate:
        score_with_variate = [] # 记录遍历过程的分数
		# 遍历自变量
        for candidate in variate:  
            formula = "{}~{}".format(target,"+".join(selected+[candidate]))  # 组合
            if method == 'AIC':
                score = smf.ols(formula=formula, data=data).fit().aic 
            else:
                score=smf.ols(formula=formula, data=data).fit().bic 
            score_with_variate.append((score, candidate))  
        score_with_variate.sort(reverse=True)  # 降序后,取出当前最好模型分数
        best_new_score, best_candidate = score_with_variate.pop()  
        if current_score > best_new_score:  # 如果当前最好模型分数 优于 上一次迭代的最好模型分数,则将对于的自变量加入到selected中
            variate.remove(best_candidate)
            selected.append(best_candidate)  
            current_score = best_new_score  
            # print("score is {},continuing!".format(current_score))  
        else:
            # print("for selection over!")
            break
    formula = "{}~{}".format(target,"+".join(selected))  
    # print("final formula is {}".format(formula))
    model = smf.ols(formula=formula, data=data).fit()
    
    return(model)

 

你可能感兴趣的:(Python)