前言:

机器学习的一些发展史我就省略啦,如果感兴趣的可以去了解。这里会用到pandas库、numpy库,最好新建一个虚拟环境去安装,本节还要学习sklearn库,所以也要去安装,下面我都提供了库的安装环境。从机器学习开始我的文章格式可能与opencv的不同,这是因为我用Typora编写的,不过不影响观感嘻嘻。

一、机器学习、

1、定义

  • 机器学习包括如聚类、分类、决策树、贝叶斯、神经网络、深度学习等算法

  • 机器学习的基本思路是模仿人类学习行为的过程,如我们在现实中的新问题一般是通过经验归纳,总结规律,从而预测未来的过程。

2、分类*

  • 监督学习:目前基本上所有的模型都是基于监督学习完成的。

    • 概念:就是说在训练模型的时候,我们准备的数据集需要打标签。

    • 应用:分类问题(手写数字识别)、回归问题(房价预测)。如在一个图像分类任务中,给定一系列带有标签的图片(如猫狗照片),模型通过学习这些标签来预测新图片的内容。

    • 常见算法:

      • 线性回归(Linear Regression)

      • 逻辑回归(Logistic Regression)

      • 支持向量机(Support Vector Machine, SVM)

      • 决策树(Decision Tree)

      • 随机森林(Random Forest)

      • K 近邻算法(K-Nearest Neighbors, KNN)

      • 神经网络(Neural Networks)*

  • 半监督学习:

    • 概念:训练模型的时候,一部分数据集打标签,一部分不打标签。

    • 应用:在一些文本分类任务中,可能只有少量文档被人工标注了类别(如新闻文章的主题),而大部分文档没有标注。在这种情况下就可以利用这些未标注的数据来改进模型的表现。

    • 常见算法:

      • 生成对抗网络(Generative Adversarial Networks, GANs)

  • 无监督学习:

    • 概念:训练模型的时候,数据集不打标签,让模型自己去学习其中的规律。

    • 应用:聚类分析(如客户细分)等。例如,通过聚类算法将客户根据购买行为分为不同的群体,以更好地了解不同群体的需求。

    • 常见算法:

      • 主成分分析(Principal Component Analysis, PCA)*

      • K-Means 算法(K-means Clustering)*

  • 强化学习:

    • 概念:涉及到让智能体在与环境的交互中,不断的优化自身,得到有利的反馈。

    • 应用:游戏AI、自动驾驶车辆等。例如,在棋类游戏中,AI通过不断尝试不同的策略,并根据胜负结果调整自己的下棋策略,从而提高胜率

  • 打标签:

    • 训练模型的时候,需要告诉模型,他学习的数据集里面某个人内容是什么。

3、应用场景

  • 自然语言处理(NLP)

  • 医疗诊断与影像分析

  • 金融风险管理

  • 预测与推荐系统

  • 制造业和物联网

  • 能源管理与环境保护

  • 图像识别与计算机视觉

    • 计算机视觉的三大任务

      • 图像分类任务:模型需要识别到图像中的物体的类别即可

      • 目标检测任务:模型需要识别到图像中的物体的类别和位置

      • 图像分割任务

4、上游任务和下游任务

  • 上游任务:可以理解为就是做模型

  • 下游任务 :把模型拿来做应用

5、机器学习项目开发步骤*

  • 收集数据

  • 准备数据

  • 训练模型

    • 训练数据:用于构建机器学习模型

    • 验证数据:辅助构建模型,用于在构建过程中评估模型,为模型提供无偏估计进而调整模型超参数

    • 测试数据:用来评估训练的模型的性能,测试数据始终不参与模型训练

  • 评估模型

  • 提高性能

1、训练数据集*

  • 我们自己准备的用来训练模型的数据集,模型就可以根据这些数据集来学习规律,从而能够用来作预测未知的数据。

  • 如果模型学习到的内容比较少且单一,那么使用模型的时候效果一定比较差。训练模型一点过要准备丰富,切忌单一。(比如使用ai软件,输入不同描述的同一个问题,ai会有不同的回答,这就说明它的机器学习极其丰富)

2、数据集的分类-训练模型*

  • 训练数据集:训练模型,训练模型中有一个概念叫做训练多少次模型,即让模型去学习多少次训练数据集里面的内容,这个过程叫做epochs

  • 验证数据集:一般情况下,每epochs之后,就会使用验证数据集去验证训练出来的模型,基于验证的结果,却调整训练模型的超参数信息,利于模型的训练(不参与训练)(一般情况下数据集需要打标签-可选)

  • 测试数据集:模型训练好了之后,在已知的数据集中做测试(一般情况下数据集需要打标签-可选)

  • 推理:模型训练好了之后,在位置的数据集上做测试(不打标签)。还可以理解为即使把训练好的模型拿来做应用。

二、sklearn库*

  • 机器学习阶段,基本上所有的API都来自于这个库

1、安装环境

  • 创建新的环境:一定要将环境统一创建在一个盘里,并且独立运作。这里我创建了新的虚拟环境sklearn_env

  • 安装:

    • 第一步:激活要把库装在哪个环境里的环境---activate sklearn_env

    • 第二部:利用安装命令安装库:

      • pip install numpy==1.21.6 -i https://pypi.mirrors.ustc.edu.cn/simple/

      • pip install pandas==1.1.5 -i https://pypi.mirrors.ustc.edu.cn/simple/

      • pip install scikit-learn==1.0.2 -i https://pypi.mirrors.ustc.edu.cn/simple/

2、数据集

  • sklearn 库中提供了大量的内置数据,这些内置数据库就在本地,不需要联网即可获取数据。此外,还可以通过 sklearn 库去下载网络数据集。但需要翻墙。

  • 自带的数据集:可以直接通过 skearn 库的对应 API 加载出来,分为了几种类型的数据集:

    • 分类数据集:基于一些描述信息,得出这个描述的哪一个类别,这个类别数是提前规定好了的,比如数字分类,0-9 一共 10 个类别,输入一个内容 [0 1 2 3 4 5],这个内容就属于 0-9 中间的一类。

    • 线性回归数据集:基于一些描述信息,得到这些信息基于方程(y = x + 1)计算出来的值,得到的输出是一个具体的值。

  • 导入数据集常用方法:

    • 本地加载数据:sklearn.datasets.load_<name>_

    • 远程加载数据:sklearn.datasets.fetch_<name>_

    • 构造数据集:sklearn.datasets.make_<name>

3、加载内置数据集

1、数据集加载步骤:

  • 导入对应的数据集函数,比如下面的案例将导入load_iris数据集函数,在skleran.datasets 里

    from sklearn.datasets import load_iris
  • 通过调用函数,得到数据集

    iris = load_iris()
    
  • 得到的数据集的内容

    • data:特征信息

    • target:目标信息(标签)

    • feature_names:特征信息的名称

    • target_names:目标信息的名称(标签名称)

  • 数据集中的具体的数据含义与类型(以鸢尾花数据集为例)

    • data:

      • 是一个array二维数组数据。
        每一个元素是一个列表,列表中有四个元素,这四个元素就是鸢尾花的特征描述信息。
        实际上data里面的内容就是数据集

    • target:

      • 是一个array一维数组数据。
        里面的元素由0,1,2组成,这个内容就是鸢尾花的标签。
        实际上target里面的内容就是结果。

    • target_name:

      • target的实际名称,即0--setosa 1--versicolor 2--virginica。

    • feature_name:

      • 表示特征名称,有四个值:sepal length in cm,sepal width in cm,petal length in cm,petal width in cm
        分别对应data属性中的四个元素。

2、案例-鸢尾草数据集

  • 鸢尾花数据集(Iris dataset)是机器学习中最著名也是最常使用的数据集之一,属于分类模型数据集。这个数据集包含三种不同类型的鸢尾花(山鸢尾 setosa、变色鸢尾 versicolor、维吉尼亚鸢尾 virginica)各 50 个样本,每个样本有四个特征:萼片长度(sepal length)、萼片宽度(sepal width)、花瓣长度(petal length)和花瓣宽度(petal width)

  • 代码:

  • import pandas as pd
    import numpy as np
    #导入函数(load_iris:加载鸢尾花数据集的函数)
    from sklearn.datasets import load_iris
    ​
    #获取数据集(执行load_iris()函数
    iris = load_iris()
    # print(f"鸢尾花数据集:{iris}")#是一个二维数组,每个元素有四个值。
    ​
    #获取data属性
    data=iris.data
    print(f"数据集:{data}")
    ​
    #获取target属性
    target=iris.target
    print(f"标签:{target}")
    ​
    #获取target_name属性
    target_name=iris.target_names
    print(f"标签名称:{target_name}")
    ​
    #获取feature_name属性
    feature_name=iris.feature_names
    print(f"特征名称:{feature_name}")
    ​

  • 结果输出:

  • 将鸢尾花数据集的特征数据和标签数据合并成一个完整的表格(DataFrame),并打印出来(在feature_name中加入target)

    • 代码:

    • import pandas as pd
      import numpy as np
      #导入函数(load_iris:加载鸢尾花数据集的函数)
      from sklearn.datasets import load_iris
      ​
      #获取数据集(执行load_iris()函数
      iris = load_iris()
      # print(f"鸢尾花数据集:{iris}")
      print(type(iris))
      ​
      #获取data属性
      data=iris.data
      #获取target属性
      target=iris.target
      #获取target_name属性
      target_name=iris.target_names
      #获取feature_name属性
      feature_name=iris.feature_names
      ​
      #改变target的形状
      target.shape=(len(target),1)
      ​
      #把target列名加入到feature_name
      feature_name.append('target')
      df=pd.DataFrame(np.hstack((data,target)),columns=feature_name)
      print(df)

  • 结果输出:

4、加载网络数据集

1、数据集下载与加载

  • 现实世界数据,需要通过网络才能下载后,保存到本地目录,可以通过datasets.get_data_home()获取到存储的目录。

  • 下载时可能会因为网络问题出现问题,可能需要用外网才能下载。

  • 如果硬盘中已经下载了这个数据集,直接加载,否则会下载到磁盘中。

2、函数介绍

  • 函数名:

名称 说明
fetch_20newsgroups 加载 20 Newsgroups 数据集,用于文本分类任务
  • 参数:

参数名 类型 默认值 可选值 说明
data_home str (可选) ~/scikit_learn_data/20newsgroups - 指定数据缓存目录路径
subset str 'train' 'train', 'test', 'all' 指定加载的数据子集:训练集、测试集或全部数据
return_X_y bool False True, False 是否以元组形式返回特征和目标数据
  • 返回值【return_X_y=False】

属性名 类型 描述
data list of str, 长度为 18846 每个元素是一篇新闻内容(原始文本)
target ndarray of int, 形状为 (18846,) 每个元素是对应文章的类别标签(整数,范围 [0, 20))
target_names list of str, 长度为 20 类别标签对应的新闻组名称(如 'comp.graphics', 'sci.med' 等)
filenames ndarray of str, 长度为 18846 每个元素是文件路径,表示该文档在原始数据中的位置
  • 返回值【return_X_y=True】

返回值 类型 描述
第一个元素 (data) list of str 新闻文本列表,每项是一篇文章
第二个元素 (target) ndarray of int 每项对应文章的类别标签(0 到 19)

3、案例

  • 代码:

  • #新闻数据集
    #获取数据集
    from sklearn.datasets import fetch_20newsgroups
    #将数据集下载到本地
    news = fetch_20newsgroups(data_home="./", subset="all", return_X_y=False)
    ​
    print(news)

5、本地csv文件数据集

  • 加载本地的csv文件数据集,可以使用pandas库中的read_csv函数,escel文件同理。

  • 案例(瓜子二手车数据集)

    • 代码:

    • import pandas as pd
      ​
      #定义csv文件的访问路径
      path="./guazi.csv"
      ​
      #pandas内置函数read_csv
      data=pd.read_csv(path)
      print(data[:5])#只截取前五个数据输出

    • 输出结果:

6、数据集划分

1、train_test_split 函数

  • 数据集的划分,主要就是把我们的总数据划分为训练数据测试数据两个部分。

  • 假设我们要训练一个鸢尾花分类的模型,那么我们就需要把鸢尾花数据集拿来做训练。但是!不可以把训练了的数据集再用来做测试(因为数据集已经被学习过,我们不可能让机器知道答案后再测试,那样得到的结果是不能提供支持的)。所以我们应该使用未进行参数训练的数据集来测试所以,我们需要把鸢尾花数据集拿来做划分(训练与测试比例一般是 8:2 /7:3)-->训练数据-->测试数据集。

  • 重点:

    • 训练数据集和测试数据集中的数据,在测试时不可以出现训练时没有的某一种类别。

    • 划分数据集使用的时sklearn库中的model_selection下的train_test_split函数:from sklearn.model_selection import train_test_split

  • 参数:

    • *arrays:传入的一到多个数组,就是需要被划分的数据集(这里传入特征信息data和标签信息target)

      • 1个数组被划分成2份

      • 2个数组被划分成4份(一般选择:一个是特征信息,一个是标签)

    • test_size:测试集划分的比例--一般是0.0-1.0之间,默认0.25。

    • train_size:训练集划分的比例--一般是0.0-1.0之间,与测试集互补。

    • random_state:随机数种子(42):不设置,则每一次划分出来的数据集不一致;设置了,则每一次划分出来的数据集一致。

      • 为什么要设置随机数种子:

        • 控制变量法

    • shuffle:(打乱/洗牌)是否打乱数据集在划分,需要打乱为True(默认True)

  • 主要参数及其作用:

    参数名 类型 默认值 可选值/说明
    *arrays list, numpy array, pandas DataFrame 等 - 传入一个或多个数组(如特征 X 和标签 y
    test_size float 或 int 0.25 测试集大小:若为浮点数表示比例(如 0.2),若为整数表示样本数量
    train_size float 或 int 自动计算 训练集大小,若未指定则根据 test_size 推导
    random_state int 或 RandomState 实例 或 None None 控制随机种子,确保每次划分一致(可复现)
    shuffle bool True 是否在划分前打乱数据,默认开启;关闭后按顺序划分
    stratify array-like 或 None None 用于分类任务中保持类别分布一致性(常用于不平衡数据
  • 代码:

  • #导入划分数据集的函数
    from sklearn.model_selection import train_test_split
    #导入数据集函数(以鸢尾花为例)
    from sklearn.datasets import load_iris
    ​
    #加载鸢尾花数据集
    iris=load_iris()
    #特征信息
    data=iris.data
    #标签信息(目标值)
    target=iris.target
    #调用划分数据集函数,实现数据集的划分
    X_train,X_test,y_train,y_test=train_test_split(data,target,test_size=0.2,random_state=42)#设置随机种子后训练集和测试集一致

  • 输出结果:

2、二维数组数据集划分

  • 只划分第一维度(行),第二维度(列)保持不变*

  • 案例

    • 代码:

    • import numpy as np
      #导入划分数据集的函数
      from sklearn.model_selection import train_test_split
      #随机生成一个数组
      data=np.arrange(1,16,1)#生成从1到15的数字,最后一个元素代表步长,这里选择步长为1
      #print(data)#输出[1 2 3 4 5 6 7 8 9 10 11 12 13 14 15]
      #把数组形状改为3行5列
      data=data.reshape(5,3)
      #创建标签数组
      target=np.array([0,1,1,2,0])
      #划分数据集
      X_train,X_test,y_train,y_test=train_test_split(data,target,test_size=0.25,random_state=42)
      print(f"X_train1:{X_train1}")
      print(f"X_test1:{X_test1}")

    • 输出结果:

3、字典数据集划分

  • 字典数据集并非像鸢尾花数据集的特征都是数字,字典数据集中有英文和中文,所以不能直接提取数据集的特征。计算机只能智能识别0和1,所以我们必须把英文和中文的特征都转换为数字,从而训练模型。

  • 需要使用一个API:DictVectorizer用于字典特征提取的API

  • 案例

    • 定义一个数据集

    • data=[
          {"name":"张三","address":"成都","age":18},
          {"name":"李四","address":"上海","age":19},
          {"name":"王五","address":"广州","age":20},
      ]
    • 导入字典特征提取的类

    • from sklearn.feature_extraction import DictVectorizer
    • 通过导入的类来创建提取字典特征的对象

    • dict_vec=DictVectorizer(sparse=False)#sparse为True->稀疏矩阵,为False->numpy数组
    • 执行提取字典特征的操作

    • result=dict_vec.fit_transform(data)
    • 输出结果:

  • 案例分析:

    • sparse:可以选择True和False来控制输出的类型是什么(True为默认)

      • True:输出稀疏矩阵

      • False:输出numpy数组(如案例中的输出结果)

    • 输出的numpy二维数组说明:

      • one-hot(独热编码):只有一个位置是1(有用信息),其余位置都是0

      • 在n维中,如果进行了特征提取后,再进行特征信息表达,选择的是one-hot(独热编码)。那么就会出现类似于[0 1 0...]这样的存储,这样的存储只有一个位置上有有效信息1,其余位置都是0,占用了很多存储空间,这样的存储结果被称为高位稀疏

      • 上述案例结果输出,就是一个one-hot(独热编码)的结果。

      • [[ 0.  0.  1. 18.  1.  0.  0.]
         [ 1.  0.  0. 19.  0.  1.  0.]
         [ 0.  1.  0. 20.  0.  0.  1.]]
      • 对于这样的结果,我们不难发现,有七列,代表了七个提取出来的字典特征,分别是:['address=上海', 'address=广州', 'address=成都', 'age', 'name=张三', 'name=李四', 'name=王五']

        • 第四列代表年龄,之所以只代表一个字典特征,是因为年龄输入的本来就是数字,无需做字典特征提取。(但是如果年龄输入的是str字符串类型,就需要进行特征提取了,这时就有九个特征即九列one-hot编码输出的结果了。)

    • 当spares=True输出的结果呈现:

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐