【Python数据科学手册】专题:特征工程

简介: 本节将介绍特征工程的一些常见示例:表示分类数据的特征、表示文本的特征和表示图像的特征。另外,还会介绍提高模型复杂度的衍生特征和处理缺失数据的填充方法。这个过程通常被称为向量化,因为它把任意格式的数据转换成具有良好特性的向量形式。

本节将介绍特征工程的一些常见示例:表示分类数据的特征、表示文本的特征和表示图像的特征。另外,还会介绍提高模型复杂度的衍生特征和处理缺失数据的填充方法。这个过程通常被称为向量化,因为它把任意格式的数据转换成具有良好特性的向量形式。

1、分类数据

一种常见的非数值数据类型是分类数据。例如,浏览房屋数据的时候,除了看到“房价”(price)和“面积”(rooms)之类的数值特征,还会有“地点”(neighborhood)信息,数据可能像这样:

data = [
{'price': 850000, 'rooms': 4, 'neighborhood': 'Queen Anne'},
{'price': 700000, 'rooms': 3, 'neighborhood': 'Fremont'},
{'price': 650000, 'rooms': 3, 'neighborhood': 'Wallingford'},
{'price': 600000, 'rooms': 2, 'neighborhood': 'Fremont'}
]

你可能会把分类特征用映射关系编码成整数:

{'Queen Anne': 1, 'Fremont': 2, 'Wallingford': 3};

在Scikit-Learn 中这么做并不是一个好办法:这个程序包的所有模块都有一个基本假设,那就是数值特征可以反映代数量(algebraic quantities)。因此,这样映射编码可能会让人觉得存在

image.png

甚至还有
image.png

这显然是没有意义的。

面对这种情况,常用的解决方法是独热编码。

它可以有效增加额外的列,让0 和1 出现在对应的列分别表示每个分类值有或无。当你的数据是像上面那样的字典列表时,用Scikit-Learn 的DictVectorizer 类就可以实现:

from sklearn.feature_extraction import DictVectorizer
vec = DictVectorizer(sparse=False, dtype=int)
vec.fit_transform(data)

image.png

neighborhood 字段转换成三列来表示三个地点标签,每一行中用1 所在的列对应一个地点。当这些分类特征编码之后,你就可以和之前一样拟合Scikit-Learn 模型了:

如果要看每一列的含义,可以用下面的代码查看特征名称

vec.get_feature_names()

image.png

如果你的分类特征有许多枚举值,那么数据集的维度就会急剧增加。然而,由于被编码的数据中有许多0,因此用稀疏矩阵表示会非常高效:

vec = DictVectorizer(sparse=True, dtype=int)
vec.fit_transform(data)

image.png

在拟合和评估模型时,Scikit-Learn 的许多(并非所有)评估器都支持稀疏矩阵输入。sklearn.preprocessing.OneHotEncoder 和sklearn.feature_extraction.FeatureHasher 是Scikit-Learn 另外两个为分类特征编码的工具。

2、文本特征

另一种常见的特征工程需求是将文本转换成一组数值。例如,绝大多数社交媒体数据的自动化采集,都是依靠将文本编码成数字的技术手段。数据采集最简单的编码方法之一就是单词统计。

sample = ['problem of evil',
          'evil queen',
          'horizon problem']

面对单词统计的数据向量化问题时,可以创建一个列来表示单词“problem”、单词“evil”和单词“horizon”等。虽然手动做也可以,但是用Scikit-Learn 的CountVectorizer 更是可以轻松实现:

from sklearn.feature_extraction.text import CountVectorizer

vec = CountVectorizer()
X = vec.fit_transform(sample)
X

结果是一个稀疏矩阵,里面记录了每个短语中每个单词的出现次数。用带列标签的DataFrame 来表示这个稀疏矩阵

import pandas as pd
pd.DataFrame(X.toarray(), columns=vec.get_feature_names())

image.png

不过这种统计方法也有一些问题:原始的单词统计会让一些常用词聚集太高的权重,在分类算法中这样并不合理。解决这个问题的方法就是通过TF–IDF(term frequency–inversedocument frequency,词频逆文档频率),通过单词在文档中出现的频率来衡量其权重

from sklearn.feature_extraction.text import TfidfVectorizer
vec = TfidfVectorizer()
X = vec.fit_transform(sample)
pd.DataFrame(X.toarray(), columns=vec.get_feature_names())

image.png

3、图像特征

机器学习还有一种常见需求,那就是对图像进行编码。我们在处理手写数字图像时使用的方法,也是最简单的图像编码方法:用像素表示图像。

但是在其他类型的任务中,这类方法可能不太合适。虽然完整地介绍图像特征的提取技术超出了本章的范围,但是你可以在Scikit-Image 项目(http://scikit-image.org)中找到许多标准方法的高品质实现。关于同时使用Scikit-Learn 和Scikit-Image 的示例,请参见应用 人脸识别管道。

4、衍生特征

还有一种有用的特征是输入特征经过数学变换衍生出来的新特征。

将一个线性回归转换成多项式回归时,并不是通过改变模型来实现,而是通过改变输入数据!这种处理方式有时被称为基函数回归(basis function regression)。

例如,下面的数据显然不能用一条直线描述

%matplotlib inline
import numpy as np
import matplotlib.pyplot as plt

x = np.array([1, 2, 3, 4, 5])
y = np.array([4, 2, 1, 3, 7])
plt.scatter(x, y);

image.png

但是我们仍然用LinearRegression 拟合出一条直线,并获得直线的最优解:

from sklearn.linear_model import LinearRegression
X = x[:, np.newaxis]
model = LinearRegression().fit(X, y)
yfit = model.predict(X)
plt.scatter(x, y)
plt.plot(x, yfit);

image.png
很显然,我们需要用一个更复杂的模型来描述x 与y 的关系。可以对数据进行变换,并增加额外的特征来提升模型的复杂度。例如,可以在数据中增加多项式特征:

from sklearn.preprocessing import PolynomialFeatures
poly = PolynomialFeatures(degree=3, include_bias=False)
X2 = poly.fit_transform(X)
print(X2)

image.png

在衍生特征矩阵中,第1 列表示 x;

第2列表示 x²;

第3 列表示 x³;

通过对这个扩展的输入矩阵计算线性回归,就可以获得更接近原始数据的结果了。

model = LinearRegression().fit(X2, y)
yfit = model.predict(X2)
plt.scatter(x, y)
plt.plot(x, yfit);

image.png

这种不通过改变模型,而是通过变换输入来改善模型效果的理念,正是许多更强大的机器学习方法的基础。

5、缺失值填充

特征工程中还有一种常见需求是处理缺失值。例如,有如下一个数据集:

from numpy import nan
X = np.array([[ nan, 0,   3  ],
              [ 3,   7,   9  ],
              [ 3,   5,   2  ],
              [ 4,   nan, 6  ],
              [ 8,   8,   1  ]])
y = np.array([14, 16, -1,  8, -5])

当将一个普通的机器学习模型应用到这份数据时,首先需要用适当的值替换这些缺失数据。这个操作被称为缺失值填充,相应的策略很多,有的简单(例如用列均值替换缺失值),有的复杂(例如用矩阵填充或其他模型来处理缺失值)。

对于一般的填充方法,如均值、中位数、众数,Scikit-Learn 有Imputer 类可以实现:

from sklearn.preprocessing import Imputer
imp = Imputer(strategy='mean')
X2 = imp.fit_transform(X)
X2

image.png
结果矩阵中的两处缺失值都被所在列剩余数据的均值替代了。这个被填充的数据就可以直接放到评估器里训练了,例如LinearRegression 评估器:

model = LinearRegression().fit(X2, y)
model.predict(X2)

image.png

6、特征管道

如果经常需要手动应用前文介绍的任意一种方法,你很快就会感到厌倦,尤其是当你需要将多个步骤串起来使用时。例如,我们可能需要对一些数据做如下操作。

用均值填充缺失值。

将衍生特征转换为二次方。

拟合线性回归模型。

Scikit-Learn 提供了一个管道对象,如下所示:

from sklearn.pipeline import make_pipeline

model = make_pipeline(Imputer(strategy='mean'),
                      PolynomialFeatures(degree=2),
                      LinearRegression())

这个管道看起来就像一个标准的Scikit-Learn 对象,可以对任何输入数据进行所有步骤的处理:

model.fit(X, y)  # X with missing values, from above
print(y)
print(model.predict(X))

image.png

这样的话,所有的步骤都会自动完成。请注意,出于简化演示考虑,将模型应用到已经训练过的数据上,模型能够非常完美地预测结果。

目录
相关文章
|
2月前
|
机器学习/深度学习 数据可视化 数据处理
从基础到进阶:探索Python在数据科学中的应用
【10月更文挑战第18天】从基础到进阶:探索Python在数据科学中的应用
42 1
|
2月前
|
机器学习/深度学习 数据采集 数据可视化
Python 数据分析:从零开始构建你的数据科学项目
【10月更文挑战第9天】Python 数据分析:从零开始构建你的数据科学项目
57 2
|
17天前
|
机器学习/深度学习 数据采集 数据可视化
Python在数据科学中的应用:从入门到实践
本文旨在为读者提供一个Python在数据科学领域应用的全面概览。我们将从Python的基础语法开始,逐步深入到数据处理、分析和可视化的高级技术。文章不仅涵盖了Python中常用的数据科学库,如NumPy、Pandas和Matplotlib,还探讨了机器学习库Scikit-learn的使用。通过实际案例分析,本文将展示如何利用Python进行数据清洗、特征工程、模型训练和结果评估。此外,我们还将探讨Python在大数据处理中的应用,以及如何通过集成学习和深度学习技术来提升数据分析的准确性和效率。
|
18天前
|
机器学习/深度学习 数据可视化 数据处理
Python数据科学:从基础到实战
Python数据科学:从基础到实战
25 1
|
20天前
|
算法 Python
Python 大神修炼手册:图的深度优先&广度优先遍历,深入骨髓的解析
在 Python 编程中,掌握图的深度优先遍历(DFS)和广度优先遍历(BFS)是进阶的关键。这两种算法不仅理论重要,还能解决实际问题。本文介绍了图的基本概念、邻接表表示方法,并给出了 DFS 和 BFS 的 Python 实现代码示例,帮助读者深入理解并应用这些算法。
28 2
|
28天前
|
机器学习/深度学习 数据可视化 数据处理
Python在数据科学中的应用###
本文探讨了Python语言在数据科学领域的广泛应用及其重要性。通过分析Python的简洁语法、强大的库支持和跨平台特性,阐述了为何Python成为数据科学家的首选工具。文章还介绍了Python在数据处理、分析和可视化方面的具体应用实例,展示了其在提升工作效率和推动科学研究方面的巨大潜力。最后,讨论了未来Python在数据科学领域的发展趋势和挑战。 ###
|
1月前
|
机器学习/深度学习 分布式计算 数据可视化
Python在数据科学中的应用与挑战
本文探讨了Python编程语言在数据科学领域的广泛应用及其面临的主要挑战。Python因其简洁的语法、强大的库支持和活跃的社区,已成为数据科学家的首选工具。然而,随着数据量的激增和复杂性的增加,Python也面临着性能瓶颈、内存管理等问题。本文将通过具体案例分析,展示Python在数据处理、分析和可视化方面的优势,同时讨论如何克服其在大规模数据处理中的局限性,为读者提供实用的解决方案和优化建议。
|
3月前
|
机器学习/深度学习 算法 数据可视化
8种数值变量的特征工程技术:利用Sklearn、Numpy和Python将数值转化为预测模型的有效特征
特征工程是机器学习流程中的关键步骤,通过将原始数据转换为更具意义的特征,增强模型对数据关系的理解能力。本文重点介绍处理数值变量的高级特征工程技术,包括归一化、多项式特征、FunctionTransformer、KBinsDiscretizer、对数变换、PowerTransformer、QuantileTransformer和PCA,旨在提升模型性能。这些技术能够揭示数据中的潜在模式、优化变量表示,并应对数据分布和内在特性带来的挑战,从而提高模型的稳健性和泛化能力。每种技术都有其独特优势,适用于不同类型的数据和问题。通过实验和验证选择最适合的变换方法至关重要。
47 5
8种数值变量的特征工程技术:利用Sklearn、Numpy和Python将数值转化为预测模型的有效特征
|
2月前
|
JSON 数据可视化 API
玩转数据科学:Python实战分析天气预报变动趋势
【10月更文挑战第1天】随着气候变化对日常生活的影响日益显著,理解和预测天气模式变得越来越重要。本文将引导您如何使用Python来抓取和分析天气预报数据,从而揭示天气变化的趋势。我们将介绍从获取公开气象API的数据到清洗、处理以及可视化整个过程的技术方法。
205 2
|
3月前
|
机器学习/深度学习 数据可视化 TensorFlow
探索Python在数据科学中的应用
这篇文章深入探讨了Python编程语言在数据科学领域的强大应用。从数据处理、分析到可视化,再到机器学习和深度学习,Python因其丰富的库和框架而成为数据科学家的首选工具。文章不仅介绍了Python的基本语法和数据结构,还详细讨论了如何使用Pandas进行数据清洗和预处理,以及NumPy和SciPy在数值计算中的重要性。此外,文章还涵盖了使用Matplotlib和Seaborn进行数据可视化的技巧,以及Scikit-learn和TensorFlow在构建预测模型中的应用。通过综合运用这些工具,数据科学家能够更有效地分析大量复杂的数据集,从而洞察趋势、模式和关联性,支持决策制定和策略优化。
55 2