scikit-learn机器学习笔记——特征提取、特征处理

  • 数据特征提取
  • 字典特征提取
  • 文本特征提取
  • 中文文本特征提取
  • TF-IDF
  • 数据特征处理
  • 归一化
  • 标准化
  • 缺失值


数据特征提取

  • 特征提取针对非连续型字典等数据特征值化
  • 特征提取对文本等进行特征值化

scikit-learn特征抽取的API :sklearn.feature_extraction

字典特征提取

作用:对字典数据进行特征值化

类:sklearn.feature_extraction.DictVectorizer

DictVectorizer语法:

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

代码示例:

from sklearn.feature_extraction import DictVectorizer


def dic_extract(X):
    '''
    字典特征抽取
    :return: None
    '''
    # 实例化类DictVectorizer
    dic = DictVectorizer(sparse=False)
    # 调用fit_transform方法输入数据并转换 注意返回格式
    data = dic.fit_transform(X)
    print(dic.get_feature_names())
    print(data)
    return None

if __name__ == '__main__':
    X = [{'city': '北京', 'temperature': 100},
        {'city': '上海', 'temperature': 60},
        {'city': '深圳', 'temperature': 30}]
    dic_extract(X)
['city=上海', 'city=北京', 'city=深圳', 'temperature']
[[  0.   1.   0. 100.]
 [  1.   0.   0.  60.]
 [  0.   0.   1.  30.]]

文本特征提取

作用:对文本数据进行特征值化
注意:文本特征提取不会统计单个字母或汉字

类:sklearn.feature_extraction.text.CountVectorizer

CountVectorizer语法:

  • CountVectorizer(max_df=1.0,min_df=1,…)
    返回词频矩阵
  • CountVectorizer.fit_transform(X)
  • X:文本或者包含文本字符串的可迭代对象
  • 返回值:返回sparse矩阵
  • CountVectorizer.inverse_transform(X)
  • X:array数组或者sparse矩阵
  • 返回值:转换之前数据格式
  • CountVectorizer.get_feature_names()
  • 返回值:单词列表

代码示例:英文文本特征提取

from sklearn.feature_extraction.text import CountVectorizer

def text_extract(X):
    '''
    文本特征提取
    :return: None
    '''
    # 实例化CountVectorizer
    text = CountVectorizer()
    # 调用fit_transform方法输入数据并转换
    # 注意返回格式,利用toarray()进行sparse矩阵转换array数组
    data = text.fit_transform(X)
    print(data)
    print(text.get_feature_names())
    print(data.toarray())
    return None



if __name__ == '__main__':
    X = ["life is short,i like python" ,
         "life is too long,i dislike python"]
    text_extract(X)
(0, 2)	1
  (0, 1)	1
  (0, 6)	1
  (0, 3)	1
  (0, 5)	1
  (1, 2)	1
  (1, 1)	1
  (1, 5)	1
  (1, 7)	1
  (1, 4)	1
  (1, 0)	1
['dislike', 'is', 'life', 'like', 'long', 'python', 'short', 'too']
[[0 1 1 1 0 1 1 0]
 [1 1 1 0 1 1 0 1]]

中文文本特征提取

使用jieba分词

API:jieba.cut

返回值:词语生成器

代码示例:中文文本特征提取

from sklearn.feature_extraction.text import CountVectorizer
import jieba

def text_extract(X):
    '''
    中文文本特征提取
    :return: None
    '''
    # 实例化CountVectorizer
    text = CountVectorizer()
    #准备句子,利用jieba.cut进行分词
    data = []
    for i in range(len(X)):
        # print(X[i])
        data.append(list(jieba.cut(X[i])))

    print(data)
    # 将分词结果变成字符串当作fit_transform的输入值
    con = []
    for i in range(len(data)):
        con.append(' '.join(data[i]))
    print(con)

    cn_text = text.fit_transform(con)
    print(text.get_feature_names())
    # 注意返回格式,利用toarray()进行sparse矩阵转换array数组
    print(cn_text.toarray())
    return None



if __name__ == '__main__':
    X = ['今天很残酷,明天更残酷,后天很美好,但绝对大部分是死在明天晚上,所以每个人不要放弃今天。' ,
         '我们看到的从很远星系来的光是在几百万年之前发出的,这样当我们看到宇宙时,我们是在看它的过去。' ,
         '如果只用一种方式了解某样事物,你就不会真正了解它。了解事物真正含义的秘密取决于如何将其与我们所了解的事物相联系。']
    text_extract(X)
['一种', '不会', '不要', '之前', '了解', '事物', '今天', '光是在', '几百万年', '发出', '取决于', '只用', '后天', '含义', '大部分', '如何', '如果', '宇宙', '我们', '所以', '放弃', '方式', '明天', '星系', '晚上', '某样', '残酷', '每个', '看到', '真正', '秘密', '绝对', '美好', '联系', '过去', '这样']
[[0 0 1 0 0 0 2 0 0 0 0 0 1 0 1 0 0 0 0 1 1 0 2 0 1 0 2 1 0 0 0 1 1 0 0 0]
 [0 0 0 1 0 0 0 1 1 1 0 0 0 0 0 0 0 1 3 0 0 0 0 1 0 0 0 0 2 0 0 0 0 0 1 1]
 [1 1 0 0 4 3 0 0 0 0 1 1 0 1 0 1 1 0 1 0 0 1 0 0 0 1 0 0 0 2 1 0 0 1 0 0]]

TF-IDF

  TF-IDF是一个用于信息检索和聚类的词加权方法,给出语料库文档中单词的权重,表示重要性。
  TF(item frequency,词频):衡量词在文档中出现的频率。由于文档的长度不同,词在长文中出现次数有可能比在短文中出现的次数多得多。因此,一般会对词频进行归一化,用其除以文档长度或文档的总词数。
  IDF(inverse document frequency,逆文档频率):衡量词的重要性。在计算词频时,我们认为所有的词都同等重要。但是某些词(如is、of和that)有可能出现很多次,但这些词并不重要。因此,我们需要减少常见词的权重,加大稀有词的权重。

类:sklearn.feature_extraction.text.TfidfVectorizer

TfidfVectorizer语法

  • TfidfVectorizer(stop_words=None,…) • 返回词的权重矩阵
  • TfidfVectorizer.fit_transform(X,y)
  • X:文本或者包含文本字符串的可迭代对象
  • 返回值:返回sparse矩阵
  • TfidfVectorizer.inverse_transform(X)
  • X:array数组或者sparse矩阵
  • 返回值:转换之前数据格式
  • TfidfVectorizer.get_feature_names()
  • 返回值:单词列表

代码示例:

from sklearn.feature_extraction.text import TfidfVectorizer
import jieba

def tfidf_text_extract(X):
    '''
    中文文本特征提取
    :return: None
    '''
    # 实例化CountVectorizer
    text = TfidfVectorizer()
    #准备句子,利用jieba.cut进行分词
    data = []
    for i in range(len(X)):
        # print(X[i])
        data.append(list(jieba.cut(X[i])))

    print(data)
    # 将分词结果变成字符串当作fit_transform的输入值
    con = []
    for i in range(len(data)):
        con.append(' '.join(data[i]))
    print(con)

    cn_text = text.fit_transform(con)
    print(text.get_feature_names())
    # 注意返回格式,利用toarray()进行sparse矩阵转换array数组
    print(cn_text.toarray())
    return None



if __name__ == '__main__':
    X = ['今天很残酷,明天更残酷,后天很美好,但绝对大部分是死在明天晚上,所以每个人不要放弃今天。' ,
         '我们看到的从很远星系来的光是在几百万年之前发出的,这样当我们看到宇宙时,我们是在看它的过去。' ,
         '如果只用一种方式了解某样事物,你就不会真正了解它。了解事物真正含义的秘密取决于如何将其与我们所了解的事物相联系。']
    tfidf_text_extract(X)
['一种', '不会', '不要', '之前', '了解', '事物', '今天', '光是在', '几百万年', '发出', '取决于', '只用', '后天', '含义', '大部分', '如何', '如果', '宇宙', '我们', '所以', '放弃', '方式', '明天', '星系', '晚上', '某样', '残酷', '每个', '看到', '真正', '秘密', '绝对', '美好', '联系', '过去', '这样']
[[0.         0.         0.21821789 0.         0.         0.
  0.43643578 0.         0.         0.         0.         0.
  0.21821789 0.         0.21821789 0.         0.         0.
  0.         0.21821789 0.21821789 0.         0.43643578 0.
  0.21821789 0.         0.43643578 0.21821789 0.         0.
  0.         0.21821789 0.21821789 0.         0.         0.        ]
 [0.         0.         0.         0.2410822  0.         0.
  0.         0.2410822  0.2410822  0.2410822  0.         0.
  0.         0.         0.         0.         0.         0.2410822
  0.55004769 0.         0.         0.         0.         0.2410822
  0.         0.         0.         0.         0.48216441 0.
  0.         0.         0.         0.         0.2410822  0.2410822 ]
 [0.15698297 0.15698297 0.         0.         0.62793188 0.47094891
  0.         0.         0.         0.         0.15698297 0.15698297
  0.         0.15698297 0.         0.15698297 0.15698297 0.
  0.1193896  0.         0.         0.15698297 0.         0.
  0.         0.15698297 0.         0.         0.         0.31396594
  0.15698297 0.         0.         0.15698297 0.         0.        ]]

数据特征处理

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

数值型数据:

  • 归一化
  • 标准化
  • 缺失值

类别型数据:

  • one-hot编码

时间类型:

  • 时间的切分

sklearn特征处理API:sklearn. preprocessing

归一化

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

公式: tsfresh特征提取报错 An attempt has been made to start a new process before t 特征提取结果_ci

注:作用于每一列,max为一列的最大值, min为一列的最小值, X" 为最终结果, tsfresh特征提取报错 An attempt has been made to start a new process before t 特征提取结果_机器学习_02

分为两步:1.归一化,2.转换到指定区间

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

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

def min_max(X):
    '''
    最大最小化
    :param X:
    :return:None
    '''
    print(X)
    # 实例化
    min_max = MinMaxScaler()
    # 转换数据
    data = min_max.fit_transform(X)
    print(data)

if __name__ == '__main__':
    X = [[90,2,10,40],
        [60,4,15,45],
        [75,3,13,46]]
    min_max(X)
[[90, 2, 10, 40], [60, 4, 15, 45], [75, 3, 13, 46]]
[[1.         0.         0.         0.        ]
 [0.         1.         1.         0.83333333]
 [0.5        0.5        0.6        1.        ]]

归一化总结:

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

标准化

通过对原始数据进行变换把数据变换到均值为0,方差为1范围内。

公式: tsfresh特征提取报错 An attempt has been made to start a new process before t 特征提取结果_特征提取_03

注: 作用于每一列,mean为平均值, tsfresh特征提取报错 An attempt has been made to start a new process before t 特征提取结果_ci_04 为标准差(考量数据的稳定性)
std成为方差, tsfresh特征提取报错 An attempt has been made to start a new process before t 特征提取结果_ci_05

  对于归一化来说:如果出现异常点,影响了最大值和最小值,那么结果显然会发生改变。

  对于标准化来说:如果出现异常点,由于具有一定数据量,少量的异常点对于平均值的影响并不大,从而方差改变较小。

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

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

def standard(X):
    '''
    标准化
    :param X:
    :return:None
    '''
    print(X)
    # 实例化
    stand = StandardScaler()
    # 转换数据
    data = stand.fit_transform(X)
    print(data)
    print(stand.mean_, stand.scale_)

if __name__ == '__main__':
    X = [[ 1., -1., 3.],
        [ 2., 4., 2.],
        [ 4., 6., -1.]]
    standard(X)
[[1.0, -1.0, 3.0], [2.0, 4.0, 2.0], [4.0, 6.0, -1.0]]
[[-1.06904497 -1.35873244  0.98058068]
 [-0.26726124  0.33968311  0.39223227]
 [ 1.33630621  1.01904933 -1.37281295]]
[2.33333333 3.         1.33333333] [1.24721913 2.94392029 1.69967317]

标准化总结

  在已有样本足够多的情况下比较稳定,适合现代嘈杂大数据场景。

缺失值

缺失值处理方法:

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

sklearn缺失值API: from sklearn.impute import SimpleImputer

SimpleImputer语法

  • SimpleImputer(*, missing_values=nan, strategy=‘mean’,
    fill_value=None, verbose=0, copy=True, add_indicator=False)[source]
  • SimpleImputer.fit_transform(X)
  • X:numpy array格式的数据[n_samples,n_features]
  • 返回值:转换后的形状相同的array

SimpleImputer流程:

1、初始化Imputer,指定”缺失值”,指定填补策略,指定行或列。
注:缺失值也可以是别的指定要替换的值。
2、调用fit_transform。

from sklearn.impute import SimpleImputer
import numpy as np


def miss_values(X):
    '''
    缺失值填补
    :param X:
    :return:
    '''
    print(X)
    # 实例化SimpleImputer(missing_values='nan', strategy='mean')
    mis_val = SimpleImputer(strategy='mean')
    # 转换数据
    data = mis_val.fit_transform(X)
    print(data)
    return None

if __name__ == '__main__':
    X = [[1, 2],
        [np.nan, 3],
        [7, 6]]
    miss_values(X)
[[1, 2], [nan, 3], [7, 6]]
[[1. 2.]
 [4. 3.]
 [7. 6.]]