机器学习之数据的特征工程

机器学习之数据的特征工程

使用scikit-learn对数据特征值进行特征分析 (安装scikit-learn需要Numpy,pandas库)


前言:

随着人工智能的不断发展,机器学习这门技术也越来越重要,本文就介绍了机器学习的基础内容。本章主要讲如何对用于机器学习的数据进行特征工程,特征工程具体包括特征抽取、特征预处理、数据降维等过程。之后我会陆续发布关于机器学习和深度学习相关的内容,大家可以关注下面的机器人基地公众号,会有很多很有趣的内容哈哈。
在这里插入图片描述


提示:以下是本篇文章正文内容,下面案例可供参考

简单介绍:机器学习是什么,为什么要对数据的特征进行特征工程?

通俗来讲,机器学习是一门通过编程让计算机从数据中进行学习的科学,同时也是一种艺术。
严格上来说,进行机器学习的模型训练,一般会使用真实数据进行实验,而不仅仅是人工数据集。而对于一些真实的数据集,数据的内容一般为文本、字符串或图片等等一些不能直接用于计算的数据,所以要对这些比较特殊的数据进行转换,转换为数据(进行特征值化,为了让计算机更好的去理解数据),下文讲的是针对字典数据,数组数据,文本数据进行的特征工程处理,其中使用sklearn机器学习库可以很好的对数据进行一系列操作。

流行的开放数据存储库

这里提供一些数据库,小伙伴们可以自行去其网站获取自己想要的数据,具体网站如下:
http://archive.ics.uci.edu/ml/
http://www.kaggle.com/datasets/
http:aws.amazon.com/fr/datasets/

一、特征抽取

特征抽取API:sklearn.feature_extraction

1.使用sklearn对字典数据进行特征值化

字典数据抽取实际上就是把字典中一些类别数据,分别进行转换成特征,特征值化之后返回的是sparse矩阵。
类: sklearn.feature_extraction.DictVectorizer(sparse=False/ture)
方法:
DictVectorizer.fit_trabsform(X) #X:字典或者保护字典的迭代器,返回值为sparse矩阵 (即把一个字典的数据转换为一个数据)
DictVectorizer.inverse_trabsform(X) #X:array数据或者sparse矩阵,返回值为转换之前的数据格式
DictVectorizer.get_feature_name()# 返回类别名称
DictVectorizer.trabsform(X) # 按照原先的标准转换

代码如下(示例):

def dictvec():
	#字典数据抽取
	dict = DictVectorizer()#类对象示例化,括号里的sparse=False/ture的值就决定了返回的转换后的数据为数组还是矩阵
	#调用对象方法,参数为字典
	data=dict.fit_transform([{'city':'北京','temperature':100}, {'city':'上海','temperature':60}, {'city':'深圳','temperature':40}])  #data 就是把字典转换后的数据
	print(data) 
	print(dict.get_feature_name())
	return None					
if __name__=="__main__":
		//调用dictvec()
		dictvec()

执行结构如下:
[[ 0. 1. 0. 100.]
[ 1. 0. 0. 60]
[ 0. 0. 1. 40.]]
通过上面的结果可以看到:矩阵的每一行的数据就代表着字典数据,这样就可以很好的把字典数据进行特征抽取。


2.对数组数据进行特征值化

有了字典特征值化的前车之鉴,对于数组类的数据的处理也是大同小异,这里也不进行过多的讲解。
具体的抽取过程:先要转换为字典数据,再对字典数据进行特征转换。


3.对文本数据进行特征值化

对文本进行特征值化的具体原理为:统计文章中所有的词,在词的列表里面统计每个词出现的次数,特征目录重复的词只看作一次,单个字母不统计。
类 :sklearn.feature_extraction.text.CountVectorizer(sparse=False/ture)

代码如下(示例):

from sklearn.feature_extraction import CountVectorizer
def dictvec():
	#对文本进行特征值化
	cv = CountVectorizer()#括号里可有参数sparse=False/ture的值就决定了返回的转换后的数据为数组还是矩阵
	#调用对象方法
	data=cv.fit_transform(["gkjdsjdajsd","jklfjakfjakj"] 
	print(data) #这个的结果是一个sparse矩阵
	print(dict.get_feature_name())#生成一个特征目录,词的列表
	print(data.toarry())#把一个sparse矩阵转换为一个数组
return None
	if __name__=="__main__":
		//调用dictvec()
		dictvec()

二、特征预处理

虽上面进行了数据的特征值化,但抽取处理的数据太过粗糙,根本就不能用来进行模型训练或训练效果非常差。所以要对抽取出来的数据进行数据特征的预处理。因为机器学习的底层环境就是数学,一些不符合规范的数据格式是不能直接用于数学计算的,进行特征预处理就是将数据转换成算法要求的数据。对于训练的数据,本身大多是数值型数据,或经过特征抽取得到的数据也是数值型的数据,这里主要介绍对数值型数据和类别型的数据进行特征预处理。

1.数值型数据:标准缩放(归一化、标准化、缺失值)

1.归一化

所谓的数据归一化处理,即对原始数据进行变换把数据映射到(默认[0,1])之间,他们的相互映射有一一对应的关系。
公式如下:
X 1 = x − m i n m a x − m i n X1=\frac{x-min}{max-min} X1=maxminxmin
X 2 = X 1 ∗ ( m x − m i ) + m i X2=X1*(mx-mi)+mi X2=X1(mxmi)+mi
注:作用于每一列。max为一列的最大值,min为一列的最小值,那么X2为最终的结果,mx,mi分别为指定区间默认值mx为1,mi为0

归一化API:sklearn.preprocessing.MinMaxScaler
处理步骤为:
1.MinMaxScaler(feature_range=(0,1)…) #每个特征缩放到给定范围(默认0,1)
2.MinMaxScaler.fit_transform(X)
      X:numpy arry格式的数据[n_samples,n_features]
       返回值:转换后的形状相同的array

代码如下(示例):

from sklearn.preprocessing import MinMaxScaler
def mm():
	mm=MinMaxScaler(feature_range=(0,1) )
	data=mm.fit_transform([[90,2,10,40],[90,2,10,40],[90,2,10,40],[90,2,10,40]])
	print(data)
return None
if __name__=="__main__":
	mm()

2.标准化

在多指标评价体系中,由于各评价指标的性质不同,通常具有不同的量纲和数量级。当各指标间的水平相差很大时,如果直接用原始指标值进行分析,就会突出数值较高的指标在综合分析中的作用,相对削弱数值水平较低指标的作用。因此,为了保证结果的可靠性,需要对原始指标数据进行标准化处理。
数据的标准化处理就是将对原始数据进行变换到均值为0,方差为1范围内,从而削弱高指标数据的对训练模型的影响。
公式如下:
X 1 = x − m e a n u X1=\frac{x-mean}{u} X1=uxmean
注:作用于每一列,mean为平均值,u为标准差
类:sklearn.preprocessing.StandardScaler
2.标准化API:示例化:StandardScaler(…) #处理之后每列来说所有的数据聚集在均值0附近方差为1
1.StandardScaler.fit_transfom(x) #进行标准化
      x:numpy array格式的数据[n_samples,n_features]# 返回值:转换后的形状相同的array

2.StandardScaler.mean()#原始数据中每列特征的平均值

3.StandardScaler.std()#原始数据每列特征的方差

代码如下(示例):

from sklearn.preprocessing import StandardScalerr
	def mm():
	std=StandardScaler
	data=std.fit_transfom([[90,2,10,40],[90,2,10,40],[90,2,10,40],[90,2,10,40]])
	print(data)
return None
if __name__=="__main__":
	mm()

3.对数据缺失值的处理

一般得到的数据集,比如类别数据集或预测房价数据集,数据集内的数据会因为某些原因有缺失,而对于缺失的数据,直接进行训练会降低模型准确性,对数据缺失值的处理一般有以下两种:
1.对缺失值删除:如果每列或者行数据缺失值达到一定的比例,建议放弃整行或整列
2.对缺失值插补:可以通过缺失值每行或者每列的平均值、中位数来填充
对应的API:
1.Imputer(missing_values=‘NaN’,strategy=‘mean’,axis=0) #完成缺失值插补
       missing_values:指定缺失值的位置
       strategy:填补的方法:平均值还是中位数
       axis:指定用缺失值的行或列来进行填补
2.Imputer.fit_transform(X) #调用函数完成填补
       X:numpy arry:格式的数据[n_samples,n_features]
       返回值:转换后的形状相同array

代码如下(示例):

from sklearn.preprocessing import Imputer
import numpy as np
def im():
	im=Imputer(missing_values='NaN',strategy='mean',axis=0)
	data=im.fit_transfom([[1,2],[np.nan,3],[7,6]])
	print(data)
return None
	if __name__=="__main__":
		mm()

2.类别型数据

对于类别型数据的特征预处理,因为类别型数据包含的数据量不是很多,只有特征值和目标值,具体的特征预处理的过程比较简单。
具体的过程如下:
1.进行one-hot编码(one-hot编码具体内容这里不进行详解)
2.把类别型数据转换为以字典
3.对字典数据进行特征抽取

三、数据降维处理

数据的维度即数据的特征的数量,一些没有经过处理的数据集,一般会包含大量的无用的数据特征,或对数据集影响较小的数据特征。
对数据的特征的降维处理即把特征的数量减少,把一些对结果影响不大的特征进行舍去,进行数据降维处理后,特征数量减少,在最大程度上把数据集的利用效率最大化,还会提高模型的训练速度。
1.进行特征选择:
在对数据进行降维处理之前,要对舍去的数据进行选择,一般选取舍去数据的原则是:
冗余:部分特征的相关度低,容易消耗计算机性能;噪声:部分特征对预测结果有影响
主要方法:
(1)Filter(过滤式):VarianceThreshold;Embedded(嵌入式):正则化、决策树;Wrapper(包裹式)。
(2)PCA主成分分析
这里主要使用方法1和方法2,神经网络之后我会在下面的章节中详解。

方法1:Filter(过滤式):VarianceThreshold
基本原理是:根据方差的大小进行过滤,删除所有低方差(低于一个阈值)的特征。
类:sklearn.feature_selection.VarianceThreshole
API:
VarianceThreshole(threshold=0.0) #threshold=0.0为想要删除得方差得大小
方法:
VarianceThreshole.fit_transform(X)
       X:numpy array格式的数据[n_samples,n_features]
       返回值:训练集差异低于threshold的特征将被删除。默认值是保留所有非零方差特征,即删除所有样本中具有相同值得特征。
代码如下(示例):

from sklearn.feature_sekection import VarianceThreshold
import numpy as np
def var():
	var=VarianceThreshole(threshold=0.0)
	data=var.fit_transfom([[0,2,0,3],[0,1,4,3],[0,1,1,3]])
	print(data)
return None
if __name__=="__main__":
	var()

方法2:PCA主成分分析
当特征数量达到上百时,采用这一个方法对数据进行降维处理的效果就会比较好,PCA主要对数据维数压缩,尽可能降低原数据的维数(复杂度),只损失少量信息,可以削减回归分析或聚类 分析中特征得数量。
类:sklearn.decomposition.PCA
API:PCA(n_components=None) #将数据分解为较低维数空间(n_components为小数时人为可控指定保留特征数量的占比,即90%时,指定保留90%的信息;为整数时人为指定保留多少个特征数量)
方法:
PCA.fit_transform(X)
       X:numpy array格式的数据[n_samples,n_features]
       返回值:转换后指定维度的array
代码如下(示例):

from sklearn.decomposition import PCA
def pca():
	pca=PCA(n_components=0.9)
	data=pca.fit_transfom([[2,8,4,5],[6,3,0,8],[5,4,9,1]])
	print(data)
return None
if __name__=="__main__":
	pca()

至此,数据的特征工程就算完成了,这一步非常重要,在之后的模型训练中起到很关键的作用。

总结

这里对文章进行总结:
以上就是今天要讲的内容,本文仅仅简单介绍了数据的特征工程,而scikit-learn提供了大量能使我们快速便捷地处理数据的函数和方法,当然,数据的特征工程还有其他很多的方法,可以自己去挖掘,毕竟,IT任重而道远。以上的内容如果有什么讲不对的地方欢迎大家指出,而后我将会继续进行发布更多关于机器学习和深度学习的知识,如果觉得有用,欢迎大家关注下面的机器人基地公众号。
在这里插入图片描述

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

djh_hai

你的鼓励是我最大的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值