目录

1.1 人工智能概述

1.2 什么是机器学习

1.3 机器学习算法分类

1.4 机器学习开发流程

1.5 学习框架和资料介绍

2.1 数据集

2.2 特征工程介绍

2.3  特征提取

2.3.1  特征提取

2.3.2  字典特征提取 - 类别 -> one-hot 编码

2.3.3  文本特征提取

2.4特征预处理

  2.4.1 什么是特征预处理

  2.4.2归一化

  2.4.3 标准化

2.5特征降维

  2.5.1 降维 -降低维度

  2.5.2 什么是特征选择

2.6 主成分分析

  2.6.1 什么是主成分分析(PCA)

  2.6.2 案例:探究用户对物品类别的喜好细分

  

总结


# 学习完了Linux的前四章,现在按照科研室的要求学习机器学习。

1.1 人工智能概述

机器学习是人工智能的一个实现途径,深度学习是机器学习的一个方法发展而来。

应用场景:传统预测、图像识别、自然语言处理

1.2 什么是机器学习

机器学习是从数据中学习,利用模型解决问题(就是做预测)

数据集构成

结构:特征值 + 目标值

1.3 机器学习算法分类

监督学习

       目标值:类别 - 分类问题

                 k-近邻算法、贝叶斯分类、决策树与随机森林、逻辑回归

       目标值:连续型的数据 - 回归问题

                  线性回归、岭回归

目标值:无 - 无监督学习

             聚类  k-means

1.预测明天的气温是多少度? 回归

2.预测明天是阴、晴还是雨? 分类

3、人脸年龄预测? 回归 / 分类

4、人脸识别?分类

1.4 机器学习开发流程

1)获取数据

2)数据处理

3)特征工程

4)机器学习算法训练 - 模型

5)模型评估

6)应用

1.5 学习框架和资料介绍

(1)算法是核心,数据与计算是基础

(2)找准定位

(3)怎么做?

         1.入门

         2.实战类书籍

         3.机器学习  -“西瓜书” - 周志华

            统计学习方法 - 李航

            深度学习 - “花书”

          

2.1 数据集

一、可用数据集

       公司内部 百度

       数据接口 花钱

       数据集

学习阶段可用的数据集:

      1)sklearn

      2)  kaggle

      3)  UCI

      1  Scikit - learn 工具介绍

二、sklearn小数据集

sklearn.datasets

       load_*  获取小规模的数据集

       fetch_* 获取大规模的数据集

       2 sklearn小数据集

              sklearn.datasets.load_iris()

       3 sklearn大数据集

              sklearn.datasets.fetch_20newsgroups(data_home=None,subset='train')

       4 数据集的返回值

                 datasets.base.Bunch (继承自字典)

                 dict ["key"] = values

                 bunch.key = values

三、数据集的划分

       训练数据:用于训练,构建模型

       测试数据:在模型检验时使用,用于评估模型是否有效

             测试集 20%~30%

             训练集特征值,测试集特征值,训练集目标值,测试集目标值

             x_train ,x_test ,y_train,y_test

2.2 特征工程介绍

       算法   特征工程

特征工程是帮助我们使算法功能发挥得更好的一个步骤

sklearn 特征工程

pandas 数据清洗、数据处理

         特征抽取/特征提取

               机器学习算法 - 统计方法 - 数学公式

               文本类型 ->>   数值

                类型 ->>    数值

2.3  特征提取

2.3.1  特征提取

     sklearn.feature_extraction

2.3.2  字典特征提取 - 类别 -> one-hot 编码

    sklearn.feature_extraction.DictVectorizer(sparse=True,...)

    vector  数学:向量  物理:矢量  #开头是向量矢量的英文

        matrix 矩阵   二维数组

        vector 向量   一维数组

    父类:转换器类

    返回sparese矩阵

           sparese稀疏

                        将非零值 按位置表示出来

                        节省内存 - 提高加载效率

            应用场景:

                   1)pclass, sex 数据集当中类别特征比较多

                        1、将数据集的特征-> 字典类型

                        2、DictVectorizer转换

                  2)本身拿到的数据就是字典类型

        特征预处理

        特征降维

2.3.3  文本特征提取

          单词 作为 特征

          句子、短语、单词、字母

           特征:特征词

            方法1:CountVectorizer

                    统计每个样本特征词出现的个数

                   stop_words停用词

                   停用词表

          关键词:在某一个类别的文章中,出现的次数很多,但是在其他的文章中出现很少

          方法2:TfidfVectorizer

                    TF-IDF - 重要程度

                    两个词“经济”,“非常”

                    1000篇文章-语料库

                    100篇文章-“非常”

                    10篇文章-“经济”

                     两篇文章

                     文章A(100词):10次经济 TF-IDF:0.2

                             tf: 10/100 = 0.1

                             idf: lg(1000/10) = 2

                     文章B(100词):10次非常 TF-IDF:0.1

                            tf: 10/100 = 0.1        

                            idf:lg (1000/100) = 1

                    TF - 词频 (term frequency,  tf )

                    IDF - 逆向文档频率

     

以下是代码

from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.feature_extraction import DictVectorizer
from sklearn.feature_extraction.text import CountVectorizer
import jieba

def datasets_demo():
    """
    sklearn数据集使用
    :return:
    """
    # 获取数据集
    iris = load_iris()
    print("鸢尾花数据集:\n",iris)
    print("查看数据集描述:\n",iris["DESCR"])
    print("查看特征值的姓名:\n",iris.feature_names)
    print("查看特征值:\n",iris.data,iris.data.shape)

    #  数据集划分
    x_train,x_test,y_train,y_test = train_test_split(iris.data,iris.target,test_size=0.2,random_state=22)
    print("训练集的特征值:\n",x_train,x_train.shape)

    return None

if __name__ == '__main__':
    # 代码1:sklearn数据集使用
    datasets_demo()

def dict_demo():
    """
    字典特征抽取
    :return:
    """
    data = [{'city':'北京','temperature':100},{'city':'上海','temperature':60},{'city':'深圳','temperature':30}]
    # 1、实例化一个转换器类
    transfer = DictVectorizer(sparse=False)

    # 2、调用fit_transfrom()
    data_new = transfer.fit_transform(data)
    print("data_new:\n",data_new)
    #print("特征名字:\n",transfer.get_feature_names())

    return None

def count_demo():
    """
   文本特征抽取:CountVectorizer
   中文文本特征抽取:CountVectorizer(自己加的)
   :return:
    """
    data = ["life is short,i like like python","life is too long,i dislike python"]
    data = ["我 爱 北京 天安门","天安门 上 太阳 升"]

    # 1、实例化一个转换器类
    transfer = CountVectorizer(stop_words=["is","too"])

    # 2、调用fit_transform
    data_new = transfer.fit_transform(data)
    print("data_new:\n",data_new.toarray())
    print("特征名字:\n",transfer.get_feature_names())

    return None

def count_chinese_demo():
    """
    中文文本特征抽取: CountVectorizer
    :return:
    """
    data = ["我 爱 北京 天安门","天安门 上 太阳 升"]
    # 1、 实例化一个转换器类
    transfer = CountVectorizer()

    # 2、 调用fit_transform
    data_new = transfer.fit_transform(data)

def cut_word(text):
    """
    进行中文分词:"我爱北京天安门" -->""我 爱 北京 天安门""
    :param text:
    :return:
    """
    a = " ".join(list(jieba.cut(text)))
    print(a)
    return a

    #也可直接这样写
    #return "".join(list(jieba.cut(text)))

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

    data_new = []
    for sent in data:
        data_new.append(cut_word(sent))
    #print(data_new)
    # 1、实例化一个转换器类
    transfer = CountVectorizer(stop_words=["一种", "所以"])

    # 2、调用fit_transform
    data_final = transfer.fit_transform(data_new)
    print("data_new:\n", data_final.toarray())
    print("特征名字:\n", transfer.get_feature_names_out())


    return None

if __name__ == '__main__':
    # 代码1:sklearn数据集使用
    # datasets_demo()
    # 代码2:字典特征抽取
    # dict_demo()
    # 代码3:文本特征抽取: CountVecotrizer
    # count_demo()
    # 代码4:中文文本特征抽取:CountVecotrizer
    #count_chinese_demo()
    # 代码5:中文文本特征抽取,自动分词
    count_chinese_demo2()
    # 代码6:中文分词
    print(cut_word("我爱北京天安门"))

后面的运行结果截图

注:新版scikit_learn中get_feature_names()方法被弃用了,需要替换成get_feature_names_out()

遇到的问题:不能自动分词 ;原因:在引号之间没打空格

Tf-idf 代码如下

from sklearn.feature_extraction.text import CountVectorizer, TfidfVectorizer

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(stop_words=["一种", "所以"])

    # 2、调用fit_transform
    data_final = transfer.fit_transform(data_new)
    print("data_new:\n", data_final.toarray())
    print("特征名字:\n", transfer.get_feature_names_out())

    return None

if __name__ == '__main__':
    # 代码1:sklearn数据集使用
    # datasets_demo()
    # 代码2:字典特征抽取
    # dict_demo()
    # 代码3:文本特征抽取: CountVecotrizer
    # count_demo()
    # 代码4:中文文本特征抽取:CountVecotrizer
    #count_chinese_demo()
    # 代码5:中文文本特征抽取,自动分词
    #count_chinese_demo2()
    # 代码6:中文分词
    #print(cut_word("我爱北京天安门"))
    # 代码7: 用TF-IDF的方法进行文本特征抽取
    tfidf_demo()

2.4特征预处理

  2.4.1 什么是特征预处理

为什么我们要进行归一化/标准化?

无量纲化:使不同规格的数据转换到同一规格

  2.4.2归一化

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

异常值:最大值、最小值

总结:注意最大值最小值是变化的,另外,最大值与最小值非常容易受异常点影响,

故归一化鲁棒性较差,只适合传统精确小数据场景。

  2.4.3 标准化

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

2、公式   (x - mean) / std

注:mean是均值,std是标准差

标准差:集中程度

对于归一化: 出现异常点,影响最大值和最小值,结果会发生改变

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

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

2.5特征降维

  2.5.1 降维 -降低维度

降维:在某些限定条件下,降低随机变量(特征)个数,得到一组“不相关”主变量的过程

ndarray

      维数:嵌套的层数

      0维  标量

      1维  向量

      2维  矩阵

      3维

      n维

降低的对象是二维数组

       此处的降维:降低特征的个数

       效果:特征与特征之间不相关

  2.5.2 什么是特征选择

1、定义:数据中包含冗余或相关变量(或称特征、属性、指标等),旨在从原有特征中找出主要特征。

2、方法

Filter过滤式

       方差选择法:低方差特征过滤

      相关系数 - 特征与特征之间的相关程度

            皮尔逊相关系数

     特征与特征之间相关性很高:

           1)选取其中一个

           2)加权求和

           3)主成分分析

Embeded嵌入式

      决策树:信息熵、信息增益

      正则化: L1、L2

      深度学习:卷积等

2.6 主成分分析

  2.6.1 什么是主成分分析(PCA)

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

2、作用:是数据维数压缩,尽可能降低原数据的维数(复杂度),损失少量信息。

3、应用:回归分析或者聚类分析当中

sklearn.decomposition.PCA(n_components=None)

将数据分解为较低维数空间

n_components

       小数: 表示保留百分之多少的信息

       整数:减少到多少特征

注:

· 保留90%信息的降维结果是2维:因为PCA计算后,2个主成分就能保留超过90%的信息,所以自动降维到2维。

· 指定降维到3维的结果和原数据一致:原始数据维度就是3维,PCA无法再降维,因此输出数据和输入数据相同。

  2.6.2 案例:探究用户对物品类别的喜好细分

用户                  物品类别

user_id             aisle

1)需要将user_id和aisle放在同一个表中

2)找到user_id和aisle的关系 - 交叉表和透视表

3)特征冗余过多 —> PCA降维

总结

  

  

             

Logo

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。

更多推荐