机器学习——特征工程

机器学习是从数据中自动分析获取规律(模型),并利用规律对未知数据进行预测。

数据集的构成:特征值+目标值(根据目的收集特征数据,根据特征去判断、预测)。(注意:机器学习不需要去除重复样本数据)

常用的数据集网址:

  • Kaggle网址:https://www.kaggle.com/datasets
  • UCI数据集网址:https://archive.ics.uci.edu/ml/index.php
  • scikit-learn网址:https://scikit-learn.org/stable/datasets

机器学习首先需要对样本数据进行处理,对样本数据的处理过程叫做特征工程。

特征工程

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

特征工程的意义:提高结果的准确性。

一 特征抽取

特征抽取对文本等数据进行特征值化。(特征值化是为了计算机更好的去理解数据)

1.字典数据特征抽取

字典数据抽取:把字典中一些类别数据,分别进行转换成特征。

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

类:sklearn.feature_extraction.DictVectorizer
DictVectorizer语法:
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 dictvec():
    """
    字典数据抽取
    :return:  None
    """
    # 实例化 # sparse矩阵
    dict = DictVectorizer(sparse=False)
    # 调用fit_transform
    data = dict.fit_transform(
        [{"city": '北京', 'temperature': 100}, {"city": '上海', 'temperature': 80}, {"city": '杭州', 'temperature': 60}])
    print(dict.get_feature_names())
    print(dict.inverse_transform(data))
    print(data)
    return None


if __name__ == "__main__":
    dictvec()
eg

2.文本数据特征抽取

文本特征抽取用途文本分类、情感分析。中文文本抽取要分词,分词所用工具库jieba。

作用:对文本数据进行特征化。

第一种方式:

类:sklearn.feature_extraction.text.CountVectorizer
CountVectorizer()
  返回词频矩阵
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 countvec():
    """
    对文本进行特征化
    :return:None
    """
    cv = CountVectorizer()
    data = cv.fit_transform(['life if short , i like python', 'life is too long, i dislike python'])
    print(cv.get_feature_names())  # 统计所有文章中所有得的词,重复的只统计一次,单个字母不统计(词列表)
    print(data.toarray())  # 统计文章中这个词出现的次数
    return None
eg

第二种方式:TF-IDF

TF-IDF的主要思想是:如果某一个词或者短语在一篇文章中出现的频率高,并且在其它文章中很少出现,则认为此词或者短语具有很好的类别区分能力,适合用来分类。

作用:用来评估一个字词或者短语对于一个文件集或者一个语料库中的其中一份文件的重要程度。

类:sklearn.feature_extraction.text.TfidfVectorizer

TfidfVectorizer():

TfidfVectorizer.fit_transform(X)
   X: 文本或者包含文本字符串的可迭代对象
   返回值:sparse矩阵
TfidfVectorizer.inverse_transform(X)
   X:array数组或者sparse矩阵
   返回值:转换之前的数据格式
TfidfVectorizer.get_feature_names()
   返回值:单词列表
def cut_word():
    import jieba
    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 = cut_word()
    print(c1, c2, c3)
    from sklearn.feature_extraction.text import TfidfVectorizer
    tf = TfidfVectorizer()
    data = tf.fit_transform([c1, c2, c3])
    print(tf.get_feature_names())  # 统计所有文章中所有得的词,重复的只统计一次,单个字母不统计(词列表)
    print(data.toarray())  # 统计文章
    return None
eg

二 特征预处理

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

数值型数据:(1)归一化;(2)标准化。类别型数据:one-hot编码。时间数据:时间切分。

1.归一化

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

公式参考:https://blog.csdn.net/haoji007/article/details/81157224

from sklearn.preprocessing import MinMaxScaler
def mm():
    """
    归一化处理
    :return: None
    """
    mm = MinMaxScaler(feature_range=(2, 3))  # feature_range指定范围
    data = mm.fit_transform([[90, 2, 10, 40], [60, 5, 18, 55]])
    print(data)
    pass

注意:在特定场景下最大值最小值是变化的,另外最大值和最小值非常容易受异常点影响,鲁棒性较差,只适合传统精确小数据场景。(使用较少)

2.标准化

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

def stand():
    """
    标准化
    :return: None
    """
    std = StandardScaler()
    data = std.fit_transform([[1, -1, 3], [2, 4, 4], [3, -2, 6]])
    print("平均值:,", std.mean_)
    print("方差: ", std.var_)
    print(data)

3.缺失值

def im():
    """
    缺失值
    :return:None
    """
    import numpy as np
    from sklearn.impute import SimpleImputer
    im = SimpleImputer(missing_values=np.nan, strategy='mean') #平均值补缺失值
    data = im.fit_transform([[1, 2], [np.nan, 3], [7, 6]])
    print(data)

三 数据降维

数据降维指的是特征的数量。

1.特征选择

进行特征选择的原因:
1.冗余:部分特征相关度高,容易消耗计算性能。

2.噪声:部分特征对预测结果有影响。

特征选择:从提取到的所有特征中选择部分特征作为训练集的特征,选择后的特征维数一般低于选择前。

sklearn.feature_selection.VarianceThreshold
VarianceThreshold(threshold=0.0))
   删除所有低方差特征
VarianceThreshold.fit_transform(X)
   X:numpy array格式的数据
   返回值:训练集差异低于threshold的特征将被删除,默认值是保留所有非零 
               方差特征,即删除所有样本中具有相同值的特征。
def var():
    """
    特征选择-删除低方差的特征
    :return:
    """
    from sklearn.feature_selection import VarianceThreshold
    var = VarianceThreshold(threshold=1.0) # threshold 设置方差阈值
    data = var.fit_transform([[0, 2, 0, 3], [0, 1, 4, 3], [0, 1, 1, 3]])
    print(data)
    return None
eg

2.主成分分析

 PCA 是一种分析、简化数据集的技术。

目的:将数据维数压缩,尽可能降低原数据的维数(复杂度),损失少量信息。

作用:可以消减回归分析或者聚类分析中特征的数量。

sklearn.decomposition.PCA
PCA(n_components=None)
   将数据分解为较低维数空间
PCA.fit_transform(X)
    X:numpy array格式的数据
    返回值:转换后指定维数的array

注意:n_conponents:浮点数,指信息保持量 (0.9-1),数据维度压缩时会损失信息。
def pca():
    """
    主成分分析进行特征降维
    :return:
    """
    from sklearn.decomposition import PCA
    pca = PCA(n_components=0.9)
    data = pca.fit_transform([[0, 2, 0, 3], [0, 1, 4, 3], [0, 1, 1, 3]])
    print(data)
eg
原文地址:https://www.cnblogs.com/-hao-/p/15399446.html