机器学习 - 第一部分

文章目录

      • 第一章 机器学习概述
          • 1.1 人工智能概述
          • 1.2 什么是机器学习
          • 1.3 机器学习算法分类
          • 1.4 机器学习开发流程
          • 1.5 学习框架和资料介绍
      • 第二章 特征工程
          • 2.1 数据集
          • 2.2 特征工程介绍
          • 2.3 特征抽取
          • 2.4 特征预处理
          • 2.5 特征降维
          • 2.6 主成分分析 (PCA)
          • 2.7 案例

学习框架

机器学习 - 第一部分_第1张图片


第一章 机器学习概述

1.1 人工智能概述
  • 人工智能与机器学习 , 深度学习的关系
    • 机器学习是人工智能实现的一个途径
      使用算法来解析数据,从中学习,然后对真实世界中的事件作出决策和预测。比如垃圾邮件预测,房价预测
    • 深度学习是机器学习的一个方法发展而来
      模仿人类神经网络,建立模型,进行数据分析。比如人脸识别,语义理解,无人驾驶
  • 深度学习 , 机器学习能做什么
    传统预测 , 图像识别 , 自然语言处理

1.2 什么是机器学习
  • 机器学习是从数据自动分析获得模型 , 并利用模型对未知数据进行预测
  • 数据集构成 : 特征值 + 目标值(有些数据集可以没有目标值)

1.3 机器学习算法分类
  • 监督学习 (预测) : 基于数据和结果进行预测,一组输入数据对应一个正确的输出结果。输入数据是由输入特征值与目标值组成 , 函数的输出可以是一个连续的值 (称为回归) , 或输出有限个离散值 (称为分类)
    1 . 目标值是类别 – 分类问题

    • 算法 : k - 近邻算法 , 贝叶斯算法 , 决策树与随机森林 , 逻辑回归

    2 . 目标值是连续型的数据 – 回归问题

    • 算法 : 线性回归 , 岭回归
    • 监督学习的核心步骤:
      1、实用标签数据训练机器学习模型
      标签数据:输入数据对应的正确的输出结果
      机器学习模型:将学习输入数据与之对应的输出结果间的函数关系
      2、调用训练好的机器学习模型,根据新的输入数据预测对应的结果
  • 无监督学习 : 输入的数据由特征值组成,从数据中挖掘关联性。不存在正确答案,例如数据聚类,相关新闻自动推送
    1 . 无目标值 – 无监督学习

    • 聚类 : k-means
    • 非监督学习不需要标签数据,而是通过引入预先设定的优化准则进行模型训练,比如自动将数据分为三类
      机器学习 - 第一部分_第2张图片

1.4 机器学习开发流程
  • 流程
    • 获取数据
      数据预处理
      特征工程 (将数据处理成更能被学习算法使用的数据)
      机器学习算法训练 – 模型
      模型评估
      应用

1.5 学习框架和资料介绍
  • 算法是核心 , 数据与计算是基础
  • 怎么做 :
    • 入门
    • 实战类书籍
    • 机器学习 — (西瓜书)周志华
      统计学方法 — 李航
      深度学习 — “花书”
  • 机器学习库与框架
    机器学习 - 第一部分_第3张图片
    • Numpy & Scipy
      Numpy是最基础的Python编程库 , 除了提供一些高级的数学运算机制 , 还具备非常高效的向量和矩阵运算功能 , 对于机器学习的运算任务尤为重要 .
      Scipy是在Numpy基础上的构建的更强大 , 应用领域更广泛的科学计算包 , 同时 , Scipy需要依赖Numpy的支持进行安装与运行 .
      Numpy与Scipy的教程参考
    • Matplotlib
      Matplotlib是Python环境下的一款免费使用的绘图工具包 , 工作方式与绘图命令与MATLAB类似 .
      Matplotlib在线文档
    • Scikit-learn
      Scikit-learn是一款用于机器学习和实践的Python第三方开源程序库 , 现在已经是相对成熟的机器学习的开源项目 .
      Scikit-learn英文版使用文档
    • Pandas
      Pandas一款针对数据处理和分析的Python工具包 , 其中实现了大量便于数据读写 , 清洗 , 填充以及分析的功能 .
      Pandas文档
    • Anaconda
      Anaconda是一款集300多种用于科学和工程计算相关任务的python编程库的集成平台 .
      Anaconda参考文档

第二章 特征工程

2.1 数据集
  • 可用数据集 (学习阶段) : Sklearn , Kaggle , UCI

    • Scikit-learn工具介绍
      • Python语言机器学习工具
        包含许多知名机器学习算法的实现
        文档完善 , 易上手 , 丰富API
        目前稳定版 : 0.19.1
      • 安装 : pip3 install Scikit-learn
        测试是否成功 : import sklearn
        注意 : 安装此工具 , 需要Numpy , Scipy等库
      • Scikit-learn包含的内容
        机器学习 - 第一部分_第4张图片
  • sklearn数据集 (sklearn.datasets)

    • load_* 获取小规模数据集
      小数据集 : sklearn.datasets.load_iris()
    • fetch_* 获取大规模数据集
      大数据集 : sklearn.datasets.fetch_20newgroups(data_home=None, subset=“train”)
      第一个参数 : 是数据集下载的目录 , 默认是~/scikit_learn_data
      第二个参数 : “train” , “test” , “all” , 可选 , 按着要下载的数据集 , 训练集的"训练" , 测试集的"测试" , 两者的"全部"
    • 数据集的返回值 : datasets.base.Bunch(字典格式)
      dist[“key”] = values
      bunch.key = values
  • 数据集的划分
    机器学习一般的数据集会划分两部分

    • 训练数据 : 用于训练 , 构建模型
      测试数据 : 在模型检验时使用 , 用于评估模型是否有效
    • 划分比例
      训练集 : 70% 80% 75%
      测试集 : 30% 20% 30%
    • 数据集划分的API
      机器学习 - 第一部分_第5张图片
    from sklearn.datasets import load_iris
    from sklearn.model_selection import train_test_split
    
    
    def datasets_demo():
        """
        sklearn 数据集使用
        :return:
        """
        # 获取数据集
        iris = load_iris()
        print("鸢尾花数据集返回值 \n", iris)
        print("查看数据集描述 \n", iris.DESCR)
        print("查看数据集描述 \n", iris["DESCR"])
        print("鸢尾花的特征值名称", iris.feature_names)
        print("鸢尾花的特征值", iris.data)
        print("鸢尾花的目标值名称", iris.target_names)
        print("鸢尾花的目标值", iris.target)
        print("", 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("训练集的特征值", x_train, x_train.shape)
        print("测试集的特征值", x_test, x_test.shape)
        print("训练集的目标值", y_train, y_train.shape)
        print("测试集的目标值", y_test, y_test.shape)
        return None
    
    
    if __name__ == "__main__":
        # 代码1 : sklearn数据集的使用
        datasets_demo()
    

2.2 特征工程介绍
  • 为什么需要特征工程
    数据与特征决定了机器学习的上限 , 而模型与算法则是逼近这个上限
  • 什么是特征工程
    使得特征能在机器学习算法上发挥更好的作用的一个过程
  • 特征工程的位置与数据处理的比较
    sklearn : 特征工程
    pandas : 数据清洗 , 数据处理
  • 特征工程包括 :
    特征抽取
    特征预处理
    特征降维

2.3 特征抽取
  • 机器学习算法 - 统计方法 - 数学公式
    文本类型 --> 数值
    类型 --> 数值
  • 特征提取 (特征值化)
    API : sklearn.feature_extraction
  1. 字典特征提取 --> 属于类别的特征转化成one-hot编码
    机器学习 - 第一部分_第6张图片

    • matrix 矩阵 : 二维数组
      vector 向量 : 一维数组
    • 父类 :
      transfer转换器类 , 返回sparse(稀疏)矩阵 , 将非零值按照位置(某行某列)表示 , 节省内存 , 提高加载效率
    • 应用场景 :
      第一 : 数据集中类别比较多时 , 先将数据集特征转化成字典类型 , 再进行DictVectorizer转换
      第二 : 本身拿到的数据类型是字典类型
    from sklearn.feature_extraction import DictVectorizer
    
    def dict_demo():
        """
        字典特征抽取
        :return:
        """
        data = [{
           'city': '北京', 'temperature': 100}, {
           'city': '上海', 'temperature': 60}, {
           'city': '深圳', 'temperature': 30}]
    
        # 1 . 实例化一个转换器类
        transfer = DictVectorizer(sparse=True)
    
        # 2 . 调用fit_transform()
        data_new = transfer.fit_transform(data)
        print("data_new : \n", data_new, type(data_new))
        print("data_new  :\n", data_new.toarray())
        print("特征名字 : \n", transfer.feature_names_)
        print("特征名字 : \n", transfer.get_feature_names())
    
        return None
    
    if __name__ == "__main__":
    	# 代码2 : 字典特征抽取
        dict_demo()
    
  2. 文本特征抽取

    • 单词作为特征 , 更易处理
      特征 : 特征词
    • 方法一 : CountVectorizer
      统计每个样本特征词出现的个数
      stop_words : 停用词
      关键词 : 在某一类别文章中出现的次数很多 , 在其他类别文章中出现的次数很少
      机器学习 - 第一部分_第7张图片
      方法二 : TfidfVectorizer
      TF-IDF : 重要程度
      TF - 词频( term frequency, tf)
      IDF - 逆向文档频率
      机器学习 - 第一部分_第8张图片
      机器学习 - 第一部分_第9张图片
    from sklearn.feature_extraction.text import CountVectorizer, TfidfVectorizer
    import jieba
    
    
    def count_demo():
        """
        文本特征抽取
        :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", data_new, data_new.toarray())
        print("特征名字: \n", transfer.get_feature_names())
    
        return None
    
    
    def count_chinese_demo():
        """
        中文文本特征抽取
        :return:
        """
        data = ["我 爱 北京 天安门", "天安门 上 太阳 升"]
        # 1. 实例化一个转换器类
        transfer = CountVectorizer()
    
        # 2. 调用fit_transform()方法
        data_new = transfer.fit_transform(data)
        print("data_new", data_new, data_new.toarray())
        print("特征名字: \n", transfer.get_feature_names())
    
        return None
    
    
    def cut_word(text):
        """
        进行中文分词 : 我爱北京天安门 --> 我 爱 北京 天安门
        :param text:
        :return:
        """
        a = " ".join(list(jieba.cut(text)))
        print(a , type(a))
        return text
    
    
    def count_chinese_jieba_demo():
        """
        中文文本特征抽取 , 自动分词
        :return:
        """
        # 1. 将中文文本进行分词
        data = ["一种还是一种, 今天很残酷, 明天更残酷, 后天很美好, 但绝对大部分是死在明天晚上, 所以每个人不要放弃今天.",
                "我们看到的从很远星系来的光是在几百万年前发出来的, 这样当我们看到宇宙时, 我们是在看它的过去.",
                "如果只是用一种方式了解某种事物, 你就不会真正了解它. 了解事物真正含义的秘密取决于如何将其与我们所熟悉的事物相联系"]
        data_new = []
        for sent in data:
            data_new.append(cut_word(sent))
        # print(data_new)
    
        # 2. 实例化一个转换器类
        transfer = CountVectorizer()
    
        # 3. 调用fit_transform()方法
        data_jieba_new = transfer.fit_transform(data_new)
        print("data_jieba_new", data_jieba_new, data_jieba_new.toarray())
        print("特征名字: \n", transfer.get_feature_names())
    
        return None
    
    
    def tfidf_demo():
        """
          TF-IDF方法进行文本特征抽取
          :return:
          """
        # 1. 将中文文本进行分词
        data = ["一种还是一种, 今天很残酷, 明天更残酷, 后天很美好, 但绝对大部分是死在明天晚上, 所以每个人不要放弃今天.",
                "我们看到的从很远星系来的光是在几百万年前发出来的, 这样当我们看到宇宙时, 我们是在看它的过去.",
                "如果只是用一种方式了解某种事物, 你就不会真正了解它. 了解事物真正含义的秘密取决于如何将其与我们所熟悉的事物相联系"]
        data_new = []
        for sent in data:
            data_new.append(cut_word(sent))
        # print(data_new)
    
        # 2. 实例化一个转换器类
        transfer = TfidfVectorizer()
    
        # 3. 调用fit_transform()方法
        data_jieba_new = transfer.fit_transform(data_new)
        print("data_jieba_new", data_jieba_new, data_jieba_new.toarray())
        print("特征名字: \n", transfer.get_feature_names())
    
        return None
    
    
    if __name__ == "__main__":
        # 代码3 : 文本的特征抽取
        count_demo()
    
        # 代码4 : 中文文本特征抽取
        count_chinese_demo()
    
        # 代码5 : 中文文本特征抽取 , 自动分词
        count_chinese_jieba_demo()
    
        # 代码6 : 中文文本特征抽取 , jieba分词
        count_chinese_jieba_demo()
    
        # 代码7 :TF-IDF方法进行文本特征抽取
        tfidf_demo()
    

2.4 特征预处理
  • 概念 : 通过一些转换函数将特征数据转换成更适合算法模型的特征数据的过程

  • 包含的内容 : 数值型数据的无量纲化 (归一化 , 标准化)

  • API : sklearn.preprocessing

  • 归一化过程及其API
    异常值 : 在最大值 , 最小值中 , 若最大值 , 最小值是异常值 , 则归一化结果不准确
    适用场景 : 因为鲁棒性 (健壮性 稳定性) 较差 , 因此只适合传统精确小数据场景
    归一化过程
    机器学习 - 第一部分_第10张图片
    归一化API
    机器学习 - 第一部分_第11张图片

  • 标准化及其API
    适用场景 : 在已有样本足够多的情况下比较稳定 , 适合现代嘈杂的大数据场景

    • 标准化要求
    • 标准化公式
      机器学习 - 第一部分_第12张图片
    • 标准化API
      机器学习 - 第一部分_第13张图片
    • 归一化和标准化的区别
      机器学习 - 第一部分_第14张图片
    from sklearn.preprocessing import MinMaxScaler, StandardScaler
    import pandas as pd
    
    
    def mixmax_demo():
        """
        归一化
        :return:
        """
        # 1. 获取数据 , ...代表数据文件的路径 , 以后同
        data = pd.read_csv(".../dating.txt")
        data = data.iloc[:, :3]
        print("data: \n", data)
    
        # 2. 实例化一个转换器类
        transfer = MinMaxScaler(feature_range=[2, 3])
    
        # 3. 调用fit_transform
        data_new = transfer.fit_transform(data)
        print("data_new : \n", data_new)
    
        return None
    
    
    def stand_demo():
        """
        标准化
        :return:
        """
        # 1. 获取数据
        data = pd.read_csv(".../dating.txt")
        data = data.iloc[:, :3]
        # print("data: \n", data)
    
        # 2. 实例化一个转换器类
        transfer = StandardScaler()
    
        # 3. 调用fit_transform
        data_new = transfer.fit_transform(data)
        print("data_new : \n", data_new)
    
        return None
    
    
    if __name__ == "__main__":
        # 代码8 : 归一化
        mixmax_demo()
    
        # 代码9 : 标准化
        stand_demo()
    

2.5 特征降维
  • 降维 : 降低维数即降低特征的个数 , 得到一组不相关的主变量的过程
  • 降维的两种方式 : 特征选择 , 主成分分析
  • 模块 : sklearn.feature_selection
  • 特征选择 : 数据中包含冗或相关变量(如称特征 , 属性 , 指标等) , 旨在原有特征中找出主要特征
  • 特征选择方法
    机器学习 - 第一部分_第15张图片
    低方差特征过滤
    机器学习 - 第一部分_第16张图片
    低方差特征过滤API
    机器学习 - 第一部分_第17张图片
    相关系数 : 特征与特征之间的相关程度
    皮尔逊相关系数 - 最后结果是0.9942
    机器学习 - 第一部分_第18张图片
    相关系数特点
    机器学习 - 第一部分_第19张图片
    相关系数API
    机器学习 - 第一部分_第20张图片
    特征与特征之间相关性很高 :
    第一 : 可以选取一个
    第二 : 加权求和
    第三 : 主成分分析
from sklearn.feature_selection import VarianceThreshold
from scipy.stats import pearsonr
import pandas as pd


def variance_demo():
    """
    过滤低方差特征
    :return:
    """
    # 1. 获取数据
    data = pd.read_csv(".../factor_returns.csv")
    data = data.iloc[:, 1:-2]
    # print(data)
    # 2. 实例化一个转换器类
    transfer = VarianceThreshold(threshold=5)

    # 3. 调用fit_transform
    data_new = transfer.fit_transform(data)
    print("data_new : \n", data_new, data_new.shape)

    # 计算某两个变量之间的相关系数
    r = pearsonr(data["pe_ratio"], data["pb_ratio"])
    print("相关系数 : ", r)

    return None


if __name__ == "__main__":
    # 代码10 :过滤低方差特征
    variance_demo()

2.6 主成分分析 (PCA)
  • 主成分分析的相关内容
    机器学习 - 第一部分_第21张图片

  • 主成分分析API
    机器学习 - 第一部分_第22张图片

    from sklearn.decomposition import PCA
    
    
    def pca_demo():
        """
        pca降维
        :return:
        """
        data = [[2, 8, 4, 5], [6, 3, 0, 8], [5, 4, 9, 1]]
    
        # 1. 实例化一个转换器类
        transfer = PCA(n_components=2)
        # transfer = PCA(n_components=0.95)
    
        # 2. 调用fit_transform
        data_new  = transfer.fit_transform(data)
        print("pca降维 : \n", data_new)
    
        return None
    
    
    if __name__ == "__main__":
        # 代码11 :主成分分析pca降维
        pca_demo()
    

2.7 案例
  • 案例 : 探究用户对物品类别的喜好细分
    机器学习 - 第一部分_第23张图片

    • 分析对象 :
      用户       物品类别
      user_id   aisle
      第一 : 需要将user_id和aisle放入一个表中
      第二 : 找到user_id和aisle的关系 — 交叉表和透视表
      第三 : 特征冗余过多 , PCA降维
    # 1. 获取数据
    # 2. 合并表
    # 3. 找到user_id和aisle之间的关系
    # 4. PCA降维
    
    import pandas as pd
    
    
    # 1. 获取数据
    order_products = pd.read_csv(".../order_products_prior.csv")
    products = pd.read_csv(".../products.csv")
    orders = pd.read_csv(".../orders.csv")
    aisles = pd.read_csv(".../aisles.csv")
    
    # 2. 合并表 
    
    # order_products_prior.csv : 订单与商品信息
    # 字段 : order_id, product_id,add_to_cart_order, reordered
    
    # products.csv : 商品信息
    # 字段 : product_id, product_name, aisle_id, department_id
    
    # order.csv : 用户订单信息
    # 字段 : order_id, user_id, eval_set, order_number, ...
    
    # aisles.csv : 商品所属具体物品类别
    # 字段 : aisle_id, aisle
    
    # 合并aisles和products是为了合并aisle与product_id
    tab1 = pd.merge(aisles, products, on=["aisle_id", "aisle_id"])
    
    tab2 = pd.merge(tab1, order_products, on=["product_id", "product_id"])
    
    tab3 = pd.merge(tab2, orders, on=["order_id", "order_id"])
    
    tab3.head()
    
    # 3. 找到user_id和aisle之间的关系
    table = pd.crosstab(tab3["user_id"], tab3["aisle"])
    
    # 数据较多 , 可以选择适当数据测试
    data = table[:10000]
    
    # 4. PCA降维
    from sklearn.decomposition import PCA
    
    # 1> 实例化一个转换器类
    transfer = PCA(n_components=0.95)
    
    # 2> 调用fit_transform
    data_new = transfer.fit_transform(data)
    
    data_new.shape
    
    

你可能感兴趣的:(机器学习 - 第一部分)