首页
技术小册
AIGC
面试刷题
技术文章
MAGENTO
云计算
视频课程
源码下载
PDF书籍
「涨薪秘籍」
登录
注册
4.1 分类变量
4.1.1 One-Hot 编码(虚拟变量)
4.1.2 数字可以编码分类变量
4.2 分箱、离散化、线性模型与树
4.3 交互特征与多项式特征
4.4 单变量非线性变换
4.5 自动化特征选择
4.5.1 单变量统计
4.5.2 基于模型的特征选择
4.5.3 迭代特征选择
4.6 利用专家知识
5.1 交叉验证
5.1.1 scikit-learn 中的交叉验证
5.1.2 交叉验证的优点
5.1.3 分层k 折交叉验证和其他策略
5.2 网格搜索
5.2.1 简单网格搜索
5.2.2 参数过拟合的风险与验证集
5.2.3 带交叉验证的网格搜索
5.3 评估指标与评分
5.3.1 牢记目标
5.3.2 二分类指标
5.3.3 多分类指标
5.3.4 回归指标
5.3.5 在模型选择中使用评估指标
6.1 用预处理进行参数选择
6.2 构建管道
6.3 在网格搜索中使用管道
6.4 通用的管道接口
6.4.1 用make_pipeline 方便地创建管道
6.4.2 访问步骤属性
6.4.3 访问网格搜索管道中的属性
6.5 网格搜索预处理步骤与模型参数
6.6 网格搜索选择使用哪个模型
7.1 用字符串表示的数据类型
7.2 示例应用:电影评论的情感分析
7.3 将文本数据表示为词袋
7.3.1 将词袋应用于玩具数据集
7.3.2 将词袋应用于电影评论
7.4 停用词
7.5 用tf-idf 缩放数据
7.6 研究模型系数
7.7 多个单词的词袋(n元分词)
7.8 分词、词干提取与词形还原
7.9 主题建模与文档聚类
8.1 处理机器学习问题
8.2 从原型到生产
8.3 测试生产系统
8.4 构建你自己的估计器
8.5 下一步怎么走
8.5.1 理论
8.5.2 其他机器学习框架和包
8.5.3 排序、推荐系统与其他学习类型
8.5.4 概率建模、推断与概率编程
8.5.5 神经网络
8.5.6 推广到更大的数据集
当前位置:
首页>>
技术小册>>
Python机器学习基础教程(下)
小册名称:Python机器学习基础教程(下)
### 4.4 单变量非线性变换 在机器学习领域,数据预处理是构建高效、准确模型的关键步骤之一。面对现实世界中的数据集,数据的分布往往不是理想的线性关系,这时,通过单变量非线性变换来调整数据特征,以改善模型的拟合能力和泛化能力,显得尤为重要。本章将深入探讨单变量非线性变换的基本概念、常见方法及其在Python中的实现,同时结合实际应用案例,帮助读者掌握这一重要技术。 #### 4.4.1 单变量非线性变换概述 单变量非线性变换是指对数据集中的单一特征应用非线性函数,以改变其原始分布形式的过程。这种变换的主要目的是将原本难以用线性模型准确表示的数据转换为更适合模型学习的形式。例如,在金融数据预测中,股票价格的增长往往呈现出非线性趋势;在生物医学数据分析中,疾病指标与治疗效果之间也可能存在复杂的非线性关系。 非线性变换不仅可以简化数据的复杂性,使模型更容易捕捉到数据中的内在规律,还能通过扩大特征空间来提高模型的区分能力。此外,它还能处理数据的偏斜分布(skewed distribution),使之更接近正态分布,有助于某些统计方法和机器学习算法的应用。 #### 4.4.2 常见单变量非线性变换方法 ##### 4.4.2.1 对数变换 对数变换是最常用的单变量非线性变换之一,适用于处理右偏(正偏)分布的数据。通过对数变换,可以将原本快速增长的数据段压缩,使得数据的分布更加均匀。Python中,可以利用NumPy库中的`np.log`或`np.log1p`(对于处理包含零的数据集更安全)函数来实现。 ```python import numpy as np # 假设x是原始数据 x = np.array([1, 10, 100, 1000, 10000]) # 应用对数变换 x_log = np.log(x) # 或对于包含0的情况使用 x_log1p = np.log1p(x + 1 - 1) # 示例中未实际修改x为包含0的情况,仅作说明 print(x_log) ``` ##### 4.4.2.2 指数变换 与对数变换相反,指数变换适用于处理左偏(负偏)分布的数据,能够将较小的值放大,同时保持较大的值之间的相对差异。在Python中,可以使用`np.exp`函数实现。 ```python # 应用指数变换 x_exp = np.exp(x) print(x_exp) ``` ##### 4.4.2.3 多项式变换 多项式变换是另一种强大的非线性变换方法,它通过增加特征的幂次来引入数据的非线性效应。多项式变换能够捕捉到原始数据中的非线性关系,但需要注意过拟合的风险。在Python中,可以利用NumPy的数组操作或SciPy的`poly1d`类来实现。 ```python # 二次多项式变换 x_squared = x ** 2 # 更复杂的多项式变换(如三次) x_cubed = x ** 3 # 使用SciPy的poly1d创建多项式对象 from scipy.poly1d import Poly1d p = Poly1d([1, 0, 0, 1], r=True) # 创建x^3 + 1的多项式 x_poly = p(x) print(x_squared) print(x_cubed) print(x_poly) ``` ##### 4.4.2.4 Box-Cox变换 Box-Cox变换是一种统计中常用的数据变换方法,它可以根据数据的具体情况自动选择最优的变换参数,使得变换后的数据更接近正态分布。Box-Cox变换特别适合处理未知变换形式的数据。在Python中,可以使用SciPy库中的`boxcox`函数。 ```python from scipy.stats import boxcox # 需要提供一个lambda参数的初始猜测值,None表示自动寻找最优lambda x_boxcox, best_lambda = boxcox(x) print(x_boxcox) print(f"最优lambda值: {best_lambda}") ``` #### 4.4.3 实战应用 假设我们正在处理一个房价预测问题,房价数据(假设为`house_prices`)往往不是线性增长的,可能存在较高的偏斜度。我们可以通过对数变换来尝试改善这一情况。 ```python import pandas as pd # 假设house_prices是包含房价数据的Pandas Series house_prices = pd.Series([100000, 150000, 200000, 300000, 500000, 800000, 1200000]) # 应用对数变换 house_prices_log = np.log1p(house_prices) # 可视化原始数据和对数变换后的数据 import matplotlib.pyplot as plt plt.figure(figsize=(10, 5)) plt.subplot(1, 2, 1) plt.hist(house_prices, bins=10, alpha=0.7, label='原始数据') plt.title('原始房价分布') plt.xlabel('房价') plt.ylabel('频数') plt.legend() plt.subplot(1, 2, 2) plt.hist(house_prices_log, bins=10, alpha=0.7, label='对数变换后') plt.title('对数变换后房价分布') plt.xlabel('对数房价') plt.ylabel('频数') plt.legend() plt.tight_layout() plt.show() ``` 从上述可视化中可以看出,对数变换有效地改善了房价数据的分布形态,使其更加接近正态分布,这有助于后续模型的构建和优化。 #### 4.4.4 总结 单变量非线性变换是机器学习数据预处理中的一项重要技术,它通过对单个特征应用非线性函数来调整数据的分布形式,从而提升模型的性能。本章介绍了对数变换、指数变换、多项式变换和Box-Cox变换等常见方法,并通过Python实例展示了它们的实现过程。在实际应用中,选择何种变换方法需要根据数据的具体情况和模型的需求来决定。通过合理地应用单变量非线性变换,我们可以有效地提升数据的质量,为后续的机器学习建模奠定坚实的基础。
上一篇:
4.3 交互特征与多项式特征
下一篇:
4.5 自动化特征选择
该分类下的相关小册推荐:
实战Python网络爬虫
Python编程轻松进阶(二)
Python合辑8-变量和运算符
Python与办公-玩转Word
Python合辑6-字典专题
Python甚础Django与爬虫
Python合辑9-判断和循环
Python编程轻松进阶(四)
Python与办公-玩转PPT
剑指Python(磨刀不误砍柴工)
剑指Python(万变不离其宗)
Python合辑1-Python语言基础