机器学习之特征工程

特征工程

  1. 特征工程:是将原始数据转换为更好地代表预测模型潜在问题的特征的过程,从而提高对未知数据模型的准确性
  2. 特征工程的意义:直接影响模型的预测结果
  3. Scikit-learn库介绍:Python语言的机器学习工具,包括许多知名的机器学习算法的实现。
    sklearn特征抽取API:sklearn.feature_extraction

一、 数据的特征抽取

1. 字典特征抽取

  1. 作用:对字典数据进行特征值化
  2. 类:sklearn.feature_extraction.DictVectorizer
  3. DictVectorizer语法:DictVectorizer(sparse=True,…)
    • DictVectorizer.fit_transform(X) // fit_transform: 装入数据,然后对他们进行转换
      X:字典或者包含字典的迭代器
      返回值:返回sparse矩阵
    • DictVectorizer.inverse_transform(X)
      X:array数组或者sparse矩阵
      返回值:转换之前数据格式
    • DictVectorizer.get_feature_names()
      返回类别名称
    • DictVectorizer.transform(X)
      按照原先的标准转换
  4. 代码示例:
    # 字典特征抽取
    from sklearn.feature_extraction import DictVectorizer
    
    # 实例化,字典特征提取方法
    dict = DictVectorizer()  # 将映射列表转换为scipy.sparse矩阵
    # dict = DictVectorizer(sparse=False)  # 将映射列表转换为Numpy数组
    
    # 调用fit_transform,计算各个词语出现的次数。
    data = dict.fit_transform([{"wife1": "伯方真妃", "age": 19},
                               {"wife2": "御坂美琴", "age": 14},
                               {"wife3": "Sherry", "age": 20}])
    
    print(dict.get_feature_names())  # 获取特征值的名字
    print(data)
    print(dict.inverse_transform(data))  # 将Numpy数组或scipy.sparse矩阵转换为映射列表
    

2. 文本特征抽取

  1. 作用:对文本数据进行特征值化

  2. 类:sklearn.feature_extraction.text.CountVectorizer

  3. CountVectorizer语法:CountVectorizer(max_df=1.0,min_df=1,…)

    • CountVectorizer.fit_transform(X,y)
      X:文本或者包含文本字符串的可迭代对象
      返回值:返回sparse矩阵
    • CountVectorizer.inverse_transform(X)
      X:array数组或者sparse矩阵
      返回值:转换之前数据格式
    • CountVectorizer.get_feature_names()
      返回值:单词列表
    # 文本特征抽取
    from sklearn.feature_extraction.text import CountVectorizer
    
    # 实例化,文本特征提取方法
    cv = CountVectorizer()
    # 应用并转化映射列表,计算各个词语出现的次数。
    data = cv.fit_transform(["cxcxrs, I love you!", "I am Sherry, I love cxcxrs."])
    
    print(cv.get_feature_names())  # 显示文本中不重复的单词。 (单个英文字母/汉字不统计:没有分类依据)
    print(data.toarray())  # 显示该位置的单词出现次数,toarray()方法使其转变为numpy的数组形式
    # print(data)	
    
    
  4. TF-IDF类:sklearn.feature_extraction.text.TfidfVectorizer

    TF-IDF算法 = TF * IDF

    • TF: term frequency: 词的频率 —— 出现次数
    • IDF: 逆⽂档频率inverse document frequency —— log(总⽂档数量/出现该词的⽂档的数量)
  5. TF-IDF类作用:用以评估一字词对于一个文件集或一个语料库中的其中一份文件的重要程度。

  6. TfidfVectorizer语法:TfidfVectorizer(stop_words=None,…),返回词的权重矩阵

    • TfidfVectorizer.fit_transform(X,y)
      X:文本或者包含文本字符串的可迭代对象
      返回值:返回sparse矩阵
    • TfidfVectorizer.inverse_transform(X)
      X:array数组或者sparse矩阵
      返回值:转换之前数据格式
    • TfidfVectorizer.get_feature_names()
      返回值:单词列表
    # 对汉字进行特征值化 tf-idf 方法
    from sklearn.feature_extraction.text import TfidfVectorizer
    import jieba 
     
     # 对中文进行分词
     def cutWord():
         # jieba分词
         con1 = jieba.cut("我是伯方真妃,喜欢cxcxrs。")
         con2 = jieba.cut("我是御坂美琴,cxcxrs才不喜欢!")
         con3 = jieba.cut("我是Sherry,cxcxrs喂药给你吃,让你变小。")
         # 将jieba生成器对象转化为列表
         content1 = list(con1)
         content2 = list(con2)
         content3 = list(con3)
         # 将列表转化为字符串
         c1 = " ".join(content1)
         c2 = " ".join(content2)
         c3 = " ".join(content3)
         return c1, c2, c3
     
     # 实例化,文本特征提取方法
     tf = TfidfVectorizer()
     # 用jieba库给中文文本分词
     c1, c2, c3 = cutWord()
     print(c1, c2, c3)
     # 应用并转化映射列表,计算各个词语出现的次数。
     data = tf.fit_transform([c1, c2, c3])
     print(tf.get_feature_names())  # 显示文本中不重复的汉字。 (单个英文字母/汉字不统计:没有分类依据)
     print(data.toarray())  # 显示该位置汉字,出现的次数
     
    
  7. 安装结巴库:在命令行中 conda install -c conda-forge jieba

二、 数据的特征处理

通过特定的统计方法(数学方法)将数据转换成算法要求的数据
数值型数据:标准缩放: 1、归一化 2、标准化 3、缺失值
类别型数据:one-hot编码
时间类型:时间的切分
sklearn特征处理API:sklearn. preprocessing

1. 归一化

  1. 特点:通过对原始数据进行变换把数据映射到(默认为[0,1])之间

  2. 公式:
    归一化1
    归一化2

    注:作用于每一列,max为一列的最大值,min为一列的最小值,
    那么 X’’ 为最终结果,mx,mi分别为指定区间值默认mx为1,mi为0

  3. sklearn归一化API: sklearn.preprocessing.MinMaxScaler

  4. MinMaxScaler语法:

    • MinMaxScalar(feature_range=(0,1)…)
      每个特征缩放到给定范围(默认[0,1])

    • MinMaxScalar.fit_transform(X)
      X:numpy array格式的数据[n_samples,n_features]
      返回值:转换后的形状相同的array

    # 归一化处理(缩放数据)
    from sklearn.preprocessing import MinMaxScaler
    
    mm = MinMaxScaler(feature_range=(2, 3))  # 将数据值缩放到2~3范围内
    data = mm.fit_transform([[90, 2, 10, 40], [60, 4, 15, 45], [75, 3, 13, 46]])  
    print(data)
    
  5. 归一化总结:

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

2. 标准化

  1. 特点:通过对原始数据进行变换把数据变换到均值为0,标准差为1范围内

  2. 公式:
     标准化1
    注:作用于每一列,mean为平均值,σ为标准差(考量数据的稳定性,离散程度)

    标准化2

    对于归一化来说:如果出现异常点,影响了最大值和最小值,那么结果显然会发生改变
    对于标准化来说:如果出现异常点,由于具有一定数据量,少量的异常点对于平均值的影响并不大,从而标准差改变较小。

  3. sklearn标准化API: scikit-learn.preprocessing.StandardScaler

  4. StandardScaler语法:

    • StandardScaler(…)
      处理之后每列来说所有数据都聚集在均值0附近方差为1

    • StandardScaler.fit_transform(X,y)
      X:numpy array格式的数据[n_samples,n_features]
      返回值:转换后的形状相同的array

    • StandardScaler.mean
      原始数据中每列特征的平均值

    • StandardScaler.std
      原始数据每列特征的方差

    # 标准化(缩放)
    from sklearn.preprocessing import StandardScaler
    
    std = StandardScaler()
    data = std.fit_transform([[1., -1., 3.], [2., 4., 2.], [4., 6., -1.]])
    print(data)
    print(data.mean)
    print(data.std)
    
  5. 标准化总结:在已有样本足够多的情况下比较稳定,适合现代嘈杂大数据场景。

3. 缺失值

  1. 缺失值处理方法:

    方法说明
    删除如果每列或者行数据缺失值达到一定的比例,建议放弃整行或者整列
    插补可以通过缺失值每行或者每列的平均值、中位数来填充

    sklearn缺失值API: sklearn.preprocessing.Imputer

  2. imputer语法:

    • Imputer(missing_values=‘NaN’, strategy=‘mean’, axis=0)
      完成缺失值插补
      axis=0:按列,axis=1:按行,missing_values = “NaN”/ “nan”
    • Imputer.fit_transform(X,y)
      X:numpy array格式的数据[n_samples,n_features] //数组中的缺失值用np.nan代替
      返回值:转换后的形状相同的array
    # 缺失值处理		 ( impute v.归咎(于);归罪(于);归因(于) )
    from sklearn.preprocessing import Imputer
    import numpy as np
    
    # missing_values="NaN" 或 "nan"
    im = Imputer(missing_values="NaN", strategy="mean", axis=0)  # 按列取平均数,填入空缺的值
    data = im.fit_transform([[1, 2], [np.nan, 3], [7, 6]])
    print(data)
    
  3. 关于np.nan(np.NaN):

    • numpy的数组中可以使用np.nan/np.NaN来代替缺失值,属于float类型
    • 如果是文件中的一些缺失值,可以替换成nan,通过np.array转化成float
      型的数组即可

三、数据的特征选择

1. 特征选择概念

  • 特征选择原因:
    冗余:部分特征的相关度高,容易消耗计算性能
    噪声:部分特征对预测结果有负影响

  • 特征选择是什么:
    特征选择就是单纯地从提取到的所有特征中选择部分特征作为训练集特征,
    特征在选择前和选择后可以改变值、也不改变值,但是选择后的特征维数肯
    定比选择前小,毕竟我们只选择了其中的一部分特征。

    主要方法:

    • Filter(过滤式):VarianceThreshold
    • Embedded(嵌入式):正则化、决策树
    • Wrapper(包裹式)

2. sklearn特征选择API

  • sklearn.feature_selection.VarianceThreshold

3. VarianceThreshold语法

  • VarianceThreshold(threshold = 0.0)
    删除所有低方差特征
    • Variance.fit_transform(X,y)
      X:numpy array格式的数据[n_samples,n_features]
      返回值:训练集差异低于threshold的特征将被删除
      默认值是保留所有非零方差特征,即删除所有样本中具有相同值的特征(列)
# 特征选择-删除低方差的特征
from sklearn.feature_selection import VarianceThreshold

var = VarianceThreshold(threshold=0)
data = var.fit_transform([[0, 2, 0, 3], [0, 1, 4, 3], [0, 1, 1, 3]])
print(data)

注:

  1. variance [ˈveəriəns] n.变化幅度;差额
  2. threshold [ˈθreʃhəʊld] n. 阈; 界; 起始点; 开端; 起点; 入门; 门槛; 门口;
  3. 其他特征选择方法,还有神经网络

四、数据降维

1. sklearn降维API

  • sklearn.decomposition
    decomposition [ˌdiːˌkɒmpəˈzɪʃn] n. 腐烂;分解
    composition n. 成分;构成;作曲;创作

2. PCA概念

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

3. PCA语法

  • PCA(n_components=None)
    将数据分解为较低维数空间
    • n_components取值:
      ⼩数:取值01,一般取0.900.95
      整数:减少到的特征数量
    • component [kəmˈpəʊnənt] n. 组成部分;成分;部件
  • PCA.fit_transform(X)
    X:numpy array格式的数据[n_samples,n_features]
    返回值:转换后指定维度的array
# 主成分分析-进行特征降维
from sklearn.decomposition import PCA

pca = PCA(n_components=0.9)  # n_components取值0.9~0.95
data = pca.fit_transform([[2, 8, 4, 5], [6, 3, 0, 8], [5, 4, 9, 1]])
print(data)

注:

  1. 降维:其中的维度是指特征的数量,即列的数量。降维,减少数据特征的数量。
  2. PCA: 特征数量到达上百,考虑数据的简化时,使用。
  3. 其他降维方法,线性判别分析LDA

后记

鲁迅先生曾经说过:“男人变态一点,又有什么错。”

最近小c君学了些机器学习相关的知识,
整理了一下,
分享给大家。

原先的示例代码有些许枯燥,
改编后,
心中欢快不少 ~

有问题欢迎留言,
喜欢的可以点赞收藏哦~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值