(Scikit-Learn)特征工程:分类特征,文本特征,衍生特征,缺省值填充,管道特征

本文主要是介绍(Scikit-Learn)特征工程:分类特征,文本特征,衍生特征,缺省值填充,管道特征,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

特征工程
(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)。因此,这样映射编码可能 会让人觉得存在 Queen Anne < Fremont < Wallingford,甚至还有 Wallingford - Queen Anne = Fremont,这显然是没有意义的

常用的解决方法是独热编码。它可以有效增加额外的列,让 0 和 1 出现在 对应的列分别表示每个分类值有或无。当你的数据是像上面那样的字典列表时,用 ScikitLearn 的 DictVectorizer 类就可以实现:

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

在这里插入图片描述
如果要看每一列的含义,可以用下面的代码查看特征名称:

vec.get_feature_names()

在这里插入图片描述
但这种方法也有一个显著的缺陷:如果你的分类特征有许多枚举值,那么数据集的维度就 会急剧增加。然而,由于被编码的数据中有许多 0,因此用稀疏矩阵表示会非常高效:

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

在这里插入图片描述
(2)文本特征
单词统计:给你几个文本,让你统计每个词出现的次数,然后放到表格中
用 Scikit-Learn 的 CountVectorizer 更是可以轻松实现:

sample = ['problem of evil','evil queen','horizon problem']
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())

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

TF-IDF的值与词在各个文档中的常见程度成反比

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

在这里插入图片描述
(3)衍生特征
一种有用的特征是输入特征经过数学变换衍生出来的新特征。
将一个线性回归转换成多项式回归时,并不是通过改变模型来实现,而是通过改变输入数据!

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

%matplotlib inline
import numpy as np
import matplotlib.pyplot as pltx = np.array([1,2,3,4,5])
y = np.array([4,2,1,3,7])
plt.scatter(x,y)

在这里插入图片描述
用 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)

在这里插入图片描述
对数据进行变换,并增加额外的特征来提升模型的复杂度。例如,可以在数据中增加多项式特征:

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

在这里插入图片描述
在衍生特征矩阵中,第 1 列表示 x,第 2 列表示 x2,第 3 列表示 x3。通过对这个扩展的输 入矩阵计算线性回归,就可以获得更接近原始数据的结果了

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

在这里插入图片描述
(4)缺失值填充

有如下一个数据集, NaN 通常用来表示缺失值。

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

在这里插入图片描述
(5)特征管道
如果经常需要手动应用前文介绍的任意一种方法,你很快就会感到厌倦,尤其是当你需要 将多个步骤串起来使用时。你要不断的对数据进行处理,不断的fit_transform…

可以通过定义一个管道对象(即一个对数据的执行序列流水线),之后模型会按照序列的顺序,依次执行序列中的操作 例如,我们可能需要对一些数据做如下操作。
(1) 用均值填充缺失值。
(2) 将衍生特征转换为二次方。
(3) 拟合线性回归模型。

from sklearn.pipeline import make_pipeline
model = make_pipeline(Imputer(strategy='mean'),PolynomialFeatures(degree=2),LinearRegression())
model.fit(X,y)#X带有缺省值
print(y)
print(model.predict(X))

在这里插入图片描述

这篇关于(Scikit-Learn)特征工程:分类特征,文本特征,衍生特征,缺省值填充,管道特征的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/679440

相关文章

C++20管道运算符的实现示例

《C++20管道运算符的实现示例》本文简要介绍C++20管道运算符的使用与实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧... 目录标准库的管道运算符使用自己实现类似的管道运算符我们不打算介绍太多,因为它实际属于c++20最为重要的

MySQL中的索引结构和分类实战案例详解

《MySQL中的索引结构和分类实战案例详解》本文详解MySQL索引结构与分类,涵盖B树、B+树、哈希及全文索引,分析其原理与优劣势,并结合实战案例探讨创建、管理及优化技巧,助力提升查询性能,感兴趣的朋... 目录一、索引概述1.1 索引的定义与作用1.2 索引的基本原理二、索引结构详解2.1 B树索引2.2

HTML5 中的<button>标签用法和特征

《HTML5中的<button>标签用法和特征》在HTML5中,button标签用于定义一个可点击的按钮,它是创建交互式网页的重要元素之一,本文将深入解析HTML5中的button标签,详细介绍其属... 目录引言<button> 标签的基本用法<button> 标签的属性typevaluedisabled

Python中图片与PDF识别文本(OCR)的全面指南

《Python中图片与PDF识别文本(OCR)的全面指南》在数据爆炸时代,80%的企业数据以非结构化形式存在,其中PDF和图像是最主要的载体,本文将深入探索Python中OCR技术如何将这些数字纸张转... 目录一、OCR技术核心原理二、python图像识别四大工具库1. Pytesseract - 经典O

苹果macOS 26 Tahoe主题功能大升级:可定制图标/高亮文本/文件夹颜色

《苹果macOS26Tahoe主题功能大升级:可定制图标/高亮文本/文件夹颜色》在整体系统设计方面,macOS26采用了全新的玻璃质感视觉风格,应用于Dock栏、应用图标以及桌面小部件等多个界面... 科技媒体 MACRumors 昨日(6 月 13 日)发布博文,报道称在 macOS 26 Tahoe 中

Python实现精准提取 PDF中的文本,表格与图片

《Python实现精准提取PDF中的文本,表格与图片》在实际的系统开发中,处理PDF文件不仅限于读取整页文本,还有提取文档中的表格数据,图片或特定区域的内容,下面我们来看看如何使用Python实... 目录安装 python 库提取 PDF 文本内容:获取整页文本与指定区域内容获取页面上的所有文本内容获取

MySQL 衍生表(Derived Tables)的使用

《MySQL衍生表(DerivedTables)的使用》本文主要介绍了MySQL衍生表(DerivedTables)的使用,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学... 目录一、衍生表简介1.1 衍生表基本用法1.2 自定义列名1.3 衍生表的局限在SQL的查询语句select

MySQL 横向衍生表(Lateral Derived Tables)的实现

《MySQL横向衍生表(LateralDerivedTables)的实现》横向衍生表适用于在需要通过子查询获取中间结果集的场景,相对于普通衍生表,横向衍生表可以引用在其之前出现过的表名,本文就来... 目录一、横向衍生表用法示例1.1 用法示例1.2 使用建议前面我们介绍过mysql中的衍生表(From子句

MyBatis Plus 中 update_time 字段自动填充失效的原因分析及解决方案(最新整理)

《MyBatisPlus中update_time字段自动填充失效的原因分析及解决方案(最新整理)》在使用MyBatisPlus时,通常我们会在数据库表中设置create_time和update... 目录前言一、问题现象二、原因分析三、总结:常见原因与解决方法对照表四、推荐写法前言在使用 MyBATis

详解如何使用Python从零开始构建文本统计模型

《详解如何使用Python从零开始构建文本统计模型》在自然语言处理领域,词汇表构建是文本预处理的关键环节,本文通过Python代码实践,演示如何从原始文本中提取多尺度特征,并通过动态调整机制构建更精确... 目录一、项目背景与核心思想二、核心代码解析1. 数据加载与预处理2. 多尺度字符统计3. 统计结果可