【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

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

目录
相关文章
|
11天前
|
机器学习/深度学习 数据可视化 数据处理
从基础到进阶:探索Python在数据科学中的应用
【10月更文挑战第18天】从基础到进阶:探索Python在数据科学中的应用
27 1
|
20天前
|
机器学习/深度学习 数据采集 数据可视化
Python 数据分析:从零开始构建你的数据科学项目
【10月更文挑战第9天】Python 数据分析:从零开始构建你的数据科学项目
43 2
|
2月前
|
机器学习/深度学习 数据可视化 数据挖掘
探索Python的奥秘:数据科学中的利器
本文将深入探讨Python编程语言在数据科学领域的强大应用。通过简洁易懂的语言,我们将解析Python的核心概念、流行库以及在实际项目中的应用,帮助您理解为何Python成为数据科学家的首选工具。
55 0
|
4天前
|
机器学习/深度学习 数据可视化 数据处理
Python在数据科学中的应用###
本文探讨了Python语言在数据科学领域的广泛应用及其重要性。通过分析Python的简洁语法、强大的库支持和跨平台特性,阐述了为何Python成为数据科学家的首选工具。文章还介绍了Python在数据处理、分析和可视化方面的具体应用实例,展示了其在提升工作效率和推动科学研究方面的巨大潜力。最后,讨论了未来Python在数据科学领域的发展趋势和挑战。 ###
|
7天前
|
机器学习/深度学习 分布式计算 数据可视化
Python在数据科学中的应用与挑战
本文探讨了Python编程语言在数据科学领域的广泛应用及其面临的主要挑战。Python因其简洁的语法、强大的库支持和活跃的社区,已成为数据科学家的首选工具。然而,随着数据量的激增和复杂性的增加,Python也面临着性能瓶颈、内存管理等问题。本文将通过具体案例分析,展示Python在数据处理、分析和可视化方面的优势,同时讨论如何克服其在大规模数据处理中的局限性,为读者提供实用的解决方案和优化建议。
|
2月前
|
机器学习/深度学习 算法 数据可视化
8种数值变量的特征工程技术:利用Sklearn、Numpy和Python将数值转化为预测模型的有效特征
特征工程是机器学习流程中的关键步骤,通过将原始数据转换为更具意义的特征,增强模型对数据关系的理解能力。本文重点介绍处理数值变量的高级特征工程技术,包括归一化、多项式特征、FunctionTransformer、KBinsDiscretizer、对数变换、PowerTransformer、QuantileTransformer和PCA,旨在提升模型性能。这些技术能够揭示数据中的潜在模式、优化变量表示,并应对数据分布和内在特性带来的挑战,从而提高模型的稳健性和泛化能力。每种技术都有其独特优势,适用于不同类型的数据和问题。通过实验和验证选择最适合的变换方法至关重要。
43 5
8种数值变量的特征工程技术:利用Sklearn、Numpy和Python将数值转化为预测模型的有效特征
|
28天前
|
JSON 数据可视化 API
玩转数据科学:Python实战分析天气预报变动趋势
【10月更文挑战第1天】随着气候变化对日常生活的影响日益显著,理解和预测天气模式变得越来越重要。本文将引导您如何使用Python来抓取和分析天气预报数据,从而揭示天气变化的趋势。我们将介绍从获取公开气象API的数据到清洗、处理以及可视化整个过程的技术方法。
93 2
|
2月前
|
机器学习/深度学习 数据可视化 TensorFlow
探索Python在数据科学中的应用
这篇文章深入探讨了Python编程语言在数据科学领域的强大应用。从数据处理、分析到可视化,再到机器学习和深度学习,Python因其丰富的库和框架而成为数据科学家的首选工具。文章不仅介绍了Python的基本语法和数据结构,还详细讨论了如何使用Pandas进行数据清洗和预处理,以及NumPy和SciPy在数值计算中的重要性。此外,文章还涵盖了使用Matplotlib和Seaborn进行数据可视化的技巧,以及Scikit-learn和TensorFlow在构建预测模型中的应用。通过综合运用这些工具,数据科学家能够更有效地分析大量复杂的数据集,从而洞察趋势、模式和关联性,支持决策制定和策略优化。
44 2
|
2月前
|
API 开发者 Python
Python高手修炼手册:精通文件系统操作,掌控I/O管理,提升编程效率
在Python编程中,从初学者成长为高手,关键在于深入理解底层细节并熟练运用高效工具。本文通过对比分析,探讨如何从基础出发,逐步精通文件系统操作与I/O管理,显著提升编程效率。文件系统操作方面,pathlib模块相较于传统的os和os.path模块更为直观易用;在I/O管理上,异步I/O相比同步I/O能大幅提升程序的并发能力和响应速度。通过这些技巧,开发者不仅能优化代码结构,还能预见并解决潜在性能问题,实现从细节到全局的全面提升。
26 3
|
30天前
|
存储 IDE 开发工具
编写Python参考手册速查软件(一)
编写Python参考手册速查软件(一)
40 0