关于回归算法(浅入)
一、下图是目前学习要涉及的模型分类,仅作参考(正在学习中)
根据数据集的特征选择合适的模型,对模型进行调参(RandomizedSearchCV和GridSearchCV)优化,一个模型的预测不准时还可以用平均模型集成法(并行模型)和堆叠模型集成法(串行模型)来组合预测(整个过程学习需要大量时间打磨的)
二、部分具体代码
下面是lasso、KRR、ENet、GBR、XGBR五种回归模型的建模(仅包含导入工具包、设置模型对象,5折交叉验证fit模型计算均方根误差;不包含数据的清洗和处理(因为代码多));因为数据本身多重共线,所以采用这五种模型
##-------------------------导入工具包-----------------------
from sklearn.pipeline import make_pipeline #级联其他函数的工具
from sklearn.preprocessing import RobustScaler #自动处理离群点的函数
from sklearn.linear_model import ElasticNet,Lasso #弹性回归和套索回归
from sklearn.kernel_ridge import KernelRidge #核岭回归
from sklearn.ensemble import GradientBoostingRegressor #梯度提升回归
import xgboost as xgb #xgb包中包括极端梯度提升模型
#自定义的集成模型类需要继承sklearn中的三个类:估计器的基类;转换器的混合类;回归估计器的混合类;clone是产生克隆估计器的函数
from sklearn.base import BaseEstimator,TransformerMixin,RegressorMixin,clone
#用于划分数据集、计算模型得分的函数
from sklearn.model_selection import KFold,cross_val_score,train_test_split
## -------------------建立5个回归模型----------------------
# lasso模型是在线性回归模型的基础上加入了L1正则化的回归方法
#alpha代表正则化惩罚力度,random_state指随机种子
# 正则化项为alpha*||w||_1
Lasso = Lasso(alpha =0.0005, random_state=0)
#KernelRidge带有核函数的岭回归,岭回归也是在线性回归模型的基础上加入了L2正则化的回归方法
#alpha代表正则惩罚力度
#正则化项为0.5*alpha*||w||^2_2
#Kernel='polynomial'指核函数的类型为多项核函数,K(x,xi)=((x*xi)+R)的d次方,degree指poly核中参数d
KRR = KernelRidge(alpha=0.6, kernel='polynomial', degree=2)
# ElasticNet是套索回归和岭回归的混合模型,同时引入了L1和L2正则化项
#alpha代表正则化惩罚力度,random_state指随机种子
#正则化项为alpha*l1_ratio*||w||_1+0.5*alpha*(1-l1__ratio)*||w||^2_2
ENet = ElasticNet(alpha=0.0005, l1_ratio=.9, random_state=0)
#GradientBoostingRegressor梯度提升回归,是一种集成回归算法
#n_estimators值是弱学习器的数目,learning_rate值是学习率,max_depth指每个学习器的最大深度
#max_features特征子集中特征个数、max_features='sqrt'代表取特征值总数的开方;random_state指随机种子
GBR = GradientBoostingRegressor(n_estimators=3000, learning_rate=0.05,
max_depth=4, max_features='sqrt', random_state =0)
#XGBRegressor极端梯度提升回归,是在梯度提升回归基础上经过优化的集成回归算法
#n_estimators代表指弱学习器的数目,learning_rate指学习率,max_depth指树的最大深度
#reg_alpha指权重的L1正则化项;reg_lambda指权重的L2正则化项
XGBR = xgb.XGBRegressor(n_estimators=2200,learning_rate=0.05, max_depth=3,
reg_alpha=0.4640, reg_lambda=0.8571)
##------------------fit模型并进行交叉验证求均方根误差-------------
n_folds = 5 #将数据集分为5组,每一组都分别做一次test集,其余4组作train集,最终验证5次
def rmse_cv(model):
#划分交叉验证需要用到的数据集
kf = KFold(n_folds, shuffle=True, random_state=0).get_n_splits(train.values)
# 交叉验证(代解模型)计算均方差回归损失,返回值是负值,故要在函数外添加负号,再开平方,得到均方根误差
rmse= np.sqrt(-cross_val_score(model, train.values, y_train, scoring="neg_mean_squared_error", cv = kf))
return(rmse) #返回的是一列多个交叉验证的结果
##-------------------计算各模型的得分------------------------
score_lasso = remse_cv(Lasso)
print("Lasso's score:%.4f(%.4f)\n"%(score_lasso.mean(),score_lasso.std()))
score_KRR = remse_cv(KRR)
print("KRR's score:%.4f(%.4f)\n"%(score_KRR.mean(),score_KRR.std()))
score_ENet = remse_cv(ENet)
print("ENet's score:%.4f(%.4f)\n"%(score_ENet.mean(),score_ENet.std()))
score_GBR = remse_cv(GBR)
print("GBR's score:%.4f(%.4f)\n"%(score_GBR.mean(),score_GBR.std()))
score_XGBR = remse_cv(XGBR)
print("XGBR's score:%.4f(%.4f)\n"%(score_XGBR.mean(),score_XGBR.std()))
更深入的以后的博客会涉及,LEARNING