机器学习之特征工程


前言:主要介绍特征工程、字典特征抽取、文本特征抽取、数据的特征预处理、特征选择以及数据的降维。


1 特征工程

意义:特征工程是将原始数据转换为更好地代表预测模型的潜在问题的特征的过程,从而提高了对未知数据的模型准确性。直接影响模型的预测结果

2 字典特征抽取

代码如下:

from sklearn.feature_extraction import DictVectorizer

def dictvec():
    """
    字典数据特征抽取
    """
    #实例化
    dict = DictVectorizer(sparse=False)
    list_data = [{'city': '鹿邑','temperature': 100}, {'city': '郸城','temperature':60}, {'city': '淮阳','temperature': 30}]
    #调用fit_transform
    data = dict.fit_transform(list_data)
    print(dict.get_feature_names())
    print(data)
    print(dict.inverse_transform(data))

if __name__ == '__main__':
    dictvec()

在这里插入图片描述
解释:其中该字典有四个特征值依次分别为: [‘city=淮阳’, ‘city=郸城’, ‘city=鹿邑’, ‘temperature’],根据字典可知,该city=淮阳的时候为第三个字典,所以(0,2)为1.0为city=淮阳,其他的类似。

当参数sparse=True的时候,运行结果如下:

dict = DictVectorizer(sparse=True)

在这里插入图片描述

3 文本特征抽取

3.1 英文文本特征抽取(代码如下):

from sklearn.feature_extraction.text import CountVectorizer

def countvec():
    """
    对文本进行特征值化
    :return:
    """
    cv = CountVectorizer()
    data = cv.fit_transform(["Hello Python!", "Hello Java", "Hello C"])
    print(cv.get_feature_names())
    print(data)
    print(data.toarray())
    return None
    
if __name__ == '__main__':
    countvec()

在这里插入图片描述
解释:
[‘hello’, ‘java’, ‘python’]
第一段 [[1 0 1] 第一段 hello出现一次,python出现一次
第二段 [1 1 0] 第二段 hello出现一次,java出现一次
第三段 [1 0 0]] 第三段 hello出现一次

3.2 中文文本特征抽取(代码如下)

from sklearn.feature_extraction.text import CountVectorizer
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 hanzivec():
    """
    中文特征值化
    :return:
    """
    c1, c2, c3 = cutword()
    print(c1,c2,c3)
    cv = CountVectorizer()
    data = cv.fit_transform([c1, c2, c3])
    print(cv.get_feature_names())
    print("*" * 100)
    print(data.toarray())
    print("*" * 100)
    print(data)
    return None
if __name__ == '__main__':
    hanzivec()

特征值:[‘一种’, ‘不会’, ‘不要’, ‘之前’, ‘了解’, ‘事物’, ‘今天’, ‘光是在’, ‘几百万年’, ‘发出’, ‘取决于’, ‘只用’, ‘后天’, ‘含义’, ‘大部分’, ‘如何’, ‘如果’, ‘宇宙’, ‘我们’, ‘所以’, ‘放弃’, ‘方式’, ‘明天’, ‘星系’, ‘晚上’, ‘某样’, ‘残酷’, ‘每个’, ‘看到’, ‘真正’, ‘秘密’, ‘绝对’, ‘美好’, ‘联系’, ‘过去’, ‘这样’]
在这里插入图片描述

3.3 TF-IDF

  • 如果某个词或短语在一篇文章中出现的概率高,并且在其他文章中很少出现,则认为此词或者短语具有很好的类别区分能力,适合用来分类。
  • 用以评估一字词对于一个文件集或一个语料库中的其中一份文件的重要程度。

代码如下:

from sklearn.feature_extraction.text import TfidfVectorizer
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 tfidfvec():
    """
    中文特征值化
    :return: None
    """
    c1, c2, c3 = cutword()

    print(c1, c2, c3)

    tf = TfidfVectorizer()

    data = tf.fit_transform([c1, c2, c3])

    print(tf.get_feature_names())
    print("*" * 100)
    print(data.toarray())
    print("*" * 100)
    print(data)
    return None

if __name__ == '__main__':
    tfidfvec()

在这里插入图片描述

4 数据的特征预处理

通过特定的统计方法(数学方法)将数据转换成算法要求的数据。

4.1 归一化处理

  • 特点:通过对原始数据进行变换把数据映射到(默认为[0,1])之间
    在这里插入图片描述
  • 注:作用于每一列,max为一列的最大值,min为一列的最小值,那么X"为最终结果,mx,mi分别为指定区间值默认mx为1,mi为0

例子如下:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
代码如下:

from sklearn.preprocessing import MinMaxScaler

def mm():
    """
    归一化处理
    :return:
    """
    mm = MinMaxScaler(feature_range=(0,1))
    data = mm.fit_transform([[90,2,10,40],[60,4,15,45],[75,3,13,46]])
    print(data)
    return None

if __name__ == '__main__':
    mm()

在这里插入图片描述
总结:注意在特定场景下最大值最小值是变化的,另外,最大值与最小值非常容易受异常点影响,所以这种方法鲁棒性较差,只适合传统精确小数据场景。

4.2 标准化处理

  • 特点:通过对原始数据进行变换把数据变换到均值为0,方差为1范围内
  • 在这里插入图片描述
  • 在这里插入图片描述
  • 归一化和标准化比较
    在这里插入图片描述
    对于归一化来说:如果出现异常点,影响了最大值和最小值,那么结果显然会发生改变、
    对于标准化来说:如果出现异常点,由于具有一定数据量,少量的异常点对于平均值的影响并不大,从而方差改变较小。

求标准化代码如下:

from sklearn.preprocessing import StandardScaler

def stand():
    """
    标准化处理
    :return:
    """
    std = StandardScaler()
    data = std.fit_transform([[ 2, 8, 4, 5],[ 6, 3, 0, 8],[ 5, 4, 9, 1]])
    print(data)
    return None

if __name__ == '__main__':
    stand()

在这里插入图片描述
总结:在已有样本足够多的情况下比较稳定,适合现代嘈杂大数据场景。

4.3 缺失值处理

在这里插入图片描述
代码如下:

from sklearn.impute import SimpleImputer
import numpy as np

def im():
    """
    缺失值处理
    """

    im = SimpleImputer(strategy='mean')
    data = im.fit_transform([[1, 2], [np.nan, 3], [7, 6]])
    print(data)

if __name__ == '__main__':
    im()

在这里插入图片描述

5 特征选择

  • 冗余:部分特征的相关度高,容易消耗计算性能。
  • 噪声:部分特征对预测结果有负影响。
  • 特征选择就是单纯地从提取到的所有特征中选择部分特征作为训练集特征,特征在选择前和选择后可以改变值、也不改变值,但是选择后的特征维数肯定比选择前小,毕竟我们只选择了其中的一部分特征。

代码如下:

from sklearn.feature_selection import VarianceThreshold

def var():
    """
    特征选择-删除低方差的特征
    """
    var = VarianceThreshold(threshold=1.0)
    data = var.fit_transform([[0, 2, 0, 3], [0, 1, 4, 3], [0, 1, 1, 3]])
    print(data)


if __name__ == '__main__':
    var()

在这里插入图片描述

6 降维

  • 对一个三维的物体进行二维表示
  • 对一个二维的物体进行一维表示

6.1 PCA

  • PCA是一种分析、简化数据集的技术
  • 目的:是数据维数压缩,尽可能降低原数据的维数(复杂度),损失少量信息。
  • 作用:可以削减回归分析或者聚类分析中特征的数量

案例分析:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
代码如下所示:

from sklearn.decomposition import PCA

def pca():
    """
    主成分分析进行特征降维
    :return: None
    """
    pca = PCA(n_components=0.9)
    data = pca.fit_transform([[2,8,4,5],[6,3,0,8],[5,4,9,1]])
    print(data)


if __name__ == '__main__':
    pca()

在这里插入图片描述

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

等待着冬天的风

你的鼓励将是我创作的最大动力

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

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

打赏作者

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

抵扣说明:

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

余额充值