当前位置:   article > 正文

sklearn与特征工程_sklearn中的特征工程

sklearn中的特征工程

01、特性工程简介

为了提取知识和做出预测,机器学习使用数学模型来拟合数据。这些模型将特征作为输入。特征就是原始数据某个方面的数值表示。在机器学习流程中,特征是数据和模型之间的纽带。特征工程是指从原始数据中提取特征并将其转换为适合机器学习模型的格式。它是机器学习流程中一个极其关键的环节,因为正确的特征可以减轻构建模型的难度,从而使机器学习流程输出更高质量的结果。
数据决定了机器学习的上限,而算法只是尽可能逼近这个上限”,这句话很好的阐述了数据在机器学习中的重要性。大部分直接拿过来的数据都是特征不明显的、没有经过处理的或者说是存在很多无用的数据,那么需要进行一些特征处理特征的缩放等等,满足训练数据的要求。
例如:你要查看不同地域女性的穿衣品牌情况,预测不同地域的穿衣品牌。如果其中含有一些男性的数据,是不是要将这些数据给去除掉

特征工程的意义

  • 更好的特征意味着更强的鲁棒性
  • 更好的特征意味着只需用简单模型
  • 更好的特征意味着更好的结果

特征工程之特征处理

特征工程中最重要的一个环节就是特征处理,特征处理包含了很多具体的专业技巧

  • 特征预处理
    • 单个特征
      • 归一化
      • 标准化
      • 缺失值
    • 多个特征
      • 降维(PCA)

02、sklearn介绍

自2007年发布以来,scikit-learn已经成为最给力的Python机器学习库(library)了。scikit-learn支持的机器学习算法包括分类回归降维聚类。还有一些特征提取(extracting features)数据处理(processing data)模型评估(evaluating models)的模块。作为Scipy库的扩展,scikit-learn也是建立在Python的NumPy和matplotlib库基础之上。NumPy可以让Python支持大量多维矩阵数据的高效操作,matplotlib提供了可视化工具,SciPy带有许多科学计算的模型。scikit-learn文档完善,容易上手,丰富的API,使其在学术界颇受欢迎。开发者用scikit-learn实验不同的算法,只要几行代码就可以搞定。scikit-learn包括许多知名的机器学习算法的实现,包括LIBSVM和LIBLINEAR。还封装了其他的Python库,如自然语言处理的NLTK库。另外,scikit-learn内置了大量数据集,允许开发者集中于算法设计,节省获取和整理数据集的时间。

03、数据的类型

  1. 按照机器学习的数据分类
  • 标称型
    • 标称型目标变量的结果只在有限目标集中取值,如真与假(标称型目标变量主要用于分类)
  • 数值型
    • 数值型目标变量则可以从无限的数值集合中取值,如0.100,42.001等 (数值型目标变量主要用于回归分析)
  1. 按照数据本身分布特性
  • 离散型
    • 离散变量是指其数值只能用自然数或整数单位计算的则为离散变量.例如,班级人数、进球个数、是否是某个类别等等
  • 连续性
    • 连续型数据是指在指定区间内可以是任意一个数值,例如,票房数据、花瓣大小分布数据
      在这里插入图片描述

04、数据的特征抽取

现实世界中多数特征都不是连续变量,比如分类文字图像等,为了对非连续变量做特征表述,需要对这些特征做数学化表述,因此就用到了特征提取. sklearn.feature_extraction提供了特征提取的很多方法

4.1、字典特征抽取特征变量提取

我们将城市和环境作为 字典数据,来进行特征的提取。(字典特征抽取)

sklearn.feature_extraction.DictVectorizer(sparse = True)
  • 1

将映射列表转换为Numpy数组或scipy.sparse矩阵

-sparse是否转换为scipy.sparse矩阵表示,默认开启

DictVectorizer语法

  • DictVectorizer.fit_transform(X)
    • x:字典或者包含字典的迭代器
    • 返回值:返回sparse矩阵
  • DictVectorizer.inverse_transform(x)
    • x: array数组或者sparse矩阵
    • 返回值:转换之前的数据格式
  • DictVectorizer.get_feature_names()
    • 返回类别名称
  • DictVectorize.transform(x)
    • 按照原先的标准转换

流程:

  1. 实例化类DictVectorizer
  2. 调用fit_transform方法输入数据并转换
from sklearn.feature_extraction import DictVectorizer
onehot = DictVectorizer() # 如果结果不用toarray,请开启sparse=False
instances = [{'city': '北京','temperature':100},{'city': '上海','temperature':60}, {'city': '深圳','temperature':30}]
X = onehot.fit_transform(instances).toarray()
print(onehot.inverse_transform(X))
  • 1
  • 2
  • 3
  • 4
  • 5

one-hot编码介绍

4.2、文本特征抽取

文本的特征提取应用于很多方面,比如说文档分类、垃圾邮件分类和新闻分类。那么文本分类是通过词是否存在、以及词的概率(重要性)来表示。

文档的中词的出现

数值为1表示词表中的这个词出现,为0表示未出现

sklearn.feature_extraction.text.CountVectorizer()
  • 1

将文本文档的集合转换为计数矩阵

CountVectorizer语法

CountVectorizer(max_df=1.0,min_df=1,…)

  • 返回词频矩阵
  • CountVectorizer。fit_transform(x,y)
    • x:文本或者包含文本字符串的可迭代对象
    • 返回值:返回sparse矩阵
  • CountVectorizer.inverse_trasnform(x)
    • x:array数组或者sparse矩阵
    • 返回值:转换之前数据格式
  • CountVectorizer.get_feature_names()
    • 返回值:单词列表

05、数据的特征预处理

单个特征:

归一化:

归一化首先在特征(维度)非常多的时候,可以防止某一维或某几维对数据影响过大,也是为了把不同来源的数据统一到一个参考区间下,这样比较起来才有意义,其次可以程序可以运行更快。
常用的方法是通过对原始数据进行线性变换把数据映射到[0,1]之间,变换的函数为:
min-max方法

X ’ = x − m i n m a x − m i n X^’ = \frac{x-min}{max-min} X=maxminxmin

  • min-max的scikit-learn处理

scikit-learn.preprocessing中的类MinMaxScaler,将数据矩阵缩放到[0,1]之间

>>> X_train = np.array([[ 1., -1.,  2.],
...                     [ 2.,  0.,  0.],
...                     [ 0.,  1., -1.]])
...
>>> min_max_scaler = preprocessing.MinMaxScaler()
>>> X_train_minmax = min_max_scaler.fit_transform(X_train)
>>> X_train_minmax
array([[ 0.5       ,  0.        ,  1.        ],
       [ 1.        ,  0.5       ,  0.33333333],
       [ 0.        ,  1.        ,  0.        ]])
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
标准化

常用的方法是z-score标准化,经过处理后的数据均值为0,标准差为1,处理方法是:

X ‘ = x − u σ X^ `=\frac{x-u}{\sigma} X=σxu
其中 μ \mu μ是样本的均值, σ \sigma σ是样本的标准差,它们可以通过现有的样本进行估计,在已有的样本足够多的情况下比较稳定,适合嘈杂的数据场景

sklearn中提供了StandardScalar类实现列标准化:

In [2]: import numpy as np

In [3]: X_train = np.array([[ 1., -1.,  2.],[ 2.,  0.,  0.],[ 0.,  1., -1.]])

In [4]: from sklearn.preprocessing import StandardScaler

In [5]: std = StandardScaler()

In [6]: X_train_std = std.fit_transform(X_train)

In [7]: X_train_std
Out[7]:
array([[ 0.        , -1.22474487,  1.33630621],
       [ 1.22474487,  0.        , -0.26726124],
       [-1.22474487,  1.22474487, -1.06904497]])
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
缺失值

由于各种原因,许多现实世界的数据集包含缺少的值,通常编码为空白,NaN或其他占位符。然而,这样的数据集与scikit的分类器不兼容,它们假设数组中的所有值都是数字,并且都具有和保持含义。使用不完整数据集的基本策略是丢弃包含缺失值的整个行和/或列。然而,这是以丢失可能是有价值的数据(即使不完整)的代价。更好的策略是估算缺失值,即从已知部分的数据中推断它们。

(1)填充缺失值 使用sklearn.preprocessing中的Imputer类进行数据的填充

>>> import numpy as np
>>> from sklearn.preprocessing import Imputer
>>> imp = Imputer(missing_values='NaN', strategy='mean', axis=0)
>>> imp.fit([[1, 2], [np.nan, 3], [7, 6]])
Imputer(axis=0, copy=True, missing_values='NaN', strategy='mean', verbose=0)
>>> X = [[np.nan, 2], [6, np.nan], [7, 6]]
>>> print(imp.transform(X))                          
[[ 4.          2.        ]
 [ 6.          3.666...]
 [ 7.          6.        ]]
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
多个特征

降维

PCA(Principal component analysis),主成分分析。特点是保存数据集中对方差影响最大的那些特征,PCA极其容易受到数据中特征范围影响,所以在运用PCA前一定要做特征标准化,这样才能保证每维度特征的重要性等同。

sklearn.decomposition.PCA

>>> import numpy as np
>>> from sklearn.decomposition import PCA
>>> X = np.array([[-1, -1], [-2, -1], [-3, -2], [1, 1], [2, 1], [3, 2]])
>>> pca = PCA(n_components=2)
>>> pca.fit(X)
PCA(copy=True, iterated_power='auto', n_components=2, random_state=None,
  svd_solver='auto', tol=0.0, whiten=False)
>>> print(pca.explained_variance_ratio_)
[ 0.99244...  0.00755...]
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

字典数据提取

def dictvec():
    """
    字典数据抽取
    :return: None
    """
    # 实例化
    # sparse改为True,输出的是每个不为零位置的坐标,稀疏矩阵可以节省存储空间
    dict = DictVectorizer(sparse=False)  # 把sparse改为True看看

    # 调用fit_transform
    data = dict.fit_transform([{'city': '北京', 'temperature': 100},
                               {'city': '上海', 'temperature': 60},
                               {'city': '深圳', 'temperature': 30}])
    print(data)
    print('-' * 50)
    print(dict.get_feature_names())  # 字典中的一些类别数据,分别进行转换成特征
    print('-' * 50)
    print(dict.inverse_transform(data))

    return None

dictvec()
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22

运行结果

[[  0.   1.   0. 100.]
 [  1.   0.   0.  60.]
 [  0.   0.   1.  30.]]
--------------------------------------------------
['city=上海', 'city=北京', 'city=深圳', 'temperature']
--------------------------------------------------
[{'city=北京': 1.0, 'temperature': 100.0}, {'city=上海': 1.0, 'temperature': 60.0}, {'city=深圳': 1.0, 'temperature': 30.0}]

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

文本数据

def couvec():
    # 实例化CountVectorizer

    vector = CountVectorizer(max_df=2)

    # 调用fit_transform输入并转换数据

    res = vector.fit_transform(
        ["life is short,i like python", "life is too long,i dislike python", "life is short"])

    # 打印结果,把每个词都分离了
    print(vector.get_feature_names())
    print(res)
    # 对照feature_names,标记每个词出现的次数
    print(res.toarray())
couvec()
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16

运行结果

['dislike', 'like', 'long', 'python', 'short', 'too']
  (0, 4)	1
  (0, 1)	1
  (0, 3)	1
  (1, 3)	1
  (1, 5)	1
  (1, 2)	1
  (1, 0)	1
  (2, 4)	1
[[0 1 0 1 1 0]
 [1 0 1 1 0 1]
 [0 0 0 0 1 0]]

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/weixin_40725706/article/detail/412095
推荐阅读
相关标签
  

闽ICP备14008679号