【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

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

目录
相关文章
|
1天前
|
数据采集 机器学习/深度学习 数据可视化
Python 在数据科学中的应用
这篇文章将深入探讨 Python 在数据科学中的多种应用,包括数据清洗、数据分析、可视化及机器学习。我们将通过实例展示如何利用 Python 的强大库和工具,如 Pandas、NumPy、Matplotlib、Seaborn 以及 Scikit-learn,来高效地进行数据处理与分析。无论您是初学者还是有经验的开发者,这篇文章都能为您提供宝贵的见解和实用技巧。
|
22天前
|
程序员 测试技术 开发工具
豆瓣评分7.9!世界级讲师耗时5年整理出的Python学习手册!
Python是一门流行的开源编程语言,广泛用于各个领域的独立程序与脚本化应用中。它不仅免费、可移植、功能强大,同时相对简单,而且使用起来充满乐趣。从软件业界的任意一角到来的程序员,都会发现Python着眼于开发者的生产效率以及软件质量,因此无论你的项目是大还是小,选择Python都将带来战略性的优势。 今天给小伙伴们分享的这份手册讲述了完整的Python语言,力争满足“语言”和“原理”两个方面的需求,并拥有足够的深度以便实用。废话不多说,下面展示给大家。
|
24天前
|
算法 数据挖掘 数据处理
豆瓣评分8.7!Python pandas创始人亲码的数据分析入门手册!
在众多解释型语言中,Python最大的特点是拥有一个巨大而活跃的科学计算社区。进入21世纪以来,在行业应用和学术研究中采用python进行科学计算的势头越来越猛。 近年来,由于Python有不断改良的库(主要是pandas),使其成为数据处理任务的一大代替方案,结合其在通用编程方面的强大实力,完全可以只使用Python这一种语言去构建以数据为中心的应用程序。 作为一个科学计算平台,Python的成功源于能够轻松的集成C、C++以及Fortran代码。大部分现代计算机环境都利用了一些Fortran和C库来是西安线性代数、优选、积分、快速傅里叶变换以及其他诸如此类的算法。
|
25天前
|
算法 数据挖掘 数据处理
豆瓣评分8.7!Python pandas创始人亲码的数据分析入门手册!
在众多解释型语言中,Python最大的特点是拥有一个巨大而活跃的科学计算社区。进入21世纪以来,在行业应用和学术研究中采用python进行科学计算的势头越来越猛。 近年来,由于Python有不断改良的库(主要是pandas),使其成为数据处理任务的一大代替方案,结合其在通用编程方面的强大实力,完全可以只使用Python这一种语言去构建以数据为中心的应用程序。 作为一个科学计算平台,Python的成功源于能够轻松的集成C、C++以及Fortran代码。大部分现代计算机环境都利用了一些Fortran和C库来是西安线性代数、优选、积分、快速傅里叶变换以及其他诸如此类的算法。
|
30天前
|
数据采集 数据可视化 算法
GitHub星标68K!Python数据分析入门手册带你从数据获取到可视化
Python作为一门优秀的编程语言,近年来受到很多编程爱好者的青睐。一是因为Python本身具有简捷优美、易学易用的特点;二是由于互联网的飞速发展,我们正迎来大数据的时代,而Python 无论是在数据的采集与处理方面,还是在数据分析与可视化方面都有独特的优势。我们可以利用 Python 便捷地开展与数据相关的项目,以很低的学习成本快速完成项目的研究。
|
1月前
|
数据采集 数据可视化 算法
GitHub星标68K!Python数据分析入门手册带你从数据获取到可视化
Python作为一门优秀的编程语言,近年来受到很多编程爱好者的青睐。一是因为Python本身具有简捷优美、易学易用的特点;二是由于互联网的飞速发展,我们正迎来大数据的时代,而Python 无论是在数据的采集与处理方面,还是在数据分析与可视化方面都有独特的优势。我们可以利用 Python 便捷地开展与数据相关的项目,以很低的学习成本快速完成项目的研究。 今天给小伙伴们分享的这份Python数据分析入门手册本着实用性的目的,着眼于整个数据分析的流程,介绍了从数据采集到可视化的大致流程。
|
1月前
|
机器学习/深度学习 数据采集 数据可视化
使用Python进行数据科学入门指南
【8月更文挑战第6天】使用Python进行数据科学是一条充满挑战和机遇的道路。本文提供了入门指南,帮助您快速上手Python数据科学。通过实践项目和资源推荐,您将能够深入学习Python数据科学,成为一名合格的数据科学家。
|
1月前
|
机器学习/深度学习 算法 数据可视化
Python数据分析高手修炼手册:线性回归算法,让你的数据说话更有力
【8月更文挑战第1天】在数据驱动时代,掌握数据分析技能至关重要。线性回归是最基础且强大的工具之一,能从复杂数据中提炼简单有效的模型。本文探索Python中线性回归的应用并通过实战示例加深理解。线性回归建立变量间线性关系模型:Y = β0 + β1*X + ε。使用scikit-learn库进行实战:首先安装必要库,然后加载数据、训练模型并评估性能。示例展示了如何使用`LinearRegression`模型进行房价预测,包括数据可视化。掌握线性回归,让数据“说话”更有力。
27 2
|
2月前
|
机器学习/深度学习 数据采集 IDE
使用Python进行数据科学探索
【7月更文挑战第30天】通过本文,我们了解了如何使用Python进行数据科学探索的全过程,从环境搭建、数据收集、清洗、分析到机器学习应用。Python的强大功能和丰富的库使得数据科学探索变得简单而高效。希望这篇文章能为您的数据科学之旅提供有价值的参考。随着实践的深入,您将逐渐掌握更多高级技术和方法,解锁数据背后的无限潜力。
|
2月前
|
API Python
Python高手修炼手册:精通文件系统操作,掌控I/O管理,提升编程效率
【7月更文挑战第30天】在 Python 编程中, 文件系统操作与 I/O 管理是连接程序与数据的关键。初学者常因路径错误和权限问题受挫, 而高手能自如管理文件。传统 `os` 和 `os.path` 模块易出错, `pathlib` 提供了更直观的对象导向 API。I/O 方面, 同步操作会阻塞程序, 异步 (如使用 `aiofiles`) 则能大幅提升并发能力。真正的高手不仅掌握 API, 更能预见性能瓶颈并优化代码, 实现高效与优雅。
24 1