【python+机器学习(4)】多维数据的特征选取(Ridge&&Lasso)

欢迎关注哈希大数据微信公众号【哈希大数据】

在之前我们介绍了直接使用线性回归进行波士顿房价的预测,但是预测准确率仅有60%左右。预测准确率不高一方面是我们未对数据进行一定的预处理(包括归一化和标准化等),这样不能确保在使用优化方式时,对不同特征参数起到同样的影响。 其次是未深入挖掘数据特征间关系,比如当原始数据某些特征与目标值不具有线性关系时,不应当纳入训练模型中。而且数据特征之间可能存在共线性等其他问题,不完全适合使用线性回归模型进行拟合。
因此,本节我们将介绍Ridge Regression(岭回归)和Lasso Regression(拉索回归),进行波士顿房价数据集中的特征选取和共线性问题的处理,从而更加准确的构建模型实现房价预测。

算法理论介绍

机器学习机制回顾

在之前Linear Regression普通线性回归的应用中(忘记的小伙伴可拉到文末查看线性回归详情内容),我们的输入数据是具有13个特征属性的波士顿房价数据集。

回归模型的构建就是实现这13个特征属性值的线性加权之和,用于与实际的房价进行拟合。
image

然后通过机器学习功能来训练数据集进而获取该模型的参数也就是每个特征属性之前的权值系数(即权值a的确定)。

机器学习是如何得到权值呢?是通过定义的一个损失函数,实现将训练数据代入我们模型的预测房价和真实房价的差的平方,然后再将这些平方求和,即普通最小二乘法。
image

因此求权值a的问题,就成了损失函数求和的最小化的最优化问题。
通过一定的理论推导可以得知权值系数实际为(特征属性值的广义逆):
image

而且普通的线性回归算法可以直接训练得到该结果进而实现对房价的预测。

但是,直接使用普通的线性回归模型,当训练样本数量过少,甚至少于样本维数(仅有12条房屋数据),这样将导致特征数据矩阵无法求逆,则不能完成参数a的估计;其次如果样本特征中存在大量相似的特征(即样本属性之间存在共线性关系),将会导致很多权重所代表的意义重复,使原本简单高效的模型复杂化。

因此希望可以对参数a的计算时提供某种约束(增加一个惩罚因子),只保留具有共线性的一个特征属性值,而实现特征数据的缩减同时解决过拟合的问题,岭回归和拉索回归恰好可以解决该问题。

下面来详细了解一下岭回归和拉索回归的相关理论和python实现。
岭回归 Ridge

在出现普通线性回归无法解决的问题时,可以在原来加一个小扰动值λI
image

,其中I为对角矩阵
image

,可以对特征属性的权重计算进行一定约束,形象的称加入的对角矩阵I为岭。当λ越大,惩罚约束作用就越大,而原始数据对回归求取参数的作用就会减小,λ为0时也就是普通的线性回归算法。如果给λ指定一个合适的值,就能在一定意义上解决过拟合的问题(原先过拟合的特别大或者特别小的参数会被约束到正常取值但不会为零)。可以通过多次调试寻找较优的λ值,也就是当λ调整到获取的参数值稳定时即可。

因此岭回归可以初步解决特征权值参数a的动态调整(普通线性回归是无偏估计的唯一值),进而缓解过拟合的问题(尽可能找到不同 特征与目标值的具体关系)。
拉索回归 Lasso

岭回归可以动态调整特征属性的权重参数,进而使得模型更加契合实际情况,充分解释不同特征对目标值的影响力,但是其只能将具有线性相关的相似特征属性的权重降低却不能完全剔除。

拉索回归与岭回归类似也是加入了一个扰动项,其使用的惩罚项对角矩阵而是可以实现特征选择的收缩惩罚性:
image

,可以保证当λ充分大时可以把某些特征属性的权重精确地收缩到0,也就是在模型中剔除了该特征属性,从而从大量特征数据中挑选出。该方法的两大好处:一方面剔除噪声特征(也就是房价不受其影响的特征),其次可以消除具有线性相关关系的不同属性(会造成模型的不稳定,原因在之后做具体介绍)。

除此以外,岭回归中的约束因子λ需要手动调试,而在拉索回归算法中,可以实现λ参数的交叉验证,而寻找使得误差最小的λ的取值,使用交叉检验的训练方法可以进一步提高模型的科学性和准确性。
python实现
Ridge python
同样使用scikit-learn库中的包实现该算法,岭回归算法实现的部分代码如下:
from sklearn.linear_model import Ridge

岭回归模型的导入

ridge = Ridge(alpha=float('{}'.format(i))).fit(house_price_train_X,house_price_train_y)# 默认的lamda的参数为i

岭回归模型训练的准确率

predict_result_ridge = ridge.predict(house_price_test_X)
predict_result_ridge1 = ridge.score(house_price_train_X, house_price_train_y)
predict_result_ridge0 = ridge.score(house_price_test_X, house_price_test_y)
print('岭回归惩罚参数为 {} ,训练集的准确率:'.format(i),predict_result_ridge1)
print('岭回归惩罚参数为 {} ,测试集的准确率:'.format(i), predict_result_ridge0)
Lasso python
普通拉索回归算法实现的部分代码如下:

普通拉索回归模型的导入

from sklearn.linear_model import Lasso
lasso = Lasso(alpha=np.float('{}'.format(i)) ,max_iter=1000000).fit(house_price_train_X, house_price_train_y) # 默认的lamda的参数为i

拉索模型训练的准确率

predict_result_lasso = lasso.predict(house_price_test_X)
predict_result_lasso1 = lasso.score(house_price_train_X, house_price_train_y)
predict_result_lasso0 = lasso.score(house_price_test_X, house_price_test_y)
print('拉索回归惩罚参数为 {} ,训练集的准确率:'.format(i), predict_result_lasso1)
print('拉索回归惩罚参数为 {} ,测试集的准确率:'.format(i), predict_result_lasso0)
print('拉索回归惩罚参数为 {},使用的特征属性有:{}'.format(i,np.sum(lasso.coef_ != 0))
交叉验证的拉索回归算法实现的部分代码如下:

实现交叉检验拉索回归模型的导入

from sklearn.linear_model import LassoCV
lasso_cv = LassoCV(alphas=np.logspace(-3,1,2,50) ,max_iter=1000000).fit(house_price_train_X, house_price_train_y) # 默认的lamda的参数为i

交叉检验拉索模型训练的准确率

predict_result_lasso_cv = lasso_cv.predict(house_price_test_X)
predict_result_lasso_cv1 = lasso_cv.score(house_price_train_X, house_price_train_y)
predict_result_lasso_cv0 = lasso_cv.score(house_price_test_X, house_price_test_y)
print('交叉检验拉索回归 训练集的准确率:', predict_result_lasso_cv1)
print('交叉检验拉索回归 测试集的准确率:', predict_result_lasso_cv0)


image.png

预测对比结果
1、当设置惩罚参数为0时会提示建议使用回归模型。2、当惩罚参数不同时,lasso算法选数据特征属性个数是不同的。3、如果惩罚参数设置过大,则无法进行预测。4、也因数据自身特征,三种方式的预测准确率相差不大。可以提示我们在训练不同数据时,要针对性的选用不同模型。(源码请直接通过给后台发消息获取哦!)

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 160,108评论 4 364
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,699评论 1 296
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 109,812评论 0 244
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,236评论 0 213
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,583评论 3 288
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,739评论 1 222
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,957评论 2 315
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,704评论 0 204
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,447评论 1 246
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,643评论 2 249
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,133评论 1 261
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,486评论 3 256
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,151评论 3 238
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,108评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,889评论 0 197
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,782评论 2 277
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,681评论 2 272

推荐阅读更多精彩内容