阿里云天池大赛——机器学习篇赛题解析(赛题一)下

5.模型验证
5.1模型评估的概念和方法
(1)欠拟合和过拟合
当一个模型恰到好处地表达了数据关系时,我们就认为这个模型拟合效果好。
欠拟合也叫高偏差,是指算法所训练的模型不能完整地表达数据关系。
过拟合也叫高方差,指的是算法所训练的模型过多地表达了数据关系,此时很有可能表达的是数据间的噪声关系。
(2)模型的泛化与正则化
泛化是指机器学习模型学习到的概念在处理训练未遇到过的样本时的表现,即模型处理新样本的能力
正则化(Regularization)是给需要训练的目标函数加上一些规则(限制,惩罚项),目的是为了防止过拟合
L1,L2正则化(L1,L2Regularization)使用的是正则化项是L1范数、L2范数。
其中L1范数,即向量元素绝对值之和,L2范数,即向量元素绝对值平方和再进行开方,L-q范数,即向量元素绝对值的q次幂的累加和再1/q次幂。
在原始的损失函数后添加正则项,可以使模型的泛化能力更强。
对参数空间进行L2范数正则化的线性模型称为岭回归(Ridge Regression),对参数空间进行L1范数正则化的线性模型称为LASSO回归(LASSO Regression)。
岭回归和LASSO回归的不同之处:使用岭回归,很难得到一条斜的直线,LASSO回归更倾向于一条直线。
(3)回归模型的评估指标和调用方法
回归模型的评估有平均绝对值误差、均方误差、均方根误差和R平方值四种方法。
①平均绝对值误差
平均绝对值误差(MAE)是预测值与真实值之差的绝对值
计算MAE代码如下:

from sklearn.metrics import mean_absolute_error
score=mean_absolute_error(y_test,y_pred)

②均方误差
均方误差(MSE)是指参数估计值与参数真实值之差平方的期望值。MSE的值越小,说明预测模型描述实验数据具有越好的精确度。

from sklearn.metrics import mean_squared_error
score=mean_squared_error(y_test,y_pred)

③均方根误差
RMSE是MSE的平方根

from sklearn.metrics import mean_squared_error
Pred_Error=mean_squared_error(y_test,y_pred)
score=Sqrt(Pred_Error)

④R平方值
R平方值(R-Squared)反映了回归模型在多大程度上解释了因变量的变化,或者说模型对观测值的拟合程度如何。

from sklearn.metrics import r2_score
score=r2_score(y_test,y_pred)

(4)交叉验证
交叉验证是验证分类器性能的一种统计分析方法,其基本思想是在某种意义下将原始数据进行分组,一部分作为训练集,另一部分作为验证集。
常用的交叉验证方法包括简单交叉验证、K折交叉验证、留一法交叉验证和留P法交叉验证。
①简单交叉验证
简单交叉验证是将原始数据随机分为两组,一组作为训练集,另一组作为验证集,通常划分30%的数据作为测试数据。

#切分数据集
from sklearn.model_selection import train_test_split #切分数据
#切分数据,训练数据为70%,验证数据为30%
train_data,test_data,train_target,test_target=train_test_split(train,target,test_size=0.3,random_state=0)

②K折交叉验证
K折交叉验证,是将原始数据分成K组(一般是均分),然后将每个子集数据分别做一次验证集,其余的K-1组子集数据作为训练集,将K个模型最终的验证集的分类准确率取平均值,作为K折交叉验证分类器的性能指标。通常设置K大于或等于3(K个子集,每个子集作为一个检验集,其余K-1个子集作为训练集,最后得K个检验集的准确率的平均值)。

from sklearn.model_selection import KFold
#KFold(n_split, shuffle, random_state)
#n_split:要划分的折数,shuffle: 每次都进行shuffle,测试集中折数的总和就是训练集的个数,random_state:随机状态,更多详情查看http://t.zoukankan.com/demo-deng-p-10558186.html
Kf=KFold(n_splits=10)

③留一法交叉验证
留一法交叉验证是指每个训练集由除一个样本之外的其余样本组成留下的一个样本组成检验集,这样,对于N个样本的数据集,可以组成N个不同的训练集和N个不同的检验集,因此LOO-CV会得到N个模型,用N个模型最终的验证集的分类准确率的平均数作为分类器的性能指标(N个样本数据集,N个模型,每次训练N-1个数据作为训练集,留一个作为检验集,最后得N个模型的N个检验集的准确率的平均数)。

from sklearn.model_selection import LeaveOneOut
loo=LeaveOneOut()

④留P法交叉验证
留P法交叉验证与留一法交叉验证类似,是从完整的数据集中删除P个样本,产生所有可能的训练集和检验集,对于N个样本,能产生(N,p)个训练-检验对(每次训练N-p个数据作为训练集,留p个作为检验集)。

from sklearn.model_selection import LeavePOut
lpo=LeavePOut(p=5)

5.2模型调参
(1)调参
调参就是对模型的参数进行调整,以找到使模型性能最优的参数,参数可分为两类:过程影响类参数子模型影响类参数
过程影响类参数就是在子模型不变的前提下,调整“子模型数(n_estimators)”“学习率(learning_rate)”等参数,子模型影响类参数就是调整“最大树深度(max_depth)”“分裂条件(criterion)”等参数,改变子模型的性能。
bagging的训练过程旨在降低方差,而boosting的训练过程旨在降低偏差,过程影响类的参数能够引起整体模型性能的大幅度变化。
(2)网格搜索
在所有候选的参数选择中,通过循环遍历,尝试每一种可能性,表现最好的参数就是最终的结果。
示例

from sklearn.datasets import load_iris
from sklearn.svm import svc
from sklearn.model_selection import train_test_split
iris=load_iris()
X_train,X_test,y_train,y_test=train_test_split(iris.data,
iris.target,
random_state=0)
print("Size of training set:{} size of testing  set:{}".format(
X_train.shape[0],X_test.shape[0])
#### grid search start
best_score=0
for gamma in [0.001,0.01,0.1,1,10,100]:   #定义一个一个gamma参数可选范围
	for C in [0.001,0.01,0.1,1,10,100]:   #定义一个一个C参数可选范围
		#定义支持向量机模型
		svm=SVC(gamma=gamma,C=C) #对于每种参数可能的组合,都进行一次训练
		svm.fit(x_train,y_train)
		score=svm.score(x_test,y_test)
		if score>best_score: #找到表现最好的参数
			best_score=score
			best_parameters={
    
    'gamma':gamma,'c':C}
#### grid search end
print("Best score:{:.2f}".format(best_score))   #打印最高准确率
print("Best parameters{}".format(best_parameters))  #打印表现最好的参数

(3)学习曲线
学习曲线是在训练集大小不同时,通过绘制模型训练集和交叉验证集上的准确率来观察模型在新数据上的表现,进而判断模型方差或偏差是否过高,以及增大训练集是否可以减小过拟合。
如图所示,左图为高偏差,右图为低偏差(图片来源:网络)
在这里插入图片描述(4)验证曲线
和学习曲线不同,验证曲线(或者是复杂度曲线)的横轴为某个超参数的一系列值,由此比较不同参数设置下(而非不同训练集大小,学习曲线的横轴为训练集大小)模型的准确率。
随着超参数设置(超参数就是自己需要手动设置的参数)的改变,模型可能会有从欠拟合到合适再到过拟合的过程,进而可以选择一个合适的设置来提高模型的性能。
学习曲线(图片来源:https://editor.csdn.net/md?articleId=123589781)
在这里插入图片描述
验证曲线(图片来源:https://editor.csdn.net/md?articleId=123589781)在这里插入图片描述
更多关于学习曲线和验证曲线的讲解可看:https://editor.csdn.net/md?articleId=123589781
6.特征优化
可以通过合成特征、对特征做简单变换、用决策树创造新特征、特征组合等方法对特征进行优化。
(1)合成特征
合成特征是指不在输入特征之列,而是从一个或多个输入特征衍生而来的特征。
(通过标准化或缩放单独创建的特征不属于合成特征,属于特征转换,具体请看上篇)
合成特征包括以下类型:
将一个特征与其本身或其他特征相乘(称为特征组合)、两个特征相除、对连续特征分桶(分箱)分为多个区间分箱
(2)特征的简单变换
①数值特征的变换和组合:
多项式特征,比例特征,绝对值,最大值、最小值
②类别特征与数值特征的组合
用N1和N2表示数值特征,用C1和C2表示类别特征,
中位数:median(N1)_by (C1)
算术平均数:mean(N1)_by (C1)
众数:mode(N1)_by (C1)
最小值:min(N1)_by (C1)
最大值:max(N1)_by (C1)
标准差:std(N1)_by (C1)
方差:var(N1)_by (C1)
频数:freq(C2)_by (C1)
(3)用决策树创造新特征
在决策树系列(单棵决策树、GBDT、随机森林)的算法中,由于每一个样本都会被映射到决策树的一片叶子上,因此我们可以把样本经过每一棵决策树映射的自然数或哑编码得到的稀疏矢量作为一项新的特征加入模型中。
(4)特征组合
特征组合是指通过将单独的特征进行组合(相乘或求笛卡尔积)而形成的合成特征,其有助于表示非线性关系。
①对非线性规律进行编码
[A x B]:将两个特征的值相乘形成的特征组合
[A x B x C x D x E]:将五个特征的值相乘形成的特征组合
[A x A]:对单个特征的值求平方形成的特征组合
②组合独热矢量
将独热特征矢量的特征组合视为逻辑连接
③使用分桶特征列训练模型
分桶特征:是以一定方式将连续型数值特征划分到不同的桶(箱)中,可以理解为是对连续型的一种离散化处理方式。(分组)
7.模型融合
模型优化方式:
①研究模型学习曲线,判断模型是否过拟合或者欠拟合并作出相应的调整
②对模型权重参数进行分析,对于权重绝对值高或低的特征,可以进行更细化的工作(调参),也可以进行特征组合(构建新的特征)
③进行Bad-Case分析,针对错误的例子确定是否有地方可以修改挖掘
④进行模型融合或者说是集成学习 ensemble learning
模型融合:即先产生一组个体学习器,再用某种策略将它们结合起来,以加强模型效果。
模型融合提升技术可以分为两类:
①个体学习器间不存在强依赖关系可同时生成的并行化方法,代表是Bagging方法随机森林
②个体学习器间存在强依赖关系必须穿行生成的序列化方法,代表是Boosting方法
7.1模型融合提升技术
(1)Bagging方法和随机森林
Bagging方法是从训练集中抽样得到每个基模型所需要的子训练集,然后对所有基模型预测的结果进行综合,产生最终的预测结果。
Bagging方法采样的是自助采样法
Bagging特点:样本数据均匀随机有放回的选取、分类器取均值。
随机森林式对Bagging方法的改进,改进之处有两点:基本学习器限定为决策树(n_estimators);除了在Bagging的样本上加上扰动,在属性上也加上扰动(random_state),相当于在决策树学习的过程中引入了随机属性选择。
随机森林示例代码:

from sklearn.metrics import mean_squared_error #评价指标
from sklearn import ensemble  #引入sklearn集成学习模型
#定义随机森林模型
clf=ensemble.RandomForestRegressor(n_estimators=200, random_state=1234)   #200棵树,扰动属性1234
#将训练集的自变量和因变量代入到随机森林模型中训练
clf.fit(train_data,train_target)
#将测试集的因变量代入随机森林模型中得到测试集的预测值
test_pred=clf.predict(test_data) 
#得到本次模型准确率得分
score=mean_squared_error(test_target,test_pred)
print("RandomForestRegressor: ",score)

(2)Boosting方法
Boosting方法的训练过程为阶梯状,即基模型按次序一一进行训练(实现上可以做到并行),基模型的训练集按照某种策略每次进行一定的转换,然后对所有基模型预测的结果进行线性综合,产生最终的预测结果。
Boosting方法中著名的算法有AdaBoost算法和提升树(Boosting Tree)系列算法,应用最广泛的是梯度提升树。
梯度提升树示例代码:

from sklearn.metrics import mean_squared_error #评价指标
from sklearn import ensemble  #引入sklearn集成学习模型
#定义GBDT模型
clf=ensemble.GradientBoostingRegressor(n_estimators=200, random_state=1234)  #200棵树,扰动属性1234
#将训练集的自变量和因变量代入到GBDT模型中训练
clf.fit(train_data,train_target)
#将测试集的因变量代入GBDT模型中得到测试集的预测值
test_pred=clf.predict(test_data) 
#得到本次模型准确率得分
score=mean_squared_error(test_target,test_pred)
print("GradientBoostingRegressor: ",score)

更多更具体的集成学习模型可看:https://blog.csdn.net/u013166817/article/details/84913372
7.2预测结果融合策略
(1)Voting
Voting(投票机制)分为软投票和硬投票两种,其原理采用少数服从多数的思想,此方法可用于解决分类问题。
硬投票:对多个模型直接进行投票,最终投票数最多的类为最终被预测的类。
软投票:和硬投票原理相同,其增加了设置权重的功能,可以为不同模型设置不同权重,进而区别模型不同的重要度。
(2)Averaging和Ranking
Averaging:将模型结果的平均值作为最终的预测值,也可以使用加权平均的方法。
Ranking的思想与Averaging的一致,这里采用把排名平均的方法,如果有权重,则求出n个模型权重比排名之和,即为最后的结果。
(3)Blending
Blending是把原始的训练集先分成两部分,如70%的数据作为新的训练集,剩下的30%的数据作为测试集。
(4)Stacking
Stacking的基本原理是利用训练好的所有基模型对训练集进行预测,将第j个基模型对第i个训练样本的预测值作为新的训练集中第i个样本的第j个特征值,最后基于新的训练集进行训练。
7.3其他提升方法
通过对权重或者特征重要性的分析,可以准确找到重要的数据和字段及相关的特征方向,并可以朝着此方向继续细化,同时寻找这个方向更多的数据,还可以做相关的特征组合,这些都可以提高模型的性能。
通过Bad-Case分析,可以有效找到预测不准确的样本点,进而回溯分析数据,寻找相关的原因,从而找到提高模型精度的方法。

猜你喜欢

转载自blog.csdn.net/weixin_47970003/article/details/123589781