机器学习——多元线性回归升维

机器学习升维

    • 升维
    • 使用sklearn库实现特征升维
    • 实现天猫年度销量预测
    • 实现中国人寿保险预测

升维

定义:将原始的数据表示从低维空间映射到高维空间。在线性回归中,升维通常是通过引入额外的特征来实现的,目的是为了更好地捕捉数据的复杂性,特别是当数据之间的关系是非线性的时候。

目的:解决欠拟合问题,提高模型的准确率。为解决因对预测结果考虑因素比较少,而无法准确计算出模型参数问题。

常用方法:将已知维度进行自乘(或相乘)来构建新的维度。

本文主要记录的是线性回归中遇到数据呈现非线性特征时,该如何处理!

切记:对训练集特征升维后也要对测试集、验证集特征数据进行升维操作

数据准备如下:

在这里插入图片描述

如果对其直接进行线性回归,则拟合后的模型如下:

在这里插入图片描述

从上述两图可知,对于具有非线性特征的图像,不对其使用特使的处理,则无法对其产生比较好的模型拟合。

上述图像生成代码:

# 导包
import numpy as np
import matplotlib.pyplot as plt
from sklearn.linear_model import LinearRegression
# 创建数据
X = np.linspace(-1,11,100)
y = (X - 5)**2 + 3*X + 12 + np.random.randn(100)
X = X.reshape(-1,1)
# display(X.shape,y.shape)
plt.scatter(X,y)

# 不升维直接用线性回归解决
model = LinearRegression()
model.fit(X,y)
X_test = np.linspace(-2,12,300).reshape(-1,1)
y_test = model.predict(X_test)
plt.scatter(X,y)
plt.plot(X_test,y_test,color = 'red')

为了使得可以对具有非线性特征的数据进行处理,生成一个较好的模型,可是实现预测的任务,于是便有了升维操作,下举例升维和不升维的区别:

不升维:二维数据x1, x2若不对其进行升维操作,则其拟合的多元线性回归公式为:
y = w 1 ∗ x 1 + w 2 ∗ x 2 + w 0 y = w_1*x_1 + w_2*x_2 + w_0 y=w1x1+w2x2+w0

升维:若对二维数据x1,x2进行升维操作,则其可有5个维度(以自乘为例):x1、x2、x12,x22、x1*x2,在加上一个偏置项w0,一共有六个参数,则其拟合后的多元线性回归公式为:
y = w 0 + w 1 ∗ x 1 + w 2 ∗ x 2 + w 3 ∗ x 1 2 + w 4 ∗ x 2 2 + w 5 ∗ x 1 ∗ x 2 y= w_0+w_1*x_1+w_2*x_2+w_3*x_1^2+w_4*x_2^2+w_5*x_1*x_2 y=w0+w1x1+w2x2+w3x12+w4x22+w5x1x2

若这样,则由原本的一维线性方程转换成了二维函数(最直观的表现),则原本的数据集则可以拟合成下图所示的模型:

在这里插入图片描述

上图生成代码如下:

# 导包
import numpy as np
import matplotlib.pyplot as plt
from sklearn.linear_model import LinearRegression
X = np.linspace(-1,11,100)
y = (X - 5)**2 + 3*X + 12 + np.random.randn(100)
X = X.reshape(-1,1)

# 升维,可以解决多项式的问题,直观表现为可以让直线进行拐弯
np.set_printoptions(suppress=True)
X2 = np.concatenate([X,X**2], axis= 1)
# 注:只需要对特征进行升维,不需要对目标值进行升维

# 生成测试数据
X_test = np.linspace(-2,12,300).reshape(-1,1) 
model2 = LinearRegression()
model2.fit(X2,y)
X_test2 = np.concatenate([X_test,X_test**2],axis=1)
y_test2 = model2.predict(X_test2)
print('所求的w是\n',model2.coef_)
print('所求的截距b是\n',model2.intercept_)

# 绘制图像的时候要用没升维的数据进行绘制
plt.scatter(X,y,color='green')
plt.plot(X_test,y_test2,color = 'red')

使用sklearn库实现特征升维

在sklearn中具有很多封装好的工具,可以直接调用。

from sklearn.preprocessing import PolynomialFeatures # (多项式)升维的python库

使用方法:

# 特征和特征之间相乘
poly = PolynomialFeatures(interaction_only=True)
A = [[3,2]]
poly.fit_transform(A)
# 生成结果:array([[1., 3., 2., 6.]])

#特征之间乘法,自己和自己自乘(在上述情况下加上自己的乘法)
poly = PolynomialFeatures(interaction_only=False)
A = [[3,2,5]]
poly.fit_transform(A)
# 生成结果:array([[ 1.,  3.,  2.,  5.,  9.,  6., 15.,  4., 10., 25.]])

# 可以通过degree来提高升维的大小
poly = PolynomialFeatures(degree=4,interaction_only=False)# 特征和特征之间相乘
A = [[3,2,5]]
poly.fit_transform(A)
# 生成结果:
# array([[  1.,   3.,   2.,   5.,   9.,   6.,  15.,   4.,  10.,  25.,  27.,
#         18.,  45.,  12.,  30.,  75.,   8.,  20.,  50., 125.,  81.,  54.,
#        135.,  36.,  90., 225.,  24.,  60., 150., 375.,  16.,  40., 100.,
#        250., 625.]])

实现天猫年度销量预测

实现代码:

import numpy as np
import matplotlib.pyplot as plt
from sklearn.preprocessing import PolynomialFeatures,StandardScaler
from sklearn.linear_model import LinearRegression,SGDRegressor

# 创建数据
X = np.arange(2009,2020).reshape(-1,1) - 2008
y = np.array([0.5,9.36,52,191,350,571,912,1207,1682,2135,2684])
plt.scatter(X,y)
# 创建测试数据
X_test = np.linspace(2009,2020,100).reshape(-1,1) - 2008

# 数据升维
ploy = PolynomialFeatures(degree=2, interaction_only=False)
X2 = ploy.fit_transform(X)
X_test2 = ploy.fit_transform(X_test)

# 模型创建LinearRegression
model = LinearRegression(fit_intercept=False)
model.fit(X2,y)
y_pred = model.predict(X_test2)
print('参数w为:',model.coef_)
print('参数b为:',model.intercept_)

plt.scatter(X,y,color='green')
plt.plot(X_test,y_pred,color='red')
# 使用SGD进行梯度下降,必须要归一化,否则效果会非常不好
# 创建测试数据
X_test = np.linspace(2009,2019,100).reshape(-1,1) - 2008

# 数据升维
ploy = PolynomialFeatures(degree=2, interaction_only=False)
X2 = ploy.fit_transform(X)
X_test2 = ploy.fit_transform(X_test)

#对数据进行归一化操作
standard = StandardScaler()
X2_norm = standard.fit_transform(X2)
X_test2_norm = standard.fit_transform(X_test2)

# 模型创建SGDRegression
model = SGDRegressor(eta0=0.3, max_iter=5000)
model.fit(X2_norm,y)
y_pred = model.predict(X_test2_norm)
print('参数w为:',model.coef_)
print('参数b为:',model.intercept_)

plt.scatter(X,y,color='green')
plt.plot(X_test,y_pred,color='red')

这里需要说明一下情况,如果第二段代码不进行归一化,则呈现的是下图:

在这里插入图片描述

如果进行了归一化,则产生的和法一LinearRegession是一样的图形(基本相同):

在这里插入图片描述

这是什么原因?

  • 线性回归(Linear Regression)和随机梯度下降(SGD)在处理特征尺度不同的问题上有一些不同之处,导致线性回归相对于特征尺度的敏感性较低。
  • SGD的更新规则涉及学习率(η)和梯度。如果不同特征的尺度相差很大,梯度的大小也会受到这种尺度差异的影响。因此在引入高次项或其他非线性特征,需要注意特征的尺度,避免数值上的不稳定性。
  • SGD中的正则化项通常依赖于权重的大小。通过归一化,可以使得正则化项对所有特征的影响更加平衡。

实现中国人寿保险预测

import pandas as pd
import seaborn as sns
import numpy as np
from sklearn.linear_model import LinearRegression,ElasticNet
from sklearn.metrics import mean_squared_error,mean_squared_log_error
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import PolynomialFeatures

# 读取数据
data_renshou = pd.read_excel('your_path/中国人寿.xlsx')
# 可以通过下式生成图像,查看那些数据是好数据那些是不好的数据——好特征:差别大,容易区分
#sns.kdeplot(data=data_renshou, x="charges",hue="sex",shade=True)
#sns.kdeplot(data=data_renshou, x="charges",hue="smoker",shade=True)
#sns.kdeplot(data=data_renshou, x="charges",hue="region",shade=True)
#sns.kdeplot(data=data_renshou, x="charges",hue="children",shade=True)

# 特征工程,对数据进行处理
data_renshou = data_renshou.drop(['region','sex'],axis = 1)	# 删除不好的特征

# 体重指数,离散化转换,体重两种情况:标准,fat
def conver(df,bmi):
    df['bmi'] = 'fat' if df['bmi'] >= bmi else 'standard'
    return df
data_renshou = data_renshou.apply(conver, axis=1,args=(30,))

# 特征提取,离散转数值型数据
data_renshou = pd.get_dummies(data_renshou)
data_renshou.head()

#特征和目标值提取
# 训练数据
x = data_renshou.drop('charges', axis=1)
# 目标值
y = data_renshou['charges']

# 划分数据
X_train,X_test,y_train,y_test = train_test_split(x,y,test_size=0.2)

# 特征升维(导致了他下面的参数biandu)
poly = PolynomialFeatures(degree=2, include_bias=False)
X_train_poly = poly.fit_transform(X_train)
X_test_poly = poly.fit_transform(X_test)
# 模型训练与评估
np.set_printoptions(suppress=True)
model = LinearRegression()
model.fit(X_train_poly,y_train)
print('测试数据得分:',model.score(X_train_poly,y_train))
print('预测数据得分:',model.score(X_test_poly,y_test))
print('测试数据均方误差:',np.sqrt(mean_squared_error(y_test,model.predict(X_test_poly))))
print('训练数据均方误差:',np.sqrt(mean_squared_error(y_train,model.predict(X_train_poly))))
print('测试数据对数误差:',np.sqrt(mean_squared_log_error(y_test,model.predict(X_test_poly))))
print('训练数据对数误差:',np.sqrt(mean_squared_log_error(y_train,model.predict(X_train_poly))))
print('获得的参数为:',model.coef_.round(2),model.intercept_.round(2))

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/194124.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

二十九、微服务案例完善(数据聚合、自动补全、数据同步)

目录 一、定义 二、分类 1、桶(Bucket)聚合: 2、度量(Metric)聚合: 3、管道聚合(Pipeline Aggregation): 4、注意: 参与聚合的字段类型必须是: 三、使用DSL实现聚合 聚合所必须的三要素: 聚合可配…

【读懂AUTOSAR】DoIP模块(1)-- 使用场景和链接的建立规范

引子 --什么是?为什么使用DoIP? DoIP就是通过IP进行诊断的意思(Diagnostic Over IP)。我们熟悉的诊断都是通过CAN总线的啊,为什么要通过IP?IP是什么? IP就是Internet Protocol,就是”互联网协议“啦! 那DoIP就是通过互联网进行的诊断喽,也可以叫做“基于以太网的诊…

Sass基础知识详细讲解【附带表图】

文章目录 前言使用 SassRack / Rails / Merb插件缓存选项语法选择编码 Sass CSS扩展Sass 注释输出 Sass 脚本Sass -规则和指令Sass 控制指令和表达式 Sass 混入指令Sass 功能指令命名约定Sass 输出样式:nested:expanded:compact:compressedSass 扩展缓存存储自定义导入 后言 前…

电子学会C/C++编程等级考试2022年03月(三级)真题解析

C/C++等级考试(1~8级)全部真题・点这里 第1题:和数 给定一个正整数序列,判断其中有多少个数,等于数列中其他两个数的和。 比如,对于数列1 2 3 4, 这个问题的答案就是2, 因为3 = 2 + 1, 4 = 1 + 3。 时间限制:10000 内存限制:65536输入 共两行,第一行是数列中数的个数…

Pytorch-gpu环境篇

最最最头疼的就是配环境了 包之间的版本匹配问题 INSTALLING PREVIOUS VERSIONS OF PYTORCH 要考虑到pytorch和torchvision之间的匹配关系 显卡版本匹配问题

小航助学题库蓝桥杯题库stem选拔赛(23年8月)(含题库教师学生账号)

需要在线模拟训练的题库账号请点击 小航助学编程在线模拟试卷系统(含题库答题软件账号)_程序猿下山的博客-CSDN博客 需要在线模拟训练的题库账号请点击 小航助学编程在线模拟试卷系统(含题库答题软件账号)_程序猿下山的博客-CSD…

达索系统3DEXPERIENCE WORKS 2024电磁仿真功能

在设计工作中,将复杂的模型进行网格分割是必不可少的一步,这样可以化繁而简,也可以让后续的工作更容易开展。 电磁仿真可帮助您在复杂、嘈杂的电磁环境中提高效率,在确保兼容性的同时,保障出众性能。 一系列专用求解器…

【论文阅读】ActiveNeRF:通过不确定性估计候选新视图

【论文阅读】ActiveNeRF: Learning where to See with Uncertainty Estimation Abstract1 Introduction3 Background4 NeRF with Uncertainty Estimation5 ActiveNeRF5.1 Prior and Posterior Distribution5.2 Acquisition Function5.3 Optimization and Inference 6 Experimen…

nodejs+vue+elementui足球篮球联赛系统

系统主要是以后台管理员管理为主。管理员需要先登录系统然后才可以使用本系统,管理员可以对个人中心、用户管理、赛事信息管理、球队信息管理、球员信息管理、比赛分值板管理、系统管理等进行添加、查询、修改、删除,以保障足球联赛管理系统的正常运行。…

位图/布隆过滤器+海量数据处理总结

位图 题目: 第一种方法:二分查找。虽然二分的时间复杂度为o(log n),但是这个方法是不可行的,我们就算假设这40亿个数据是已经排序完成了的数据,但是40亿个整数在内存需要消耗的内存就是差不多16G,这个消耗是非常巨大的…

Ubuntu 22.03 LTS 安装deepin-terminal 分屏

安装 源里面自带了这个软件,可以直接装 sudo apt install deepin-terminal 启动 按下Win键,输入deep即可快速检索出图标,点击启动 效果 分屏 CtrlShiftH 水平分割 CtrlShiftJ 垂直分割 最多分割成四个小窗口,鼠标点击可以切换…

互联网金融智能风险防控技术要求

《互联网金融智能风险防控技术要求》 8月6日,国家市场监督管理总局和国家标准化管理委员会发布《互联网金融智能风险防控技术要求》(GB/T 42929-2023)(以下简称“《要求》”),将于2023年12月1日实施。 《要…

priority_queue优先级队列基本使用

目录 介绍 头文件 基本使用 constructor empty size top push pop swap 使用 大根堆 小根堆 结果 介绍 类似于堆 头文件 #include <queue> 基本使用 constructor empty 判空 size 元素个数 top 堆顶元素 push 入元素 pop 弹出堆顶元素 swap …

快速搭建一个SpringCloud、SpringBoot项目 || 项目搭建要点

1. 基本结构 建立springcloud项目从表入手&#xff0c;分析好需求建立表结构后&#xff0c;使用mybatis-plux生成POJO类&#xff0c;在对应的model模块中。 2. 微服务部分架构 2.1 依赖 service 微服务模块的依赖仅包含如下&#xff0c;数据库等依赖包含在model中&#xff0c…

Linux 内核栈保护

栈保护可以检测栈被写坏的情况。如果怀疑有此类情况&#xff0c;可以将栈保护打开试试 详细可参考文章 栈保护杂记-CSDN博客 栈保护开启 下图是关于strong的解释&#xff0c;在什么情况下会加入栈保护 后面由于gcc版本的原因&#xff0c;好像不支持开启栈保护。后面再进行效果…

红黑树(万字图文详解)

红黑树 1. 红黑树的概念2. 红黑树的性质3. 红黑树节点的定义4. 红黑树结构5. 红黑树的插入操作5.1 按照二叉搜索的树规则插入新节点5.2 检测新节点插入后&#xff0c;红黑树的性质是否造到破坏5.2.1 情况一: cur为红&#xff0c;p为红&#xff0c;g为黑&#xff0c;u存在且为红…

C_6微机原理

一、单项选择题&#xff08;本大题共 15小题&#xff0c;每小题3分&#xff0c;共45分。在每小题给出的四个备选项中&#xff0c;选出一个正确的答案&#xff0c;请将选定的答案填涂在答题纸的相应位置上。 n1 位有符号数 的补码表示范围为&#xff08;&#xff09; A. -2n&l…

Mybatis 源码搭建

文章目录 源码下载测试模块搭建学习博客 源码下载 首先下载mybatis-parent的源码&#xff1a;gitee地址 > https://gitee.com/callback_lab/mybatis-parent.git 然后下载mybatis的源码&#xff1a;gitee地址 > https://gitee.com/callback_lab/mybatis-src.git 带中文…

SpringCloud之Gateway(统一网关)

文章目录 前言一、搭建网关服务1、导入依赖2、在application.yml中写配置 二、路由断言工厂Route Predicate Factory三、路由过滤器 GatewayFilter案例1给所有进入userservice的请求添加一个请求头总结 四、全局过滤器 GlobalFilter定义全局过滤器&#xff0c;拦截并判断用户身…

瑞数五代ast反混淆笔记一

第一部分 瑞数五代ast反混淆笔记一 文章目录 前言一、分析第一层js文件二、转换为switch-case三、效果图总结 前言 瑞数五代的反混淆做了很久了&#xff0c;当时写的很复杂&#xff0c;也没有记笔记&#xff0c;现在看代码都看不懂了&#xff0c;重新归顺下逻辑思路 一、分析第…