Python机器学习笔记(十八、交互特征与多项式特征)

news2025/1/11 2:10:10

添加原始数据的交互特征(interaction feature)和多项式特征(polynomial feature)可以丰富特征表示,特别是对于线性模型。这种特征工程可以用统计建模和许多实际的机器学习应用中。

上一次学习:线性模型对wave数据集中的每个箱子都学到一个常数值。但我们知道,线性模型不仅可以学习偏移,还可以学习斜率。想要向分箱数据上的线性模型添加斜率,一种方法是重新加入原始特征。这样会得到11维的数据集,如下代码:

import numpy as np
import mglearn
import matplotlib.pyplot as plt
from sklearn.linear_model import LinearRegression
#from sklearn.tree import DecisionTreeRegressor
#from sklearn.preprocessing import OneHotEncoder
from sklearn.preprocessing import KBinsDiscretizer

X, y = mglearn.datasets.make_wave(n_samples=100)
line = np.linspace(-3, 3, 1000, endpoint=False).reshape(-1, 1)

# 生成10个箱子
#kb = KBinsDiscretizer(n_bins=10, strategy='uniform')
#kb.fit(X)

kb = KBinsDiscretizer(n_bins=10, strategy='uniform', encode='onehot-dense')
kb.fit(X)
#X_binned = kb.transform(X)
# 记录每个数据点所属的箱子。
X_binned = kb.transform(X)
line_binned = kb.transform(line)

# 加入原始特征
X_combined = np.hstack([X, X_binned])
print(X_combined.shape)


reg = LinearRegression().fit(X_combined, y)

line_combined = np.hstack([line, line_binned])
plt.plot(line, reg.predict(line_combined), label='linear regression combined')
plt.vlines(kb.bin_edges_[0], -3, 3, linewidth=1, alpha=.2)
plt.legend(loc="best")
plt.ylabel("Regression output")
plt.xlabel("Input feature")
plt.plot(X[:, 0], y, 'o', c='k')
plt.show()

输出结果:(100, 11)

输出图形:

输出的图形是使用分箱特征和单一全局斜率的线性回归。

在这个例子中,模型在每个箱子中都学到一个偏移,还学到一个斜率。学到的斜率是向下的,并且在所有箱子中都相同——只有一个x轴特征,也就只有一个斜率。因为斜率在所有箱子中是相同的,所以它似乎不是很有用。我们更希望每个箱子都有一个不同的斜率。为了实现这一点,我们可以添加交互特征或乘积特征,用来表示数据点所在的箱子以及数据点在x轴上的位置。这个特征是箱子指示符与原始特征的乘积。下面来创建数据集:

import numpy as np
import mglearn
#import matplotlib.pyplot as plt
#from sklearn.linear_model import LinearRegression
#from sklearn.tree import DecisionTreeRegressor
#from sklearn.preprocessing import OneHotEncoder
from sklearn.preprocessing import KBinsDiscretizer

X, y = mglearn.datasets.make_wave(n_samples=100)
line = np.linspace(-3, 3, 1000, endpoint=False).reshape(-1, 1)

# 生成10个箱子
#kb = KBinsDiscretizer(n_bins=10, strategy='uniform')
#kb.fit(X)

kb = KBinsDiscretizer(n_bins=10, strategy='uniform', encode='onehot-dense')
kb.fit(X)
#X_binned = kb.transform(X)
# 记录每个数据点所属的箱子。
X_binned = kb.transform(X)
line_binned = kb.transform(line)

# 加入原始特征
X_combined = np.hstack([X, X_binned])
#print(X_combined.shape)

line_combined = np.hstack([line, line_binned])

# 创建数据集
X_product = np.hstack([X_binned, X * X_binned])
print(X_product.shape)

输出:(100, 20)  。这个数据集现在有20个特征:数据点所在箱子的指示符与原始特征和箱子指示符的乘积。可以将乘积特征看作每个箱子x轴特征的单独副本。它在箱子内等于原始特征,在其他 位置等于零。下面我们代码绘图给出线性模型在这种新表示上的结果:

import numpy as np
import mglearn
import matplotlib.pyplot as plt
from sklearn.linear_model import LinearRegression
#from sklearn.tree import DecisionTreeRegressor
#from sklearn.preprocessing import OneHotEncoder
from sklearn.preprocessing import KBinsDiscretizer

X, y = mglearn.datasets.make_wave(n_samples=100)
line = np.linspace(-3, 3, 1000, endpoint=False).reshape(-1, 1)

# 生成10个箱子
#kb = KBinsDiscretizer(n_bins=10, strategy='uniform')
#kb.fit(X)

kb = KBinsDiscretizer(n_bins=10, strategy='uniform', encode='onehot-dense')
kb.fit(X)
#X_binned = kb.transform(X)
# 记录每个数据点所属的箱子。
X_binned = kb.transform(X)
line_binned = kb.transform(line)

# 加入原始特征
X_combined = np.hstack([X, X_binned])
#print(X_combined.shape)

# 创建数据集
X_product = np.hstack([X_binned, X * X_binned])
#print(X_product.shape)

reg = LinearRegression().fit(X_product, y)

line_product = np.hstack([line_binned, line * line_binned])

plt.plot(line, reg.predict(line_product), label='linear regression product')
plt.vlines(kb.bin_edges_[0], -3, 3, linewidth=1, alpha=.2)
plt.plot(X[:, 0], y, 'o', c='k')
plt.ylabel("Regression output")
plt.xlabel("Input feature")
plt.legend(loc="best")
plt.show()

输出图形:

上图显示每个箱子具有不同的偏移和斜率。使用分箱是扩展连续特征的一种方法。另一种方法是 使用原始特征的多项式(polynomial)。对于给定特征x,我们可以考虑x ** 2、x ** 3、x ** 4,等等。这在preprocessing模块的PolynomialFeatures中实现:

import numpy as np
import mglearn
import matplotlib.pyplot as plt
from sklearn.linear_model import LinearRegression
#from sklearn.tree import DecisionTreeRegressor
#from sklearn.preprocessing import OneHotEncoder
from sklearn.preprocessing import KBinsDiscretizer
from sklearn.preprocessing import PolynomialFeatures

X, y = mglearn.datasets.make_wave(n_samples=100)
line = np.linspace(-3, 3, 1000, endpoint=False).reshape(-1, 1)

# 生成10个箱子
#kb = KBinsDiscretizer(n_bins=10, strategy='uniform')
#kb.fit(X)

kb = KBinsDiscretizer(n_bins=10, strategy='uniform', encode='onehot-dense')
kb.fit(X)
#X_binned = kb.transform(X)
# 记录每个数据点所属的箱子。
X_binned = kb.transform(X)
line_binned = kb.transform(line)

# 加入原始特征
X_combined = np.hstack([X, X_binned])
#print(X_combined.shape)

# 创建数据集
#X_product = np.hstack([X_binned, X * X_binned])
#print(X_product.shape)

# 包含直到x ** 10的多项式:
# 默认的"include_bias=True"添加恒等于1的常数特征
poly = PolynomialFeatures(degree=10, include_bias=False)
poly.fit(X)
X_poly = poly.transform(X)
# 多项式的次数为 10,因此生成10个特征:
print("X_poly.shape: {}".format(X_poly.shape))

输出:X_poly.shape: (100, 10)

比较X_ploy和X的元素:

import numpy as np
import mglearn
import matplotlib.pyplot as plt
from sklearn.linear_model import LinearRegression
#from sklearn.tree import DecisionTreeRegressor
#from sklearn.preprocessing import OneHotEncoder
from sklearn.preprocessing import KBinsDiscretizer
from sklearn.preprocessing import PolynomialFeatures

X, y = mglearn.datasets.make_wave(n_samples=100)
line = np.linspace(-3, 3, 1000, endpoint=False).reshape(-1, 1)

# 生成10个箱子
#kb = KBinsDiscretizer(n_bins=10, strategy='uniform')
#kb.fit(X)

kb = KBinsDiscretizer(n_bins=10, strategy='uniform', encode='onehot-dense')
kb.fit(X)
#X_binned = kb.transform(X)
# 记录每个数据点所属的箱子。
X_binned = kb.transform(X)
line_binned = kb.transform(line)

# 加入原始特征
X_combined = np.hstack([X, X_binned])
#print(X_combined.shape)

# 创建数据集
#X_product = np.hstack([X_binned, X * X_binned])
#print(X_product.shape)

# 包含直到x ** 10的多项式:
# 默认的"include_bias=True"添加恒等于1的常数特征
poly = PolynomialFeatures(degree=10, include_bias=False)
poly.fit(X)
X_poly = poly.transform(X)
# 多项式的次数为 10,因此生成10个特征:
print("X_poly.shape: {}".format(X_poly.shape))

# 比较 X_poly 和 X 的元素:
print("Entries of X:\n{}".format(X[:5]))
print("Entries of X_poly:\n{}".format(X_poly[:5]))

输出:

Entries of X:
[[-0.75275929]
 [ 2.70428584]
 [ 1.39196365]
 [ 0.59195091]
 [-2.06388816]]
Entries of X_poly:
[[-7.52759287e-01  5.66646544e-01 -4.26548448e-01  3.21088306e-01
  -2.41702204e-01  1.81943579e-01 -1.36959719e-01  1.03097700e-01
  -7.76077513e-02  5.84199555e-02]
 [ 2.70428584e+00  7.31316190e+00  1.97768801e+01  5.34823369e+01
   1.44631526e+02  3.91124988e+02  1.05771377e+03  2.86036036e+03
   7.73523202e+03  2.09182784e+04]
 [ 1.39196365e+00  1.93756281e+00  2.69701700e+00  3.75414962e+00
   5.22563982e+00  7.27390068e+00  1.01250053e+01  1.40936394e+01
   1.96178338e+01  2.73073115e+01]
 [ 5.91950905e-01  3.50405874e-01  2.07423074e-01  1.22784277e-01
   7.26822637e-02  4.30243318e-02  2.54682921e-02  1.50759786e-02
   8.92423917e-03  5.28271146e-03]
 [-2.06388816e+00  4.25963433e+00 -8.79140884e+00  1.81444846e+01
  -3.74481869e+01  7.72888694e+01 -1.59515582e+02  3.29222321e+02
  -6.79478050e+02  1.40236670e+03]]

我们可以通过调用 get_feature_names_out 方法来获取特征的语义,给出每个特征的指数:

import numpy as np
import mglearn
import matplotlib.pyplot as plt
from sklearn.linear_model import LinearRegression
#from sklearn.tree import DecisionTreeRegressor
#from sklearn.preprocessing import OneHotEncoder
from sklearn.preprocessing import KBinsDiscretizer
from sklearn.preprocessing import PolynomialFeatures

X, y = mglearn.datasets.make_wave(n_samples=100)
line = np.linspace(-3, 3, 1000, endpoint=False).reshape(-1, 1)

# 生成10个箱子
#kb = KBinsDiscretizer(n_bins=10, strategy='uniform')
#kb.fit(X)

kb = KBinsDiscretizer(n_bins=10, strategy='uniform', encode='onehot-dense')
kb.fit(X)
#X_binned = kb.transform(X)
# 记录每个数据点所属的箱子。
X_binned = kb.transform(X)
line_binned = kb.transform(line)

# 加入原始特征
X_combined = np.hstack([X, X_binned])
#print(X_combined.shape)

# 创建数据集
#X_product = np.hstack([X_binned, X * X_binned])
#print(X_product.shape)

# 包含直到x ** 10的多项式:
# 默认的"include_bias=True"添加恒等于1的常数特征
poly = PolynomialFeatures(degree=10, include_bias=False)
poly.fit(X)
X_poly = poly.transform(X)
# 多项式的次数为 10,因此生成10个特征:
print("X_poly.shape: {}".format(X_poly.shape))

# 比较 X_poly 和 X 的元素:
print("Entries of X:\n{}".format(X[:5]))
print("Entries of X_poly:\n{}".format(X_poly[:5]))

#调用 get_feature_names_out 方法来获取特征的语义,给出每个特征的指数
print("Polynomial feature names:\n{}".format(poly.get_feature_names_out()))

输出:

Polynomial feature names:
['x0' 'x0^2' 'x0^3' 'x0^4' 'x0^5' 'x0^6' 'x0^7' 'x0^8' 'x0^9' 'x0^10']

可以看到,X_poly 的第一列与 X 完全对应,而其他列则是第一列的幂。有趣的是,可以发现有些值非常大。第二行有大于 20000 的元素,数量级与其他行都不相同。将多项式特征与线性回归模型一起使用,可以得到经典的多项式回归(polynomial regression)模型,见如下代码实现:

import numpy as np
import mglearn
import matplotlib.pyplot as plt
from sklearn.linear_model import LinearRegression
#from sklearn.tree import DecisionTreeRegressor
#from sklearn.preprocessing import OneHotEncoder
from sklearn.preprocessing import KBinsDiscretizer
from sklearn.preprocessing import PolynomialFeatures

X, y = mglearn.datasets.make_wave(n_samples=100)
line = np.linspace(-3, 3, 1000, endpoint=False).reshape(-1, 1)

# 生成10个箱子
#kb = KBinsDiscretizer(n_bins=10, strategy='uniform')
#kb.fit(X)

kb = KBinsDiscretizer(n_bins=10, strategy='uniform', encode='onehot-dense')
kb.fit(X)
#X_binned = kb.transform(X)
# 记录每个数据点所属的箱子。
X_binned = kb.transform(X)
#line_binned = kb.transform(line)

# 加入原始特征
X_combined = np.hstack([X, X_binned])
#print(X_combined.shape)

# 创建数据集
#X_product = np.hstack([X_binned, X * X_binned])
#print(X_product.shape)

# 包含直到x ** 10的多项式:
# 默认的"include_bias=True"添加恒等于1的常数特征
poly = PolynomialFeatures(degree=10, include_bias=False)
poly.fit(X)
X_poly = poly.transform(X)
# 多项式的次数为 10,因此生成10个特征:
#print("X_poly.shape: {}".format(X_poly.shape))

# 比较 X_poly 和 X 的元素:
#print("Entries of X:\n{}".format(X[:5]))
#print("Entries of X_poly:\n{}".format(X_poly[:5]))

#调用 get_feature_names 方法来获取特征的语义,给出每个特征的指数
#print("Polynomial feature names:\n{}".format(poly.get_feature_names_out()))

reg = LinearRegression().fit(X_poly, y)

line_poly = poly.transform(line)
plt.plot(line, reg.predict(line_poly), label='polynomial linear regression')
plt.plot(X[:, 0], y, 'o', c='k')
plt.ylabel("Regression output")
plt.xlabel("Input feature")
plt.legend(loc="best")
plt.show()

输出图形:

上图是具有 10 次多项式特征的线性回归。多项式特征在这个一维数据上得到了非常平滑的拟合。但高次多项式在边界上或数据很少的区域可能有极端的表现。作为对比,下面是在原始数据上学到的核SVM模型,没有做任何变换:

import numpy as np
import mglearn
import matplotlib.pyplot as plt
from sklearn.svm import SVR

X, y = mglearn.datasets.make_wave(n_samples=100)
line = np.linspace(-3, 3, 1000, endpoint=False).reshape(-1, 1)

for gamma in [1, 10]:
    svr = SVR(gamma=gamma).fit(X, y)
    plt.plot(line, svr.predict(line), label='SVR gamma={}'.format(gamma))

plt.plot(X[:, 0], y, 'o', c='k')
plt.ylabel("Regression output")
plt.xlabel("Input feature")
plt.legend(loc="best")
plt.show()

输出图形(对于RBF核的SVM,使用不同 gamma 参数的对比):

使用更加复杂的模型(即核 SVM),能够学到一个与多项式回归的复杂度类似的预测结果,且不需要进行显式的特征变换。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

数据结构——栈的实现

今天,我们来写一下关于栈的博文。 1.首先我们先了解一下什么是栈? 一:概念: 栈:一种特殊的线性表,其只允许在固定的一端进行插入和删除元素操作。 进行数据插入和删除操作的一端称为栈顶,另…

电脑提示directx错误导致玩不了游戏怎么办?dx出错的解决方法

想必大家都有过这样的崩溃瞬间:满心欢喜打开心仪的游戏,准备在虚拟世界里大杀四方或者畅游冒险,结果屏幕上突然弹出个 DirectX 错误的提示框,紧接着游戏闪退,一切美好戛然而止。DirectX 作为 Windows 系统下游戏运行的…

python学opencv|读取图像(二十九)使用cv2.getRotationMatrix2D()函数旋转缩放图像

【1】引言 前序已经学习了如何平移图像,相关文章链接为: python学opencv|读取图像(二十七)使用cv2.warpAffine()函数平移图像-CSDN博客 在此基础上,我们尝试旋转图像的同时缩放图像。 【2】…

MySQL表的增删查改(下)——Update(更新),Delete(删除)

文章目录 Update将孙悟空同学的数学成绩修改为80分将曹孟德同学的数学成绩变更为 60 分,语文成绩变更为 70 分将总成绩倒数前三的 3 位同学的数学成绩加上 30 分将所有同学的语文成绩更新为原来的 2 倍 Delete删除数据删除孙悟空同学的考试成绩删除整张表数据 截断表…

Virgo:增强慢思考推理能力的多模态大语言模型

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗?订阅我们的简报,深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同,从行业内部的深度分析和实用指南中受益。不要错过这个机会,成为AI领…

聚类系列 (二)——HDBSCAN算法详解

在进行组会汇报的时候,为了引出本研究动机(论文尚未发表,暂不介绍),需要对DBSCAN、OPTICS、和HDBSCAN算法等进行详细介绍。在查询相关资料的时候,发现网络上对于DBSCAN算法的介绍非常多与细致,但…

零基础 监控数据可视化 Spring Boot 2.x(Actuator + Prometheus + Grafana手把手) (上)

一、安装Prometheus Releases prometheus/prometheus GitHubhttps://github.com/prometheus/prometheus/releases 或 https://prometheus.io/download/https://prometheus.io/download/ 1. 下载适用于 Windows 的二进制文件: 找到最新版本的发布页面&#xf…

解决Qt打印中文字符出现乱码

在 Windows 平台上,默认的控制台编码可能不是 UTF-8,这可能会导致中文字符的显示问题。 下面是在 Qt 应用程序中设置中文字体,并确保控制台输出为 UTF-8 编码: 1. Qt 应用程序代码 在 Qt 中,我们可以使用 QApplic…

PDFelement 特别版

Wondershare PDFelement Pro 是一款非常强大的PDF编辑软件,它允许用户轻松地编辑、转换、创建和管理PDF文件。这个中文特别版的软件具有许多令人印象深刻的功能,PDFelement Pro 提供了丰富的编辑功能,可以帮助用户直接在PDF文件中添加、删除、…

SpringBoot-Web入门-入门程序

1.如何创建一个springBoot-Web工程? 实战演示: 新建一个模块,找到Spring Boot选项 点击下一步之后,选择勾选对应的依赖。我这里勾选的是web下的Spring Web 创建完毕之后,在src的main下的java对应的包下创建一个Contro…

从光子到图像——相机如何捕获世界?

引言 你是否想过为何我们按一下相机快门就可以将眼前广袤多彩的世界显示于一个小小的相机屏幕上?本期推文中将带着大家重现从光子转换为电子、电子转换为图像中数字驱动值的整个流程。 ▲人们通过相机捕获眼前的场景 从光子到电子的转换 光线首先通过光学镜头进入相…

《机器学习》——贝叶斯算法

贝叶斯简介 贝叶斯公式,又称贝叶斯定理、贝叶斯法则,最初是用来描述两个事件的条件概率间的关系的公式,后来被人们发现具有很深刻的实际意义和应用价值。该公式的实际内涵是,支持某项属性的事件发生得愈多,则该属性成…

【非常详细】TCP/IP协议详解

一、TCP/IP简介 TCP/IP(传输控制协议/互联网协议)是一种用于连接网络设备的协议族,广泛应用于互联网和局域网中。它提供了在不同类型的网络上进行通信的标准和方法。 二、TCP/IP模型 TCP/IP在数据包设计上采用封装和分用的策略,…

Nginx代理同域名前后端分离项目的完整步骤

前后端分离项目,前后端共用一个域名。通过域名后的 url 前缀来区别前后端项目。 以 vue php 项目为例。直接上 server 模块的 nginx 配置。 server{ listen 80; #listen [::]:80 default_server ipv6onlyon; server_name demo.com;#二配置项目域名 index index.ht…

C++中的表达式

文章目录 算数操作符位操作符bitset对象或整型值的使用将位移操作符用作IO 赋值操作符赋值操作符的右结合性赋值操作具有低优先级 自增和自减操作符条件操作符sizeof操作符优先级new和delete表达式类型转换何时发生隐式转换显示转换旧式强制类型转换 C中的表达式由一个或多个操…

WebSocket 测试入门篇

Websocket 是一种用于 H5 浏览器的实时通讯协议,可以做到数据的实时推送,可适用于广泛的工作环境,例如客服系统、物联网数据传输系统, 基础介绍 我们平常接触最多的是 http 协议的接口,http 协议是请求与响应的模式&…

海外招聘丨 弗拉瑞克商学院—博士研究员:智能家居技术业务和能源管理中的数据分析和人工智能

雇主简介 Vlerick 是一所领先的国际商学院……与众不同。是的,我们提供完全认可的世界一流教育课程,将理论知识和实践见解完美结合。是的,我们是一家领先的学术机构,拥有创新和独立研究的悠久传统。是的,我们拥有国际…

NUTTX移植到STM32

STM32移植NUTTX 1. Ubuntu下搭建开发环境1.1 先决条件1.2 下载 NuttX1.3 使用Make 进行编译1.4 烧录运行 2.通过NUTTX点亮LED2.1 部署操作系统2.2 修改配置文件2.3 编译运行程序 开发板:DshanMCUF407 官方开发文档:安装 — NuttX latest 文档 参考文档&…

Redis 优化秒杀(异步秒杀)

目录 为什么需要异步秒杀 异步优化的核心逻辑是什么? 阻塞队列的特点是什么? Lua脚本在这里的作用是什么? 异步调用创建订单的具体逻辑是什么? 为什么要用代理对象proxy调用createVoucherOrder方法? 对于代码的详细…

Python 中的错误处理与调试技巧

💖 欢迎来到我的博客! 非常高兴能在这里与您相遇。在这里,您不仅能获得有趣的技术分享,还能感受到轻松愉快的氛围。无论您是编程新手,还是资深开发者,都能在这里找到属于您的知识宝藏,学习和成长…