机器学习之数据的特征工程
使用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=max−minx−min
X
2
=
X
1
∗
(
m
x
−
m
i
)
+
m
i
X2=X1*(mx-mi)+mi
X2=X1∗(mx−mi)+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=ux−mean
注:作用于每一列,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任重而道远。以上的内容如果有什么讲不对的地方欢迎大家指出,而后我将会继续进行发布更多关于机器学习和深度学习的知识,如果觉得有用,欢迎大家关注下面的机器人基地公众号。