机器学习02-使用python中的sklearn库进行数据的预处理(数据的特征工程)

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.总结

特征过程是机器学习中非常重要的一步,选择恰当的数据处理方式直接影响到算法和模型的预测结果.需要经过不断的选择方法,调参,优化,才能选择到每个具体应用场景所面临的独特的数据需求.


  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值