机器学习概述与特征工程


机器学习相关基础


一、机器学习概述

1.1 人工智能、机器学习、神经网络、深度学习的关系

  • 人工智能指的是一系列使机器能够像人类一样处理信息的技术
  • 机器学习是利用计算机编程从历史数据中学习,对新数据进行预测的过程
  • 神经网络是基于生物大脑结构和特征的机器学习的计算机模型
  • 深度学习是机器学习的一个子集,它处理大量的非结构化数据,如人类的语音、文本和图像

图形表现如下:

upload successful

人工智能常用python库(引用图):

upload successful

1.2 机器学习算法分类

  • 监督学习:输入数据由输入特征和目标值组成

    • 分类——函数的输出是一个离散的值

    主要有:

    • k-近邻算法

    • 贝叶斯分类

    • 决策树与随机森林

    • 逻辑回归

    • 回归——函数的输出是一个连续的值

    主要有:

    • 线性回归
    • 岭回归
  • 无监督学习:输入数据是由输入特征值组成

    • 聚类:k-means

1.3 机器学习开发流程

upload successful


二、特征工程

2.1 数据集

数据集是由数据样本组成的集合,分为训练集和测试集。

2.2 常用数据集及其特点

2.2.1 Kaggle

网址:https://www.kaggle.com/datasets

特点:

  • 数据量大
  • 适合大数据相关使用

2.2.2 UCI

网址:http://archive.ics.uci.edu/ml/

特点:

  • 覆盖科学、生活、经济等数据集
  • 数据量较大

2.2.3 scikit-learn

网址:http://scikit-learn.org/stable/datasets/index.html#datasets

特点:

  • 数据量小
  • 便于学习

2.3 特征工程简介

2.3.1 为什么需要特征工程

数据和特征决定机器学习的上限,模型和算法仅仅是逼近这个上限

2.3.2 什么是特征工程

特征工程指的是用专业背景知识和技巧处理相关数据,使得特征能在机器学习算法上发挥更好的作用的一种工程或过程,会直接影响机器学习的效果

2.3.3 特征工程与数据处理

  • pandas:一种十分方便的数据读取和基本处理的工具
  • sklearn:前面有介绍,为特征处理提供了非常强大的接口

特征工程的内容主要包括:

  • 特征提取
  • 特征预处理
  • 特征降维

2.4 特征提取

2.4.1 什么是特征提取

将任意数据如文本或图像转化为可用于机器学习的数字特征的过程

主要包括:

  • 字典特征提取(特征离散化)
  • 文本特征提取
  • 图像特征提取

下面逐个介绍:(事先声明,示例代码为cv而来,但对其做了一部分修改)

2.4.2 字典特征提取

以sklearn为例:

sklearn.feature_extraction.DictVectorizer(sparse=True,...) 
    
# X为字典或包含字典的迭代器,返回值结果为sparse矩阵
  DictVectorizer.fit_transform(X)
# X为array数组或sparse矩阵,返回值结果为转换之前的数据格式
  DictVectorizer.inverse_transform(X)
# 返回类别名称
  DictVectorizer.get_feature_names_out()

示例代码:

from sklearn.feature_extraction import DictVectorizer

def dict_demo():
    """
    字典特征抽取
    :return:
    """
    data = [{'city':'北京', 'temperature':100},
            {'city':'上海', 'temperature':60},
            {'city':'深圳', 'temperature':30}]
    # 1、实例化一个转换器类
    #transfer = DictVectorizer() # 返回sparse矩阵
    transfer = DictVectorizer(sparse=False)
    # 2、调用fit_transform()
    data_new = transfer.fit_transform(data)
    print("data_new:\n", data_new)   # 转化后的
    print("特征名字:\n", transfer.get_feature_names_out())

    return None


if __name__ == "__main__":
    dict_demo()

运行结果:

upload successful

2.4.3 文本特征提取

主要是单词作为特征,对文本数据进行特征值化

仍然以sklearn为例:

# 返回词频矩阵  	
  sklearn.feature_extraction.text.CountVectorizer(stop_words=[])
# X表示文本或包含文本字符串的可迭代对象,返回值结果为sparse矩阵
  CountVectorizer.fit_transform(X)
# X表示array数组或sparse矩阵,返回值结果为转换之前的数据格式
  CountVectorizer.inverse_transform(X)
#返回特征名字
  CountVectorizer.get_feature_names_out()

示例代码:

from sklearn.feature_extraction.text import CountVectorizer


def count_demo():
    """
    文本特征抽取:CountVectorizer
    :return:
    """
    data = ['life is short,i like like python',
            'life is too long,i dislike python']
    # 1、实例化一个转换器类
    transfer = CountVectorizer()
    # 2、调用fit_transform
    data_new = transfer.fit_transform(data)
    print("data_new:\n", data_new.toarray())  # toarray转换为二维数组
    print("特征名字:\n", transfer.get_feature_names_out())

    return None


if __name__ == "__main__":
    count_demo()

运行结果:

upload successful

  • 使用停用词:stop_words=[]

示例代码:

from sklearn.feature_extraction.text import CountVectorizer


def count_demo():
    """
    文本特征抽取:CountVectorizer
    :return:
    """
    data = ['life is short,i like like python',
            'life is too long,i dislike python']
    # 1、实例化一个转换器类
    transfer = CountVectorizer(stop_words=['is', 'too'])
    # 2、调用fit_transform
    data_new = transfer.fit_transform(data)
    print("data_new:\n", data_new.toarray())  # toarray转换为二维数组
    print("特征名字:\n", transfer.get_feature_names_out())

    return None


if __name__ == "__main__":
    count_demo()

运行结果:

upload successful

  • 中文文本分词

不支持单个中文词,计算的是特征词出现的个数

例1

示例代码:

from sklearn.feature_extraction.text import CountVectorizer


def count_demo():
    """
    文本特征抽取:CountVectorizer
    :return:
    """
    data = ['我 爱 北京 天安门',
            '天安门 上 太阳 升']
    # 1、实例化一个转换器类
    transfer = CountVectorizer()
    # 2、调用fit_transform
    data_new = transfer.fit_transform(data)
    print("data_new:\n", data_new.toarray())  # toarray转换为二维数组
    print("特征名字:\n", transfer.get_feature_names_out())

    return None


if __name__ == "__main__":
    count_demo()

运行结果:

upload successful

例2

示例代码:

from sklearn.feature_extraction.text import CountVectorizer
import jieba


def count_chinese_demo2():
    """
    中文文本特征抽取,自动分词
    :return:
    """
    data = ['一种还是一种今天很残酷,明天更残酷,后天很美好,但绝对大部分是死在明天晚上,所以每个人不要放弃今天。',
            '我们看到的从很远星系来的光是在几百万年之前发出的,这样当我们看到宇宙时,我们是在看它的过去。',
            '如果只用一种方式了解某件事物,他就不会真正了解它。了解事物真正含义的秘密取决于如何将其与我们所了解的事物相联系。']
    data_new = []
    for sent in data:
        data_new.append(cut_word(sent))
    print(data_new)

    # 1、实例化一个转换器类
    transfer = CountVectorizer()
    # 2、调用fit_transform
    data_final = transfer.fit_transform(data_new)
    print("data_final:\n", data_final.toarray())
    print("特征名字:\n", transfer.get_feature_names_out())

    return None


def cut_word(text):
    """
    进行中文分词:“我爱北京天安门” -> "我 爱  北京 天安门"
    :param text:
    :return:
    """

    return ' '.join(jieba.cut(text))


if __name__ == "__main__":
    count_chinese_demo2()
    #print(cut_word('我爱北京天安门'))

运行结果:

upload successful

  • Tf-idf文本特征提取
    • Tf-idf的主要思想:若某个词或短语在一篇文章中出现的频率或概率高,而在其他文章中相对较低,则认为此词或短语具有良好的类别区分能力
    • Tf-idf的作用:评估一个字或词对于一个文件集或语料库中的某份文件的重要程度
    • Tf:词频
    • idf:逆向文档频率,可由总文件数目/包含该词语文件的数目所得商取以10为底的对数得到

示例代码:

 from sklearn.feature_extraction.text import CountVectorizer, TfidfVectorizer
 import jieba
 
 def cut_word(text):
    """
    进行中文分词:“我爱北京天安门” -> "我 爱  北京 天安门"
    :param text:
    :return:
    """

    return ' '.join(jieba.cut(text))
def tfidf_demo():
    """
    用TF-IDF的方法进行文本特征抽取
    :return:
    """
    data = ['一种还是一种今天很残酷,明天更残酷,后天很美好,但绝对大部分是死在明天晚上,所以每个人不要放弃今天。',
            '我们看到的从很远星系来的光是在几百万年之前发出的,这样当我们看到宇宙时,我们是在看它的过去。',
            '如果只用一种方式了解某件事物,他就不会真正了解它。了解事物真正含义的秘密取决于如何将其与我们所了解的事物相联系。']
    data_new = []
    for sent in data:
        data_new.append(cut_word(sent))
    print(data_new)

    # 1、实例化一个转换器类
    transfer = TfidfVectorizer()
    # 2、调用fit_transform
    data_final = transfer.fit_transform(data_new)
    print("data_final:\n", data_final.toarray())
    print("特征名字:\n", transfer.get_feature_names_out())
    return None
#main
if __name__ == "__main__":
    tfidf_demo()
    #print(cut_word('我爱北京天安门'))

运行结果:

upload successful

2.5 特征预处理

2.5.1 什么是特征预处理

特征预处理指的是通过一些转换函数,将特征数据转换为更适合算法模型的特征数据的过程,主要有归一化和标准化两种方法

2.5.2 为什么要进行特征预处理

有时特征的单位或大小相差较大,或某特征的方法相比其他的特征要大几个数量级,容易影响目标结果,导致一些算法无法学习到其他的特征

2.5.3 归一化

  • 定义:通过变换将原始数据映射到一定的区间内,默认为[0,1]

  • 公式

upload successful

  • API

      sklearn.preprocessing.MinMaxScaler(feature_range=(0,1)...)
    # X:numpy array格式的数据[n_samples,n_features],返回值结果为转换后形式相同的array
      MinMaxScaler.fit_transform(X)
  • 注意:最大值和最小值是变化的,且其非常容易受到异常值的影响,因此归一化鲁棒性较差,只适合传统精确小数据场景

什么是鲁棒性?

  • 鲁棒性即健壮性,是值一个计算机系统在执行过程中处理错误,以及算法遭遇输入、输出、运算等异常时继续正常运行的能力

  • 在机器学习中训练模型时,工程师可能会向算法内添加噪声(如对抗训练)从而测试算法的鲁棒性,故亦可将鲁棒性理解为算法对数据变化的容忍度

  • 与通常意味着特性随时间不变的能力的稳定性一词相比,鲁棒性一般意味着面对复杂适应系统的能力

2.5.4 标准化

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

  • 公式

upload successful

  • 与归一化比较

    • 对于归一化,若出现异常点,既影响了最大值,又影响了最小值,mean结果显然会发生变化
    • 对于标准化,若出现异常点,由于具有一定的数据量,少量的异常点对于平均值的影响不大,从而方差改变较小
  • API

    # 处理后,每列的数据都聚集在均值为0附近,标准差为1
     sklearn.preprocessing.StandardScaler()
    # X表示numpy array格式的数据[n_samples,n_features],返回值结果为转换后格式相同的array
     StandardScaler.fit_transform(X)
  • 注意:在已有样本足够多的情况下比较稳定,适合现代的嘈杂大数据场景

2.6 特征降维

2.6.1 什么是特征降维

特征降维指的是在某些限定条件下,降低随机变量或特征的个数,得到一组不相关主变量的过程

2.6.2 特征降维的两种方式

  • 特征选择
  • 主成分分析(可认为是特征提取的一种方式)

2.6.3 特征选择

  • 定义:数据中包含冗余或相关变量,特征选择旨在从原有特征中找出主要特征

  • 方法

    • Filter过滤式:探究特征本身特点、特征与特征和目标值之间的关联,主要方法有:
      • 方差选择法:低方差特征过滤
      • 相关系数:特征与特征之间的相关程度
    • Embedded嵌入式:算法自动选择特征、特征与目标值之间的关联,主要方法有:
      • 决策树:信息熵、信息增益
      • 正则化:L1、L2
      • 深度学习:卷积等
  • 使用的模块

    sklearn.feature_selection

2.6.4 主成分分析

  • 定义:高维数据转换为低维数据的过程,在此过程中可能会舍弃原有数据并创造新的变量

  • 作用:尽可能降低原数据的维度或复杂度,损失少量信息,常用于回归分析或聚类分析


文章作者: Moyon
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 Moyon !
评论
  目录