5.3 Ridge回归 lasso 回归

1.原理

  • 线性回归,如果数据不满秩,以及存在多重共线性无法求解,通过L1正则项(lasso)和L2正则项(Ridge)的方式可以求解。

不满秩(针对方阵来说)
一个M*M的方阵,M为阶。方阵经过初等行变换得到的非0行的个数,叫秩。
初等行变换:任意1行和另一行的线性组合,能否等于0.

如:
a1 + b2 + c3 = 1
a
2 + b3 + c4 = 3
a2 + b4 + c*6 = 2

X W y
1 2 3 w1 1
2 3 4 w2 3
2 4 6 w3 2
此时X为不满秩矩阵,无法求解,因为2行等同,3个未知数,2个公式,无法求解。

  • 解决不满秩,多重共线性无法求解的必要性
    因为任何样本数据必然具有如下特点:
    1.存在噪声
    2.多重共线性
    而且都是无法避免的

解决多重共线性的问题:
角度一: 算法的角度(正则项)

角度二: 从数据集的角度(主要的解决思路,最有效果)

2. 原理

2.1 岭回归原理

image.png

image.png
  • 加入正则项系数λ
    作用:
  • 1.增加偏差(对样本数据)# 因为直接在数据里加
    1. 减小方差(最小二乘法,预测值和真实值) # 加了正则项后,会经过最小二乘求w。
  • 3.缩减算法: 减少无用特征的影响系数w --> 0
    0*(门牌号+5) 100 eg. 缩减的作用:减少过拟合的影响
  • 过拟合:模型对训练集的局部特征(个别特征)过分关注导致的

y = f(x) + bias + 正则项
正则项解决了1.矩阵不可求逆 2. 可能会降低噪声的影响

2.2 lasso回归原理

image.png

此时100收入 4身高 1地域 0.005电话号 0.01学历 性别
如果将系数和压缩为1,电话号,学历等不重要的系数压缩到近似0了。

3. Ridge回归(岭回归)

3.1 导包,获取特征向量和标签

import numpy as np
X = np.array([[1,2,3,4],[1,3,8,5]])
y = np.array([3,5])

3.2 线性回归和岭回归训练和预测

from sklearn.linear_model import LinearRegression, Ridge
lr = LinearRegression()
lr.fit(X, y)

alpha=1.0 正则项系数
Ridge回归是一个二阶正则项
ridge = Ridge(alpha=1.0)
ridge.fit(X, y)

3.3 获取线性回归的系数和截距

lr.coef_ # 可以通过系数得到各因素的相关性,越大越相关
得到系数array([-5.55111512e-17, 7.40740741e-02, 3.70370370e-01, 7.40740741e-02])

ridge.coef_
得到系数array([0. , 0.06896552, 0.34482759, 0.06896552])

lr.intercept_
得到截距1.4444444444444446
ridge.intercept_
得到截距
1.6206896551724137

4.糖尿病回归分析 (用coef做特征选择)

4.1 导入数据

from sklearn.datasets import load_diabetes

diabetes = load_diabetes()
train = diabetes.data
target = diabetes.target
feature_names = diabetes.feature_names

from pandas import Series, DataFrame
import matplotlib.pyplot as plt
%matplotlib inline

4.2 样本拆分和建模

ridge = Ridge(alpha=1.0) # alpha: 正则项系数

from sklearn.model_selection import train_test_split
X_train ,X_test, y_train, y_test = train_test_split(train, target, test_size=0.2)
ridge.fit(X_train, y_train)

4.3 用系数来表达各个特征对目标的影响

作用:可以根据这个影响的大小来进行特征选择

ridge.coef_
结果:array([ 37.29797438, -74.32803746, 268.00587006, 184.48450326,
10.94253264, -17.99804142, -140.57373159, 134.43872109,
235.1393054 , 124.84227642])

4.4 展示系数

image.png

import seaborn as sns
sns.set()

importances = Series(data=ridge.coef_, index=feature_names)
importances.plot(kind='bar')
plt.xticks(rotation=0) # 将横坐标标签方向调整
plt.show()

image.png
  • 将系数绝对值化并排序展示

importances = Series(data=np.abs(ridge.coef_), index=feature_names).sort_values(ascending=False)
importances.plot(kind='bar')
plt.xticks(rotation=0)
plt.show()

image.png

根据特征的重要性,我们发现前7个特征更加重要,所以选择前6个特征重新建模

["sex", "bmi", "bp", "s3", "s4", "s5", "s6"]

4.5 重新建模

4.5.1 获取特征向量和标签

importance_columns = ["sex", "bmi", "bp", "s3", "s4", "s5", "s6"]
dataSets = DataFrame(data=train, columns=feature_names)
dataSets.head()


image.png
  • 获取重要列数据
    X = dataSets[importance_columns]
    X.head()


    image.png
  • 获取特征向量和标签 拆分数据集

y = target
做过特征选择的数据进行拆分
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=1)

4.5.2 建模并训练评价

ridge = Ridge(alpha=1.0) # 构造岭回归算法对象
ridge.fit(X_train, y_train) # 训练

from sklearn.metrics import mean_squared_error
mean_squared_error(y_test, ridge.predict(X_test))#得到预测结果的 平均平法误差(均方误差)# 2470.843375403734

构造线性回归模型并训练评价
linear = LinearRegression()
linear.fit(X_train, y_train)
mean_squared_error(y_test, linear.predict(X_test)) # 3080.257052972188

4.5.3 比较没做过特征选择的数据集

X_train1 ,X_test1, y_train1, y_test1 = train_test_split(train, target, test_size=0.2, random_state=1) # 样本集拆分

linear = LinearRegression() # 构造线性回归算法对象
linear.fit(X_train1, y_train1) # 用训练数据训练算法对象

mean_squared_error(y_test1, linear.predict(X_test1))# 得到真实值和预测值的均方误差 #2992.5576814529454

Ridge、LienarRegression 的系数可以用来做特征选择

5. 数据建模

核心:数据质量(特征工程) 其次:算法选择和调参

特征工程(目的:让模型可以得到一个更好的数据集)

  • 特征选择 (基于算法的选择 ,常用的算法 基于线性回归的模型, 基于决策树的模型)
  • 特征提取 (基于经验提取)
  • 无量纲处理 (标准正态分布)
  • 分箱操作
  • 空值填充
  • 异常值过滤

6. lasso回归

6.1 导包,获取特征向量和标签

from sklearn.linear_model import Lasso, Ridge, LinearRegression
import numpy as np

X = np.array([[1,2,3,4,5], [2,3,2,1,7]])
y = np.array([1,2])

6.2 数据建模

lasso = Lasso(alpha=0.001) # alpha正则项系数
lasso.fit(X, y)

lasso.coef_ # 获取系数 array([ 0. , 0. , -0. , -0.33288889, 0. ])

ridge = Ridge(alpha=0)
ridge.fit(X, y)
ridge.coef_ # 系数:array([ 0.0625, 0.0625, -0.0625, -0.1875, 0.125 ])

linear = LinearRegression()
linear.fit(X, y)
linear.coef_ # 系数:array([ 0.0625, 0.0625, -0.0625, -0.1875, 0.125 ])

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

推荐阅读更多精彩内容