数据的特征工程

1.特征工程是什么

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

2.特征工程的意义

直接影响预测结果

3.scikit-learn库介绍

python语言的机器学习工具

scikit-learn包括许多知名的机器学习算法的实现

scikit-learn文档完善,容易上手,丰富的API

4.数据的特征抽取

(1)特征抽取实例演示

#导入包
from sklearn.feature_extraction.text import CountVectorizer#实例化CountVectorizer
vector=CountVectorizer()#调用fit_transform输入并转换数据
res=vector.fit_transform(["life is short,i like python","life is too long,i dislike python"])#打印结果
print(vector.get_feature_names())
print(res.toarray())


通过演示得出结论:

特征抽取对文本等数据进行特征值化,即转化为数字值。
特征值化是为了计算机更好的去理解数据

(2)sklearn特征抽取API

sklearn.feature_extraction

(3)字典特征抽取

作用:对字典数据进行特征值化

sklearn.feature_extraction.DictVectorizer

DictVectorizer语法

DictVectorizer(sparse=True,…)

DictVectorizer.fit_transform(X)X:字典或者包含字典的迭代器返回值:返回sparse矩阵
DictVectorizer.inver_transform(X)X:array数据或者sparse矩阵返回值:转换之前数据格式
DictVectorizer.get_feature_names()返回类别名称
DictVectorizer.transform(X)按照原先的标准转换

流程

 1.实例化DictVectorizer2.调用fit_transform方法输入数据并转换,注意返回格式

演示

from sklearn.feature_extraction import DictVectorizerdef dictvec():'''字典数据抽取:return: none'''#实例化dict=DictVectorizer()#调用fit_transformdata=dict.fit_transform([{'city':'北京','temperature':100},{'city':'上海','temperature':60},{'city':'深圳','temperature':30}])print(data)return Noneif __name__=='__main__':dictvec()


返回值:sparse矩阵格式
原因:节约内存,方便读取处理

其实也可以转换为普通二维矩阵:

    dict=DictVectorizer(sparse=False)


两次输出没有什么差别,只不过sparse矩阵没有打印0值。

打印类别:

    print(dict.get_feature_names())


字典数据抽取:把字典中一些类别数据,分别进行转换成特征。

数组形式,有类别特征,先要转换字典数据。

(4)文本特征抽取

作用:对文本数据进行特征值化

CountVectorizer语法

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

流程

 1.实例化CountVectorizer2.调用fit_transform方法输入数据并转换,注意返回格式,利用toarray()进行矩阵转换array数组

演示

def countvec():'''对文本进行特征值化:return: none'''cv=CountVectorizer()data=cv.fit_transform(["life is short,i like python","life is too long,i dislike python"])print(data)return None


这仍然是sparse矩阵,要转换成普通二维矩阵:

    print(data.toarray())


打印类别:

    print(cv.get_feature_names())


1.词的列表:统计所有文章当中的词,重复的只看做一次。
2.对每篇文章,在词的列表里面统计每个词出现的次数。(单个字母不统计)

对于中文情况:

    data=cv.fit_transform(["人生苦短,我用python","人生漫长,不用python"])


显然,中文情况不能很好的抽取特征。

注意,切分的依据不是逗号“,”

    data=cv.fit_transform(["人生 苦短,我用 python","人生 漫长,不用 python"])


所以,需要对中文进行分词才能详细的进行特征值化。

分词需要的包:

import jieba

然后进行分词:

def cutword():con1=jieba.cut("这是一个久远的故事。当你笑着 醒了的时候  别提会有多快乐!早晨的微笑 是有魔力的,带来一天的好心情。")con2=jieba.cut("六一的任性魔术是将手中的“魔法棒”敲醒遇到的第一个熟悉的可爱的人。谁会继续  小小傲娇可是要飞上天太阳高高的照。")con3=jieba.cut("敲醒了那个人竟不知太阳在哪,傻笑着,如初美好。傲娇猫")#转换成列表content1=list(con1)content2=list(con2)content3=list(con3)#把列表转换成字符串c1=" ".join(content1)c2=" ".join(content2)c3=" ".join(content3)return c1,c2,c3
def countvec():'''对文本进行特征值化:return: none'''c1,c2,c3=cutword()print(c1,c2,c3)cv=CountVectorizer()data=cv.fit_transform([c1,c2,c3])print(cv.get_feature_names())print(data.toarray())return None

结果如下:

Building prefix dict from the default dictionary ...
Dumping model to file cache C:\Users\dai'er\AppData\Local\Temp\jieba.cache
Loading model cost 0.968 seconds.
Prefix dict has been built succesfully.
这是 一个 久远 的 故事 。 当 你 笑 着   醒 了 的 时候     别提 会 有 多 快乐 ! 早晨 的 微笑   是 有 魔力 的 , 带来 一天 的 好 心情 。 六一 的 任性 魔术 是 将 手中 的 “ 魔法 棒 ” 敲醒 遇到 的 第一个 熟悉 的 可爱 的 人 。 谁 会 继续     小小 傲娇 可是 要 飞 上天 太阳 高高的 照 。 敲醒 了 那个 人竟 不知 太阳 在 哪 , 傻笑 着 , 如初 美好 。 傲娇 猫
['一个', '一天', '上天', '不知', '久远', '人竟', '任性', '傲娇', '傻笑', '六一', '别提', '可是', '可爱', '太阳', '如初', '小小', '带来', '微笑', '心情', '快乐', '手中', '故事', '敲醒', '早晨', '时候', '熟悉', '第一个', '继续', '美好', '这是', '遇到', '那个', '高高的', '魔力', '魔术', '魔法']
[[1 1 0 0 1 0 0 0 0 0 1 0 0 0 0 0 1 1 1 1 0 1 0 1 1 0 0 0 0 1 0 0 0 1 0 0][0 0 1 0 0 0 1 1 0 1 0 1 1 1 0 1 0 0 0 0 1 0 1 0 0 1 1 1 0 0 1 0 1 0 1 1][0 0 0 1 0 1 0 1 1 0 0 0 0 1 1 0 0 0 0 0 0 0 1 0 0 0 0 0 1 0 0 1 0 0 0 0]]

但实际上,统计单词次数的分类方式不怎么常用。(一些中性词会干扰分类)

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

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

朴素贝叶斯
tf idf —— tf*idf——重要性程度
tf: term frequency 词的频率 出现的次数
idf: inverse document frequency 逆文档频率 log(总文档数量/该词出现的文档数量)

TfidfVectorizer语法

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

为什么需要TfidfVectorizer?
答:分类是机器学习算法的重要依据。

5.数据的特征预处理

对数据进行处理。

特征预处理是什么?
通过特定的统计方法(数学方法)将数据转换成算法要求的数据。

数值型数据:标准缩放:1.归一化。2.标准化。3.缺失值。
类别型数据:one-hot编码
时间类型:时间的切分

1.特征预处理的方法
2.sklearn特征预处理API——sklearn.preprocessing

(1)线性归一化。
也称min-max标准化、离差标准化;是对原始数据的线性变换,使得结果值映射到[0,1]之间。
特点:通过对原始数据进行变换把数据映射到(默认为[0,1])之间。
目的:使得某一个特征对最终结果不会造成更大影响。
转换函数如下:

MinMaxScaler语法

 MinMaxScalar(feature_range=(0,1)…)每个特征缩放到给定范围(默认[0,1])MinMaxScalar.fit_transform(X)       X:numpy array格式的数据[n_samples,n_features]返回值:转换后的形状相同的array

归一化步骤
1、实例化MinMaxScalar
2、通过fit_transform转换

演示:

from sklearn.preprocessing import MinMaxScalerdef mm():'''归一化处理:return: None'''mm=MinMaxScaler()data=mm.fit_transform([[90,2,10,40],[60,4,15,45],[75,3,13,46]])print(data)if __name__=='__main__':mm()


这种归一化比较适用在数值较集中的情况。这种方法有一个缺陷,异常点对最值影响太大,如果max和min不稳定的时候,很容易使得归一化的结果不稳定,影响后续使用效果。其实在实际应用中,一般用经验常量来替代max和min。
对于归一化来说:如果出现异常点,影响了最大值和最小值,那么结果显然会发生改变。

(2)标准差归一化。
特点:通过对原始数据进行变换把数据变换到均值为0,方差为1范围内。
也叫Z-score标准化,这种方法给予原始数据的均值(mean,μ)和标准差(standard deviation,σ)进行数据的标准化。经过处理后的数据符合标准正态分布,即均值为0,标准差为1,转化函数为:



StandardScaler语法

 StandardScaler(…)处理之后每列来说所有数据都聚集在均值0附近标准差为1StandardScaler.fit_transform(X,y)       X:numpy array格式的数据[n_samples,n_features]返回值:转换后的形状相同的arrayStandardScaler.mean_原始数据中每列特征的平均值StandardScaler.std_原始数据每列特征的方差

标准化步骤
1、实例化StandardScaler
2、通过fit_transform转换

演示:

from sklearn.preprocessing import StandardScalerdef stand():'''标准化缩放:return:'''std=StandardScaler()data=std.fit_transform([[ 1., -1., 3.],[ 2., 4., 2.],[ 4., 6., -1.]])print(data)return Noneif __name__=='__main__':stand()


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

(3)缺失值
如何处理数据中的缺失值?

Imputer语法

 Imputer(missing_values='NaN', strategy='mean', axis=0)完成缺失值插补Imputer.fit_transform(X,y)       X:numpy array格式的数据[n_samples,n_features]返回值:转换后的形状相同的array

Imputer流程
1、初始化Imputer,指定”缺失值”,指定填补策略,指定行或列
注:缺失值也可以是别的指定要替换的值
2、调用fit_transform

演示:

from sklearn.preprocessing import Imputer
import numpy as npdef im():'''缺失值处理:return:'''im=Imputer(missing_values='NaN',strategy='mean',axis=0)data=im.fit_transform([[1, 2], [np.nan, 3], [7, 6]])print(data)return Noneif __name__=='__main__':im()

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

(4)非线性归一化,这种方法一般使用在数据分析比较大的场景,有些数值很大,有些很小,通过一些数学函数,将原始值进行映射。一般使用的函数包括log、指数、正切等,需要根据数据分布的具体情况来决定非线性函数的曲线。

python人工智能——机器学习——特征工程相关推荐

  1. 机器学习-特征工程中的特征降维

    对于一个机器学习问题,数据和特征决定了机器学习的上限,而模型和算法只是逼近这个上限.由此可见,数据和特征在模型的整个开发过程中是比较重要.特征工程,顾名思义,是对原始数据进行一系列工程处理,将其提炼为 ...

  2. 探讨使用UML设计机器学习特征工程与深度学习建模等大数据分析软件

    大数据人工智能软件产品研发,是在传统软件工程的基础上,增加了数据特征分析.人工智能算法建模及模型训练过程,同时也增加了很大的不确定性. 0. 前言 本文以程序员视角,以客户流失为案例,使用UML方式设 ...

  3. 机器学习实战 | 机器学习特征工程最全解读

    作者:韩信子@ShowMeAI 教程地址:https://www.showmeai.tech/tutorials/41 本文地址:https://www.showmeai.tech/article-d ...

  4. python数据分析及特征工程(实战)

    python数据分析及特征工程(实战) 1.数据分析 1.1单属性分析 1.1.1 异常值分析 1.1.2 分布分析 1.1.3 对比分析 1.1.4 结构分析 1.2多属性分析 1.2.1假设检验 ...

  5. 机器学习特征工程之连续变量离散化:聚类法进行分箱

    机器学习特征工程之连续变量离散化:聚类法进行分箱 离散化,就是把无限空间中有限的个体映射到有限的空间中: 根据用户的听音乐的数据来预测哪些歌曲更受欢迎. 假设大部分人听歌都很平均,会不停的听新的歌曲, ...

  6. 机器学习特征工程之连续变量离散化:等频分箱

    机器学习特征工程之连续变量离散化:等频分箱 离散化,就是把无限空间中有限的个体映射到有限的空间中: 根据用户的听音乐的数据来预测哪些歌曲更受欢迎. 假设大部分人听歌都很平均,会不停的听新的歌曲,但是有 ...

  7. 机器学习特征工程之连续变量离散化:连续变量二值化(Binarizer)

    机器学习特征工程之连续变量离散化:连续变量二值化(Binarizer) 离散化,就是把无限空间中有限的个体映射到有限的空间中: 根据用户的听音乐的数据来预测哪些歌曲更受欢迎. 假设大部分人听歌都很平均 ...

  8. 机器学习特征工程之连续变量离散化:等宽分箱

    机器学习特征工程之连续变量离散化:等宽分箱 离散化,就是把无限空间中有限的个体映射到有限的空间中: 根据用户的听音乐的数据来预测哪些歌曲更受欢迎. 假设大部分人听歌都很平均,会不停的听新的歌曲,但是有 ...

  9. 机器学习特征工程之特征缩放+无量纲化:数据标准化(StandardScaler)

    机器学习特征工程之特征缩放+无量纲化:数据标准化(StandardScaler) 在Andrew Ng的机器学习课程里面,讲到使用梯度下降的时候应当进行特征缩放(Feature Scaling).进行 ...

最新文章

  1. CSDN-屏蔽广告详细方法 仅对谷歌浏览器有效!
  2. java 调用存储过程structdescriptor,Java调用oracle存储过程,集合入参的正确姿势
  3. NSTimeInterval和CMTime
  4. js笔记(二)数组、对象、this
  5. SQL 行转列的两种做法
  6. 资料员计算机知识大全,最新资料员专业基础知识
  7. 花呗可延后还啦!支付宝“移动花卡”开启预约
  8. react使用中的注意事项(持续更新)
  9. 统计挖掘那些事(六)——强大的逻辑回归(理论+案例)
  10. Timus 1318. Logarithm
  11. 嫦娥四号的通讯速率,为何没有视频直播
  12. IPy模块测试demo,打印C段ip列表
  13. java中怎么读取txt文件_Java读取TXT文件
  14. 禁止国外ip访问网站、服务器
  15. 中巴地球资源(CBERS)卫星系列介绍
  16. HSPICE MOS模型
  17. 首届CCF计算机职业资格认证考试题解(C++)
  18. 使用屏幕录制专家--录制视频技巧
  19. TLC5615 DA转换 verilog FSM
  20. 点餐推荐系统_自助点餐、自助收银…智慧餐厅的下一步又会是什么?

热门文章

  1. hadoop搭建_hadoop分布式搭建之虚拟机克隆
  2. python将列表写入csv_转:Python 将列表数据写入文件(txt, csv, excel)
  3. c语言malloc面试题,c语言面试最必考的十道试题,求职必看!!!
  4. python csdn博客_利用Python抓取CSDN博客
  5. Java黑皮书课后题第10章:*10.15(几何:边框)边框是指包围一个二维平面上点集的最小矩形,编写一个方法,为二维平面上一系列点返回一个边框
  6. Java黑皮书课后题第6章:*6.2(求一个整数各位数字之和)编写一个方法,计算一个整数各位数字之和。使用下面的方法头:public static int sumDigits(long n)
  7. Java黑皮书课后题第4章:*4.13(判断元音还是辅音)编写程序,提示用户输入一个字母,判断该字母是元音还是辅音。对于非字母的输入,提示非法输入
  8. 【数据结构】—顺序表的插入、删除、查找操作
  9. 网络安全等保定级_差异:关键信息基础设施与网络安全等级保护2.0
  10. 快速排序、希尔排序、插入排序、选择排序、归并排序、堆排序总结