1.数据预处理的意义:
机器学习是从数据中自动分析获得规律(模型),并利用规律对未知数据进行预测.由于数据在获取过程中难免出现异常值,缺失值,多条特征数据线形相关,或者特征数据不适用于算法需求等问题.数据和特征决定了机器学习的上限,数据预处理将原始数据转换为既能代表数据整体特征,又满足算法(模型)需求的数据集(将真实值转变为特征值),从而提高提高了对未知数据的模型准确性.
2.python实现:
python中的Scikit-learn库包括许多知名的机器学习算法的实现,可以调用其中的方法来实现包括特征抽取,特征处理,数据降维等数据的预处理.
本次的使用环境为:python3.6.2,scikit-learn库的版本为:0.19.1
3.代码的具体实现
3.0 涉及类库的导入
import jieba #中文文档分词库
import numpy as np
from sklearn.feature_extraction import DictVectorizer
from sklearn.feature_extraction.text import CountVectorizer,TfidfVectorizer
from sklearn.preprocessing import MinMaxScaler,StandardScaler,Normalizer,Imputer
from sklearn.feature_selection import VarianceThreshold
from sklearn.decomposition import PCA
3.1数据的特征抽取:包含字典型数据的特征抽取(使用sklearn.feature_extraction.DictVectorizer类)和文本型数据的特征抽取(使用sklearn.feature_extraction.text.CountVectorizer类和TfidfVectorizer类)
3.1.1 字典型数据的特征抽取(代码如下):
def dict_extraction():
#实例化DictVectorizer
dv = DictVectorizer()
data = [{'城市':'北京'},{'城市':'上海'},{'城市':'广州'},{'商店':'星巴克'}]
# 使用fit_transform方法抽取数据
res = dv.fit_transform(data)
#打印类别的名称
print(dv.get_feature_names())
#以列表形式打印data数据
print(res.toarray())
#将转化后的数据转回到之前的格式
print(dv.inverse_transform(res))
打印结果为:
![]() 
3.1.2 文本型数据的特征抽取(代码如下):
def text_extraction():
#实例化CountVectorizer
cv = CountVectorizer()
#使用fit_transform方法抽取数据
data = ['i am a big big girl in a big big world','i am not a big big girl in a not big world']
res = cv.fit_transform(data)
#打印类别的名称
print(cv.get_feature_names())
#以列表形式打印data数据
print(res.toarray())
#将转化后的数据转回到之前的格式
print(cv.inverse_transform(res))
打印结果为:

3.1.3中文文本型数据的特征抽取和权重分析(代码如下):
def chi_text_extraction():
#文本数据
text_data = '你将会知道,你一钻进树底下去,便会看到宽大的一条走廊.那儿很亮,' \
'因为那里点着10多盏明灯. 你将看到三个门,都可以打开,因为钥匙就在门锁里.' \
'你走进第一个房间去,可以看到当中有一口大箱子,箱子上面坐着一只狗,它的眼睛非常的大,' \
'像一对茶杯. 可是你不要管它!我可以把我蓝格子布的围裙给你. 你把它铺在地上,然后赶紧走过去,' \
'把那只狗抱起来,放在我的围裙上.然后你就把箱子打开,你想要多少钱就取出多少钱. ' \
'这些钱都是铜铸的. 但是假如你想取得银铸的钱,就得走进第二个房间里去. ' \
'不过那儿也坐着一只狗,它有水车轮那么大的眼睛. 可是你不要去理它. ' \
'你把它放在我的围裙上,然后把钱取出来. 但是,如果你想得到金子铸的钱,' \
'你也会达到目的.你拿得动多少就可以拿多少——如果你到第三个房间里去的话. ' \
'不过坐在这儿钱箱上的那只狗的一双眼睛,可有‘圆塔’那么大啦. ' \
'你要知道,它称得上是一只狗啦!可是你一点也不必害怕. 你只须把它放在我的围裙上,' \
'它就不会伤害你了. 你从那个箱子里能够取出多少金子来,就取出多少金子来吧.'
#使用jieba分词对文本数据进行分词
cut_data = jieba.cut(text_data)
#初始化TfidfVectorizer,通过stop_word指定过滤的词语,默认不过滤
#TfidfVectorizer函数的功能相当于CountVectorizer(特征向量化)+TfidfTransformer(评估词的重要程度)
#stop_words参数用于指定不进行统计的词语(筛选关键词)
tfidfv = TfidfVectorizer(stop_words=['一双','一口','一只'])
# 使用fit_transform方法抽取数据
res = tfidfv.fit_transform(cut_data)
#打印类别名称
print(tfidfv.get_feature_names())
# 以列表形式打印data数据
print(res.toarray())
打印结果为:

注:1.python默认不支持中文分词,中文的分词需要使用jieba模块
2.jieba分词之后的对象(如示例中的cut_data对象)可以通过遍历取值,但是只能取一次,第二次遍历会显示为空.
3.1.4 特征抽取总结:通过特征抽取将字典对象,文本内容转换为数值形式的sparse矩阵,从而更好的进行统计运算和机器学习.
3.2数据的特征处理:通过特定的统计方法(数学方法),将原始数据转化为更适合于机器学习算法要求的数据.
数据的处理方式包括:
a.数值型数据:归一化,标准化,正则化,缺失值处理
b.类别型数据:one-hot编码
c.时间类型:切分时间.
3.2.1数值型数据的特征处理在scikit-learn模块的数据预处理包(preprocessing)中,使用的类分别分:归一化(MinMaxScaler),标准化(StandardScaler),正则化(Normalizer),缺省值处理(Imputer),代码实现如下:
3.2.2归一化:
#最小值设为0,最大值设为1,其他的值为比例值(范围0~1)
def mms():
# 实例化MinMaxScaler
mms = MinMaxScaler()
data = [[90,2,10,40],[60,4,15,45],[75,3,13,46]]
# 使用fit_transform方法处理数据
rst = mms.fit_transform(data)
print(rst)
打印结果为:

3.2.3标准化:
def ss():
ss = StandardScaler()#实例化
data = [[ 1., -1., 3.],[ 2., 4., 2.],[ 4., 6., -1.]]
rst = ss.fit_transform(data)#使用标准化方法处理数据
print(rst)
打印结果为:

3.2.4正则化:
def norml():
norml = Normalizer()#实例化
data = [[ 1., -1., 3.],[ 2., 4., 2.],[ 4., 6., -1.]]
rst = norml.fit_transform(data)#处理数据
print(rst)
打印结果为:

3.2.5缺省值的处理:
def imp():
#参数missing_values:默认为NaN
#参数strategy使用三个值:(1-mean:用均值替换(默认值);2-median:用中位数替换,most_frequent:用众数替换)
#参数axis,默认为0,表示按列计算,1表示按行计算
imp = Imputer()#初始化
data = [[ 1., np.nan, 3.],[ 2., np.nan, 2.],[ 4., 6., np.nan]]
rst = imp.fit_transform(data)#处理数据
print(rst)
打印结果为:

3.2.6数据的特征处理总结:特征处理的方式选择,要结合具体数据的真实情况,选择的算法(模型对于数据的具体要求),以及具体的业务需求来决定.通过特征处理后的数据可以最大程度保留原数据的特征,也可以更好的符合机器学习算法需求.
3.3数据的特征选择:从原始数据的所有特征中选择部分特征作为训练特征集(即主动减少一部分特征),通过这种方法来达到减少特征冗余(特征数量较多,部分特征相关度高,过度消耗计算机性能)和数据噪声(对预测结果影响非常小或有负面影响)的问题.
主要的方法有:
filter(过滤式): VaricanceThreshold
Embedded(嵌入式): 正则化,决策树
Wrapper(包裹式):
其他: 神经网络算法等
3.3.1删除低方差值的方法:低方差值的数据即为对结果影响较小的数据(使用的类为:sklearn.feature_selection.VarianceThreshold).
def vt():
#参数threshold可以控制删除的低方差的范围,即删除方差值在这个参数值一下的所有特征值.默认为0
vt = VarianceThreshold(threshold=0)#初始化
data = [[ 0.,1., -1., 3.,8.],[0., 2., 4., 2.,8.],[0., 4., 6., -1.,8.]]
res = vt.fit_transform(data) #处理数据
print(res)
打印结果为:(原数据中第一列和最后一列的数据方差为0,已经被删除)

3.4数据降维:通过数学方式将特征的维度降低,从而达到简化数据集的目的
3.4.1PCA(主成分分析法)降维:
def pca():
#参数n_components指定需要降低到的维度
pac = PCA(n_components=3)#初始化,指定要降到的维度为3
data = [[2,8,4,5],[6,3,0,8],[5,4,9,1]]
res = pac.fit_transform(data)#处理数据
print(res)
打印结果为:
![]() 
4.总结
特征过程是机器学习中非常重要的一步,选择恰当的数据处理方式直接影响到算法和模型的预测结果.需要经过不断的选择方法,调参,优化,才能选择到每个具体应用场景所面临的独特的数据需求.
|