目录
1.如何选择回归分析算法
2.python回归分析
3.相关知识点
1.如何选择回归分析算法
回归分析算法按照自变量的个数分为一元回归和多元回归,按照影响是否线性分为线性回归和非线性回归。在面对不同回归方法的选择时,可参考以下因素:
(1)入门的开始:简单线性回归,适合数据集本身结构简单、分布规律有明显线性关系的场景。
(2)如果自变量数量少或经过降维后得到了可以使用的二维变量(包括预测变量),那么可以直接通过散点图发现自变量和因变量的相互关系,然后选择最佳回归方法。
(3)如果经过基本判断发现自变量间有较强的共线性关系,那么可以使用多重共线性(自变量高度相关)能灵活处理的算法,例如岭回归。
(4)如果数据集噪音较多,推荐使用主成分回归,因为主成分回归通过对参与回归的主成分的合理选择,可以去掉噪音。另外,各主成分间相互正交,能解决多元线性回归中的共线性问题。这些都能有效地提高模型的抗干扰能力。
(5)如果在高维度变量下,使用正则化回归方法效果更好,例如Lasso,Ridge和ElasticNet,或者使用逐步回归从中挑选出影响显著的自变量来建立回归模型。
(6)如果要同时验证多个算法,并想从中选择一个来做拟合,使用交叉验证做多个模型的效果对比,并通过R-square、Adjust R-square、AIC、BIC以及各种残差、误差项指标做综合评估。
(7)如果注重模型的可解释性,那么容易理解的线性回归,指数回归,对数回归,二项式或多项式回归要比核回归、支持向量机回归等更适合。
(8)集成或组合回归方法。一旦确认了几个方法,但又不确定如何取舍时,可以将多个回归模型做集成或组合方法使用,即同时将多个模型的结果通过加权、均值等方式确定最终输出结果值。
2.python回归分析
1.导入库
import numpy as np
from sklearn.linear_model import BayesianRidge,LinearRegression,ElasticNet
from sklearn.svm import SVR
from sklearn.ensemble import GradientBoostingRegressor
from sklearn.model_selection import cross_val_score
from sklearn.metrics import explained_variance_score,mean_absolute_error,mean_squared_error,r2_score
import pandas as pd
import matplotlib.pyplot as plt
2.数据准备
raw_data=np.loadtxt('F:\\小橙书\\chapter4\\regression.txt')
x=raw_data[:,:-1]
y=raw_data[:,-1]
3.训练回归模型
n_folds=6 #设置交叉验证的折数
model_br=BayesianRidge() #贝叶斯岭回归
model_lr=LinearRegression() #普通线性回归
model_etc=ElasticNet() #弹性网络回归
model_svr=SVR() #支持向量机回归
model_gbr=GradientBoostingRegressor() #梯度提升增强回归
model_names=['BayesianRidge','LinearRegression','ElasticNet','SVR','GradientBoostingRegressor']
model_dic=[model_br,model_lr,model_etc,model_svr,model_gbr]
cv_score_list=[] #交叉验证结果列表
pre_y_list=[] #各个回归模型预测的y值列表
for model in model_dic:
scores=cross_val_score(model,x,y,cv=n_folds)
cv_score_list.append(scores)
pre_y_list.append(model.fit(x,y).predict(x))
4.模型效果指标评估
n_samples,n_features=x.shape #总样本量,总特征数
model_metrics_name=[explained_variance_score,mean_absolute_error,mean_squared_error,r2_score] #回归评估指标
model_metrics_list=[]
for i in range(5):
tmp_list=[]
for m in model_metrics_name:
tmp_score=m(y,pre_y_list[i])
tmp_list.append(tmp_score)
model_metrics_list.append(tmp_list)
5.建立交叉验证数据框
df1=pd.DataFrame(cv_score_list,index=model_names)
df1
0 | 1 | 2 | 3 | 4 | 5 | |
BayesianRidge | 0.662422 | 0.677081 | 0.549704 | 0.776898 | -0.139739 | -0.024450 |
LinearRegression | 0.642240 | 0.611521 | 0.514471 | 0.785033 | -0.143673 | -0.015390 |
ElasticNet | 0.582476 | 0.603773 | 0.365912 | 0.625645 | 0.437122 | 0.200454 |
SVR | 0.107813 | 0.035915 | -0.716843 | -0.199428 | 0.070459 | 0.002875 |
GradientBoostingRegressor | 0.747219 | 0.804197 | 0.768294 | 0.863270 | 0.379211 | 0.557349 |
6.建立回归指标的数据框
df2=pd.DataFrame(model_metrics_list,index=model_names,columns=['EV','MAE','MSE','R2'])
df2
EV | MAE | MSE | R2 | |
BayesianRidge | 0.731143 | 3.319202 | 22.696750 | 0.731143 |
LinearRegression | 0.740608 | 3.272945 | 21.897779 | 0.740608 |
ElasticNet | 0.686094 | 3.592915 | 26.499828 | 0.686094 |
SVR | 0.260918 | 5.260016 | 66.819671 | 0.208481 |
GradientBoostingRegressor | 0.975126 | 1.151773 | 2.099835 | 0.975126 |
通过结果可以看出,梯度提升回归是所有模型中拟合效果最好的,表现在能解释97%的方差变化,并且各个误差项的值都是最低的。另外,还有一个重要因素是,梯度提升算法在测试的6次中,其结果相对稳定性较高,这也说明了该算法在应对不同数据集的稳定效果。指标中r2根EV的值相同,原因是r2作为判定系数,本身就是解释方差的比例,含义相同。
7.模型效果可视化
plt.figure(figsize=(15,8))
plt.plot(np.arange(x.shape[0]),y,color='k',label='y_true')
color_list=['r','b','g','y','c']
linestyle_list=['-','-.',':','-.','-']
for i,pre_y in enumerate(pre_y_list):
plt.plot(np.arange(x.shape[0]),pre_y,color=color_list[i],linestyle=linestyle_list[i],label=model_names[i])
plt.title('regression result comparison')
plt.legend(loc='upper right')
plt.ylabel('real and predicted value')
plt.show()
3.相关知识点
1)cross_val_score是sklearn.model_selection中的交叉验证工具,可以对特定算法模型进行交叉检验。常用参数:sklearn.model_selection.cross_val_score(estimator,x,y=None,group=None,scoring=None,cv=None,n_jobs=1,verbose=0,fit_params=None,pre_dispatch='2*n_jobs')
estimator: 要应用交叉验证的模型对象,该模型在交叉验证中会通过使用fit方法来训练模型。
x,y:交叉验证的数据集x和目标y,其中x至少是二维数据
cv:要进行交叉验证的模式。如果cv值为空,那么默认使用3折交叉检验,如果cv值是整数,那么使用指定的数量做交叉检验。
cross_val_score交叉检验后返回的得分默认调用算法模型的score方法做得分估计,因此使用不同的算法模型其得分计算方法可能有差异,具体取决于模型本身的score方法的计算逻辑。当然,也可以通过设置scoring参数字符串来手动指定得分计算方法。常用scoring方法如下表:
scoring方法 | 应用算法 | 调用函数 | 备注 |
accuracy | 分类 | metrics.accuracy_score | |
average_precision | 分类 | metrics.average_precision_score | |
f1 | 分类 | metrics.f1_score | 二分类 |
f1_micro | 分类 | metrics.f1_score | 微平均F1值 |
f1_macro | 分类 | metrics.f1_score | 宏平均F1值 |
f1_weighted | 分类 | metrics.f1_score | 加权平均F1值 |
f1_samples | 分类 | metrics.f1_score | 通过多标签样本 |
neg_log_loss | 分类 | metrics.log_loss | 需要算法对象有predict_proba方法支持 |
precision | 分类 | metrics.precision_score | |
recall | 分类 | metrics.recall_score | |
roc_auc | 分类 | metrics.roc_auc_score | |
adjusted_rand_score | 聚类 | metrics.adjusted_rand_score | |
neg_mean_absolute_error | 回归 | metrics.mean_absolute_error | |
neg_mean_squared_error | 回归 | metrics.mean_squared_error | |
neg_median_absolute_error | 回归 | metrics.median_absolute_error | |
r2 | 回归 | metrics.r2_score |
explained_variance_score:解释回归模型的方差得分,取值范围为[0,1],越接近1说明自变量越能解释因变量的方差变化,值越小说明效果越差。
3)mean_absolute_erroe:平均绝对误差(Mean Absolute Error ,MAE),用于评估预测结果和真实数据集的接近程度,其值越小说明拟合效果越好。
4)mean_square_error:均方差(Mean Square Error ,MSE),该指标计算的是拟合数据和原始数据对应样本点的误差的平方和的均值,其值越小说明拟合效果越好。
5)r2_score:判定系数,其含义也就是解释回归模型的方差得分,取值范围为[0,1],越接近1说明自变量越能解释因变量的方差变化,值越小说明效果越差。