【Python机器学习】单变量非线性变换

添加特征的平方或立方可以改进线性回归模型,其他变换通常也对变换某些特征有用,特别是应用数学函数,比如log、exp、sin等。虽然基于树的模型只关注特征的顺序,但是线性模型和神经网络依赖于每个特征的尺度和分布。如果在特征和目标之间存在非线性关系,那么建模就会变得非常困难,特别是对于回归问题。

log和exp函数可以帮助调节数据的相对比例,从而改进线性模型或神经网络的学习效果。在处理具有周期性模式的数据是,sin和cos函数非常有用。

大部分模型都在每个特征(在回归问题中还包括目标值)大致遵循高斯分布时表现最好,也就是说,每个特征的直方图应该是具有类似于熟悉的"钟形曲线"的形状。使用诸如log和exp之类的变换并不稀奇,但却是实现这一点的简单又有效的方法。

在一中特别常见的情况下,这种变换非常有用,就是处理整数计数数据时。计数数据是指类似于"用户A多长时间登录一次"这样的特征。计数不可能取负值,并且通常遵循特定的统计模式下。

下面使用一个模拟的计数数据集,其性质与在自然状态下能找到的数据集类似,特征全都是整数值,而响应是连续的:

python 复制代码
import numpy as np

rnd=np.random.RandomState(0)
X_org=rnd.normal(size=(1000,3))
w=rnd.normal(size=3)

X=rnd.poisson(10*np.exp(X_org))
y=np.dot(X_org,w)

计算每个值出现的次数,看数值的分布情况:

python 复制代码
print('每个值出现的次数:{}'.format(np.bincount(X[:,0])))

可以看到,数字2是最常见的,出现了68次,之后数字的出现次数快速下降,但也偶尔有一些比较大的数字出现了2次。

将计数可视化:

python 复制代码
bins=np.bincount(X[:,0])
plt.bar(range(len(bins)),bins)
plt.xlabel('数字')
plt.ylabel('数字出现的次数')
plt.show()

特征X[:,1]和特征X[:,2]具有类似的性质。这种类型的数值分布(许多较小的值和一些非常大的值)在实践中非常常见。但大多数线性模型无法很好地处理这种数据。

尝试拟合一个岭回归模型:

python 复制代码
X_train,X_test,y_train,y_test=train_test_split(X,y,random_state=0)
score=Ridge().fit(X_train,y_train).score(X_test,y_test)
print('score:{:.3f}'.format(score))

我们可以从相对较小的R*R分数中看出,Ridge无法真正捕捉到X和y之间的关系。不过应用对数变换可能有用。由于数值中包含0,所以我们不能直接应用log,而是要计算log(X+1):

python 复制代码
X_train_log=np.log(X_train+1)
X_test_log=np.log(X_test+1)

plt.hist(X_train_log[:,0],bins=25)
plt.ylabel('数字出现的次数')
plt.xlabel('数字')
plt.show()

在新数据上构建一个岭回归模型,可以得到更好的拟合:

python 复制代码
score=Ridge().fit(X_train_log,y_train).score(X_test_log,y_test)
print('score:{:.3f}'.format(score))

为数据集和模型的所有组合寻找最佳变换,这在某种程度上是一门艺术。在这个例子中,所有的特征都具有相同的性质,这在实践中是非常少见的情况。通常来说,只有一部分特征应该进行变换,有时每个特征的变换方式也各不相同。前面提到过,对基于树的模型而言,这种变换并不重要,但对线性模型来说可能至关重要。

对回归的目标变量y进行变换有时也是一个好主意。尝试预测计数(比如订单数量)是一项相当常见的任务,而且使用log(y+1)变换也往往有用。

从前面的例子中可以看出,分箱、多项式、交互都对模型在给定数据集上的性能有很大的影响,对于复杂度较低的模型更是这样,比如线性模型和朴素贝叶斯模型。与之相反,基于树的模型通常能够自己发现重要的交互项,大多数情况下不需要显式地变换数据。其他模型,比如SVM、最近邻、神经网络,有时可能会从分箱、交互项或多项式中受益,但其效果通常不如线性效果那么明显。

相关推荐
格林威4 分钟前
常规线扫描镜头有哪些类型?能做什么?
人工智能·深度学习·数码相机·算法·计算机视觉·视觉检测·工业镜头
Lucis__31 分钟前
再探类&对象——C++入门进阶
开发语言·c++
007php00732 分钟前
某大厂跳动面试:计算机网络相关问题解析与总结
java·开发语言·学习·计算机网络·mysql·面试·职场和发展
倔强青铜三42 分钟前
苦练Python第63天:零基础玩转TOML配置读写,tomllib模块实战
人工智能·python·面试
知识分享小能手44 分钟前
微信小程序入门学习教程,从入门到精通,微信小程序核心 API 详解与案例(13)
前端·javascript·学习·react.js·微信小程序·小程序·vue
递归不收敛1 小时前
吴恩达机器学习课程(PyTorch 适配)学习笔记:3.3 推荐系统全面解析
pytorch·学习·机器学习
浔川python社1 小时前
《网络爬虫技术规范与应用指南系列》(xc—3):合规实操与场景落地
python
B站计算机毕业设计之家1 小时前
智慧交通项目:Python+YOLOv8 实时交通标志系统 深度学习实战(TT100K+PySide6 源码+文档)✅
人工智能·python·深度学习·yolo·计算机视觉·智慧交通·交通标志
高工智能汽车1 小时前
棱镜观察|极氪销量遇阻?千里智驾左手服务吉利、右手对标华为
人工智能·华为
lsx2024061 小时前
HTML 字符集
开发语言