数据的特征工程

                                            数据的特征工程

1 什么是数据的特征工程

特征工程是将原始数据转换为更好地代表预测模型的潜在问题的特征的过程,从而提高了对未知数据的模型准确性。

特征工程的意义:将直接影响模型的预测结果。

2 数据的来源与类型

2.1 数据的来源

企业日益积累的大量数据,各大机构的实验数据等等。总之数据无处不在,大都是可用的。

2.2 数据的类型

按照机器学习的数据分类分成:

           标称型:目标变量的结果只在有限目标集中取值,如真与假(标称型目标变量主要用于分类)

           数值型:目标变量则可以从无限的数值集合中取值,如0.100,42.001等 (数值型目标变量主要用于回归分析)

按照数据的本身分布特性:

           离散型:其数值只能用自然数或整数单位计算的则为离散变量.例如,班级人数、进球个数、是否是某个类别等等

           连续型:是指在指定区间内可以是任意一个数值,例如,票房数据、花瓣大小分布数据

总结:离散型是区间内不可分,连续型是区间内可分

3 数据特征的抽取

现实世界中多数特征都不是连续变量,比如分类、文字、图像等,为了对非连续变量做特征表述,需要对这些特征做数学化表述,就是特征提取。

特征抽取针对非连续型数据,文本等进行特征值化,是为了计算机更好的去理解数据。

 sklearn.feature_extraction提供了特征提取的很多方法

3.1 分类(字典)特征变量抽取

类:sklearn.feature_extraction.DictVectorizer

语法:DictVectorizer(sparse=True,…) 将映射列表转换为Numpy数组或scipy.sparse矩阵。sparse 是否转换为scipy.sparse矩阵表示,默认开启

DictVectorizer.fit_transform(X,y)    应用并转化映射列表X,y为目标类型。X:字典或者包含字典的迭代器 返回值:返回sparse矩阵
DictVectorizer.inverse_transform(X,[, dict_type])将Numpy数组或scipy.sparse矩阵转换为映射列表X:array数组或者sparse矩阵 返回值:转换之前数据格式
DictVectorizer.get_feature_names()返回类别名称
DictVectorizer.transform(X)  按照原先的标准转换

sparse矩阵:节约内存,方便读取处理

使用流程:①实例化类DictVectorizer

②调用fit_transform方法输入数据并转换

举例结果
from sklearn.feature_extraction import DictVectorizer
dict = DictVectorizer()
example = [{'city': '北京','temperature':30},{'city': '上海','temperature':35},{'city': '深圳','temperature':38}]
data = dict.fit_transform(example)
print(data)
print(type(data))

sparse矩阵:(0,1) 1.0  第一个行的第1个位置的值为1.0

from sklearn.feature_extraction import DictVectorizer
dict = DictVectorizer(sparse=False)
example = [{'city': '北京','temperature':30},{'city': '上海','temperature':35},{'city': '深圳','temperature':38}]
data = dict.fit_transform(example)
print(data)
print(type(data))
修改parse,转换为ndarray矩阵
from sklearn.feature_extraction import DictVectorizer
dict = DictVectorizer()
example = [{'city': '北京','temperature':30},{'city': '上海','temperature':35},{'city': '深圳','temperature':38}]
data = dict.fit_transform(example).toarray()
data1 = dict.inverse_transform(data)
print(dict.get_feature_names())
print(data)
print(type(data))
print(data1)

3.2 one-hot编码

如上图所示的句为one-hot编码,又称为一位有效编码,主要是采用N位状态寄存器来对N个状态进行编码,每个状态都由他独立的寄存器位,并且在任意时候只有一位有效。one-hot编码是分类变量作为二进制向量的表示。这首先要求将分类值映射到整数值。然后,每个整数值被表示为二进制向量,除了整数的索引之外,它都是零值,它被标记为1。

one-hot适用于处理离散型数据:在回归,分类,聚类等机器学习算法中,特征之间距离的计算或相似度的计算是非常重要的,而我们常用的距离或相似度的计算都是在欧式空间的相似度计算。而我们使用one-hot编码,将离散特征的取值扩展到了欧式空间,离散特征的某个取值就对应欧式空间的某个点。将离散型特征使用one-hot编码,确实会让特征之间的距离计算更加合理。比如,有一个离散型特征,代表工作类型,该离散型特征,共有三个取值,不使用one-hot编码,其表示分别是x_1 = (1), x_2 = (2), x_3 = (3)。两个工作之间的距离是,(x_1, x_2) = 1, d(x_2, x_3) = 1, d(x_1, x_3) = 2。那么x_1和x_3工作之间就越不相似吗。显然这样的表示,计算出来的特征的距离是不合理。那如果使用one-hot编码,则得到x_1 = (1, 0, 0), x_2 = (0, 1, 0), x_3 = (0, 0, 1),那么两个工作之间的距离就都是sqrt(2).即每两个工作之间的距离是一样的,显得更合理。

one-hot有自己的意义,但是在机器学习中的意义就是为了把类别型的特征转换成one-hot编码格式利于进行分析

3.3 文本特征抽取

文本特征抽取就是对文本数据进行特征值化,应用于很多方面,比如说文档分类、垃圾邮件分类和新闻分类。那么文本分类是通过词是否存在、以及词的概率(重要性)来表示。

类:sklearn.feature_extraction.text.CountVectorizer

CountVectorizer语法:CountVectorizer(max_df=1.0,min_df=1,…) 返回词频矩阵

常用方法:

CountVectorizer.fit_transform(X,y)      X:文本或者包含文本字符串的可迭代对象 返回值:返回sparse矩阵
CountVectorizer.inverse_transform(X)X:array数组或者sparse矩阵 返回值:转换之前数据格式
CountVectorizer.get_feature_names()返回值:单词列表

流程:①实例化类CountVectorizer

②调用fit_transform方法输入数据并转换

注意返回格式,利用toarray()进行sparse矩阵转换array数组或修改sparse属性为false

from sklearn.feature_extraction.text import CountVectorizervector = CountVectorizer()
content = ["use a class CountVectorizer good good study","in order to feature abstraction day day up"]
data = vector.fit_transform(content).toarray()
print(vector.get_feature_names())
print(data)

由结果可知,①统计文章中所有的词,重复的值看做一次;

②对于每篇文章,在词的列表中进行统计每个词出现的次数

③单个字母不统计

3.4 中文特征值化

中文的话要先进行分词才能详细的进行特征值化处理

中文特征值流程:

①准备句子,利用jieba.cut进行分词

①实例化类CountVectorizer

②将分词结果变成字符串当作fit_transform的输入值

from sklearn.feature_extraction.text import CountVectorizer
import jieba
vector = CountVectorizer()
#分词
content1 = jieba.cut("好好学习天天向上")
content2 = jieba.cut("命运是掌握在自己手中的")
content3 = jieba.cut("我就是我,不一样的烟花")
print(content1)
#转换成列表,并拼接成字符串
c1 = ' '.join(list(content1))
c2 = ' '.join(list(content2))
c3 = ' '.join(list(content3))
data = vector.fit_transform([c1,c2,c3]).toarray()
print(vector.get_feature_names())
print(data)

单个字不统计

3.5 TF-IDF

TF(term frequency词的频率):统计每篇文章词出现的次数

IDF(inverse document frequency逆文档频率):log(总文档数量/该词出现的文档次数)

TF-IDF的主要思想是:如果某个词或短语在一篇文章中出现的概率高, 并且在其他文章中很少出现,则认为此词或者短语具有很好的类别区分能力,适合用来分类。

TF-IDF作用:用以评估一字词对于一个文件集或一个语料库中的其中一份文件的重要程度。

类:sklearn.feature_extraction.text.TfidfVectorizer

TfidfVectorizer语法:TfidfVectorizer(stop_words=None,…) 返回词的权重矩阵

常用方法:

TfidfVectorizer.fit_transform(X,y)      X:文本或者包含文本字符串的可迭代对象 返回值:返回sparse矩阵
TfidfVectorizer.inverse_transform(X)X:array数组或者sparse矩阵 返回值:转换之前数据格式
TfidfVectorizer.get_feature_names()返回值:单词列表
from sklearn.feature_extraction.text import TfidfVectorizer
import jieba
vector = TfidfVectorizer()
#分词
content1 = jieba.cut("好好学习天天向上")
content2 = jieba.cut("命运是掌握在自己手中的")
content3 = jieba.cut("我就是我,不一样的烟花")
print(content1)
#转换成列表,并拼接成字符串
c1 = ' '.join(list(content1))
c2 = ' '.join(list(content2))
c3 = ' '.join(list(content3))
data = vector.fit_transform([c1,c2,c3]).toarray()
print(vector.get_feature_names())
print(data)

 

4 数值型数据的特征预处理

通过特定的统计方法(数学方法)将数据转换成算法要求的数据

类:sklearn. preprocessing

4.1 单个特征

4.1.1 归一化

特点:通过对原始数据进行变换把数据映射到(默认为[0,1])之间。

归一化首先在特征(维度)非常多的时候,可以防止某一维或某几维对数据影响过大,也是为了把不同来源的数据统一到一个参考区间下,这样比较起来才有意义,其次可以程序可以运行更快。 例如:一个人的身高和体重两个特征,假如体重50kg,身高175cm,由于两个单位不一样,数值大小不一样。如果比较两个人的体型差距时,那么身高的影响结果会比较大,k-临近算法会有这个距离公式。

注意:在特定场景下最大值最小值是变化的,另外,最大值与最小值非常容易受异常点影响,所以这种方法鲁棒性较差,只适合传统精确小数据场景。

类:  sklearn.preprocessing.MinMaxScaler

语法:MinMaxScalar(feature_range=(0,1)…) 每个特征缩放到给定范围(默认[0,1])

MinMaxScalar.fit_transform(X)      X:numpy array格式的数据[n_samples,n_features] 返回值:转换后的形状相同的array

流程:①实例化MinMaxScalar

②通过fit_transform转换

4.1.2 标准化

特点:常用的方法是z-score标准化,通过对原始数据进行变换把数据变换到均值为0,标准差为1范围内

它们可以通过现有的样本进行估计,在已有的样本足够多的情况下比较稳定,适合嘈杂的数据场景

类:scikit-learn.preprocessing.StandardScaler

StandardScaler语法:StandardScaler(…) 处理之后每列来说所有数据都聚集在均值0附近标准差为1

常用方法:

StandardScaler.fit_transform(X,y)  X:numpy array格式的数据[n_samples,n_features] 返回值:转换后的形状相同的array
StandardScaler.mean_原始数据中每列特征的平均值
StandardScaler.std_原始数据每列特征的方差

流程:①实例化StandardScaler

②通过fit_transform转换

归一化与标准化对比:

归一化:如果出现异常点,影响了最大值和最小值,那么结果显然会发生改变;

标准化:如果出现异常点,由于具有一定数据量,少量的异常点对于平均值的影响并不大,从而方差改变较小。

 

4.1.3 缺失值

缺失值:由于各种原因,数据集包含缺少的值,通常编码为空白,NaN或其他占位符。

缺失值的处理方法:①删除:如果每列或者行数据缺失值达到一定的比例,建议放弃整行或者整列

②插补:可以通过缺失值每行或者每列的平均值、中位数来填充

有缺失值的数据集与scikit的分类器不兼容,它们假设数组中的所有值都是数字,并且都具有和保持含义。使用不完整数据集的基本策略是丢弃包含缺失值的整个行和/或列。然而,这是以丢失可能是有价值的数据(即使不完整)的代价。更好的策略是估算缺失值,即从已知部分的数据中推断它们。

类: sklearn.preprocessing.Imputer

语法:Imputer(missing_values='NaN', strategy='mean', axis=0) 完成缺失值插补

missing_values:integer or "NaN", optional (default="NaN")丢失值的占位符,对于编码为np.nan的缺失值,使用字符串值“NaN”

strategy:string, optional (default="mean")插补策略,如果是“平均值”,则使用沿轴的平均值替换缺失值;如果为“中位数”,则使用沿轴的中位数替换缺失值;如果“most_frequent”,则使用沿轴最频繁的值替换缺失

axis: integer, optional (default=0)插补的轴,如果axis = 0,则沿列排列,如果axis = 1,则沿行排列

Imputer.fit_transform(X,y)  X:numpy array格式的数据[n_samples,n_features] 返回值:转换后的形状相同的array

流程:①初始化Imputer,指定”缺失值”,指定填补策略,指定行或列。缺失值也可以是别的指定要替换的值

②调用fit_transform

import numpy as np
from sklearn.preprocessing import Imputer
array = [[1, 2], [np.nan, 3], [4, 5]]
print(array)
imp = Imputer(missing_values="NaN",strategy="mean",axis=0)
data = imp.fit_transform(array)
print(data)

numpy的数组中可以使用np.nan/np.NaN来代替缺失值,属于float类型 ;如果是文件中的一些缺失值,可以替换成nan,通过np.array转化成float型的数组即可

4.2 多个特征

4.2.1 降维

PCA(Principal component analysis),主成分分析。特点是保存数据集中对方差影响最大的那些特征,PCA极其容易受到数据中特征范围影响,所以在运用PCA前一定要做特征标准化,这样才能保证每维度特征的重要性等同。

本质:PCA是一种分析、简化数据集的技术。

目的:是数据维数压缩,尽可能降低原数据的维数(复杂度),损失少量信息。

作用:可以削减回归分析或者聚类分析中特征的数量

类:sklearn.decomposition.PCA

语法:PCA(n_components=None) 将数据分解为较低维数空间。

相关参数

n_components: int, float, None or string:这个参数可以帮我们指定希望PCA降维后的特征维度数目。最常用的做法是直接指定降维到的维度数目,此时n_components是一个大于1的整数。我们也可以用默认值,即不输入n_components,此时n_components=min(样本数,特征数)

whiten: bool, optional (default False)判断是否进行白化。所谓白化,就是对降维后的数据的每个特征进行归一化。对于PCA降维本身来说一般不需要白化,如果你PCA降维后有后续的数据处理动作,可以考虑白化,默认值是False,即不进行白化

vd_solver:选择一个合适的SVD算法来降维,一般来说,使用默认值就够了。

常用方法

PCA.fit_transform(X)      X:numpy array格式的数据[n_samples,n_features] 返回值:转换后指定维度的array
import numpy as np
from sklearn.decomposition import PCA
nparray = np.array([[4,5,1,6],[7,1,5,2],[5,6,8,6]])
print(nparray)
pca = PCA(n_components=3)
data = pca.fit_transform(nparray)
print(data)

5 数据的特征选择

特征选择就是单纯地从提取到的所有特征中选择部分特征作为训练集特征, 特征在选择前和选择后可以改变值、也不改变值,但是选择后的特征维数肯 定比选择前小,毕竟我们只选择了其中的一部分特征。

特征选择方法:Filter(过滤式):VarianceThreshold;Embedded(嵌入式):正则化、决策树;Wrapper(包裹式)。

其中过滤式的特征选择后,数据本身不变,而数据的维度减少。而嵌入式的特征选择方法也会改变数据的值,维度也改变。Embedded方式是一种自动学习的特征选择方法。

类:sklearn.feature_selection.VarianceThreshold

VarianceThreshold语法:VarianceThreshold(threshold = 0.0) 删除所有低方差特征

常用方法:

Variance.fit_transform(X,y)      X:numpy array格式的数据[n_samples,n_features] 返回值:训练集差异低于threshold的特征将被删除。 默认值是保留所有非零方差特征,即删除所有样本 中具有相同值的特征。

流程:①初始化VarianceThreshold,指定阀值方差

②调用fit_transform

import numpy as np
from sklearn.feature_selection import VarianceThreshold
var = VarianceThreshold(1.0)
nparray = np.array([[0,1,3,1],[2,1,0,1],[0,2,1,0]])
print(nparray)
data = var.fit_transform(nparray)
print(data)

五 fit_transform(),fit(),transform()

特征工程的步骤:①实例化 (实例化的是一个转换器类(Transformer))

②调用fit_transform(对于文档建立分类词频矩阵,不能同时调用)

fit_transform():输入数据直接转换

fit():输入数据但是不做事情,计算平均值方差等等

transform():进行数据的转换

注意:fit_transform或fit后,如果还有数据需要转换,直接调用transform就可以,不要再调用fit或者fit_transform了,因为再次调用fit标准就改了。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/473821.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

数据库实例:mysql与redis结合用户登录

加入redis后登录逻辑如下图,将图中nosql的位置换为redis即可 用户数据存的键为用户名,值为密码 将原来MySQL操作的代码封装到一个方法中,代码如下 defmysql_login(): #redis中没有则到mysql中查询 sqlselect upwd from py_users wher…

LeetCode 1610. 可见点的最大数目(atan2函数求夹角)

文章目录1. 题目2. 解题1. 题目 给你一个点数组 points 和一个表示角度的整数 angle ,你的位置是 location ,其中 location [posx, posy] 且 points[i] [xi, yi] 都表示 X-Y 平面上的整数坐标。 最开始,你面向东方进行观测。你 不能 进行…

[翻译]API Guides - Bound Services

官方文档原文地址:http://developer.android.com/guide/components/bound-services.html 一个Bound Service是一个客户端-服务器接口的服务。一个Bound Service允许组件(像activity)绑定一个service,发送请求,接受结果…

sklearn数据集与估计器

sklearn数据集与估计器 1 sklearn数据集 (1)数据来源:大多数以文件的形式 (csv文件..), 因为mysql有性能瓶颈、读取速度遭到限制,数据大的时候很费时间 (2)读取数据的工具&#…

LeetCode 935. 骑士拨号器(动态规划)

文章目录1. 题目2. 解题1. 题目 国际象棋中的骑士可以按下图所示进行移动: 这一次,我们将 “骑士” 放在电话拨号盘的任意数字键(如上图所示)上, 接下来,骑士将会跳 N-1 步。每一步必须是从一个数字键跳到…

k近邻算法(KNN)-分类算法

k近邻算法(KNN)-分类算法 1 概念 定义:如果一个样本在特征空间中的k个最相似(即特征空间中最邻近)的样本中的大多数属于某一个类别,则该样本也属于这个类别。 k-近邻算法采用测量不同特征值之间的距离来进行分类。 2 优缺点 优点:简单&a…

LeetCode 822. 翻转卡片游戏(哈希)

文章目录1. 题目2. 解题1. 题目 在桌子上有 N 张卡片,每张卡片的正面和背面都写着一个正数(正面与背面上的数有可能不一样)。 我们可以先翻转任意张卡片,然后选择其中一张卡片。 如果选中的那张卡片背面的数字 X 与任意一张卡片…

朴素贝叶斯算法-分类算法

朴素贝叶斯算法-分类算法 1 概率基础 概率定义为一件事情发生的可能性 联合概率:包含多个条件,且所有条件同时成立的概率,记作P(A,B) 条件概率:事件A在另一个事件B已经发生条件下的发送概率,记作P(A|B) 在A1,A2相…

django简介及环境搭建

MVC简介 MVC框架的核心思想是:解耦,让不同的代码块之间降低耦合,增强代码的可扩展性和可移植性,实现向后兼容 M全拼为Model,主要封装对数据库层的访问,内嵌ORM框架,实现面向对象的编程来操作数据…

LeetCode 1312. 让字符串成为回文串的最少插入次数(区间DP)

文章目录1. 题目2. 解题1. 题目 给你一个字符串 s ,每一次操作你都可以在字符串的任意位置插入任意字符。 请你返回让 s 成为回文串的 最少操作次数 。 「回文串」是正读和反读都相同的字符串。 示例 1: 输入:s "zzazz" 输出&…

Django创建项目

创建项目的名称为test1,完成“图书-英雄”信息的维护,创建应用名称为booktest 创建项目 cd /home/Desktop/ mkdir pytest cd pytest 创建项目的命令如下: django-admin startproject test1 项目默认目录说明 进入test1目录,查看…

分类模型的评估

分类模型的评估 在许多实际问题中,衡量分类器任务的成功程度是通过固定的性能指标来获取。一般最常见使用的是准确率,即预测结果正确的百分比,方法为estimator.score() 1 混淆矩阵 有时候,我们关注的是样本是否被正确诊断出来。…

LeetCode 996. 正方形数组的数目(回溯+剪枝)

文章目录1. 题目2. 解题1. 题目 给定一个非负整数数组 A,如果该数组每对相邻元素之和是一个完全平方数,则称这一数组为正方形数组。 返回 A 的正方形排列的数目。两个排列 A1 和 A2 不同的充要条件是存在某个索引 i,使得 A1[i] ! A2[i]。 …

[Java]java反射随笔

类是面向对象的灵魂,一切事物都可以以类来抽象。 在java使用过程中,我们可能会经常用到一个反射的知识,只是别人都封装好的,如jdbc的加载驱动类有一句Class.for(“…jdbc…”).newInstance.当然框架也是离不开了反射,s…

模型的选择与调优

模型的选择与调优 1 交叉验证 1.1 交叉验证过程 交叉验证:为了让被评估的模型更加准确可信 交叉验证的意义:为了使一部分数据即当成验证集,也做过训练集,更加准确得出准确率,把最后的准确率取平均值。 注意&#…

Django创建图书管理项目(完整版

一、创建项目test1及应用booktest 创建应用booktest 二、安装应用 在test1/settings.py中INSTALLED_APPS下添加应用的名称就可以完成安装 初始项目的INSTALLED_APPS如下图: 在元组中添加一个新的项,当前示例为booktest booktest, 三、设计模型 1.定义模型…

05.序列模型 W3.序列模型和注意力机制

文章目录1. 基础模型2. 选择最可能的句子3. 集束搜索(Beam Search)4. 改进集束搜索5. 集束搜索的误差分析6. Bleu 得分7. 注意力模型直观理解8. 注意力模型9. 语音识别(Speech recognition)10. 触发字检测(Trigger Wor…

决策树-分类算法

决策树-分类算法 1 认识决策树 决策树是一种基本的分类方法,也可以用于回归。我们一般只讨论用于分类的决策树。决策树模型呈树形结构,在分类问题中,表示基于特征对实例进行分类的过程,它可以认为是if-then规则的集合。在决策树…

在Visual Studio中利用NTVS创建Pomelo项目

刚看新闻,才知道微软发布了Node.js Tools for Visual Studio(NTVS),受够了WebStorm输入法Bug的困扰,这下终于可以解脱了。以Pomelo为例,运行命令:pomelo init pomelo_test,生成一个默…

LeetCode 834. 树中距离之和(树上DP)*

文章目录1. 题目2. 解题1. 题目 给定一个无向、连通的树。树中有 N 个标记为 0...N-1 的节点以及 N-1 条边 。 第 i 条边连接节点 edges[i][0] 和 edges[i][1] 。 返回一个表示节点 i 与其他所有节点距离之和的列表 ans。 示例 1: 输入: N 6, edges [[0,1],[0,2],[2,3],[…