1. 概述

1.1. 机器学习算法分类

1.1.1. 监督学习法(Supervised Learning) (预测)

  • 定义 : 输入数据是由输入特征值和目标特征值所构成。函数的输出可以是一个连续的值(成为回归算法) , 或是输出是有限个离散值(成为分类)。
  • 分类 : k-近邻算法、贝叶斯分类、决策树与随机森林、逻辑回归
  • 回归 : 线性回归、邻回归

1.1.2. 无监督学习法(UnSupervised Leanring)

  • 定义 : 输入数据是由输出特征所组成
  • 聚类 : k-means

1.2. 机器学习的开发流程

  1. 获取数据
  2. 数据处理
  3. 特征工程(特征值)
  4. 机器学习算法训练 - 模型
  5. 模型评估
  6. 应用

image-20250228132359110

1.2. 学习阶段可用的数据集:

  1. Kaggle网址 : Find Open Datasets and Machine Learning Projects | Kaggle
  2. UCI数据集网址 : Home - UCI Machine Learning Repository
  3. scikit-learn网址 : scikit-learn:Python 中的机器学习 — scikit-learn 1.6.1 文档

1.3. scikit-learn工具介绍

  • Python语言的机器学习工具
  • scikit-learn包括许多知名的机器学习算法的实现
  • scikit-learn文档完善易上手,丰富的API

1.3.1 安装

pip install scikit-learn

测试是否安装成功

import sklearn
print(sklearn.__version__)
  • 安装Scikit-learn需要Numpy、Scipy等库

1.3.2. Scikit-Learn包含内容

image-20250228145437923

  • 分类、聚类、回归
  • 特性工程
  • 模型选择、调优

2. 特征工程

2.1 sklearn数据集

2.1.1. sklearn-learn数据集API介绍

  • sklearn.datasets

    • 加载获取流行数据集
    • datasets.load_*()
      • 获取小规模数据集,数据包含在datasets内
    • datasets.fetch_*(data_home=None)
      • 获取大规模数据集,需要从网络上下载,函数第一个参数是data_home,表示数据集下载的目录,默认是 ~/scikit_learn_data/
  • sklearn大数据集

    • sklearn.datasets.fetch_20newsgroups_home=None,subset="train"
      • sunsets : "train"或则"test","all",可选,选择要加载的数据集
      • 训练集的"训练",测试集的"测试",两者的"全部"

2.1.2 数据集的使用

sklearn数据集返回值介绍

  • load和fetch返回的数据类型datasets.base.Bunch(字典格式)
    • data : 特征数据组,是[n_samples *n_features]的二维 numpy.ndarray 数组
    • target : 标签数组 ,是n_samples 的唯一 nmpy.ndarray数组
    • DESCR : 数据描述
    • feature_names : 特征名,新闻数据,手写数字、回归数据集没有
    • tatget_names : 标签名
from sklearn.datasets import load_iris

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)
    return None

if __name__ == '__main__':
    # 数据集的使用
    datasets_demo()

2.1.3 数据集的划分

机器学习一般的数据集会划分为两个部分:

  • 训练数据 :用于训练、构建模型
  • 测试数据 :在模型检验时,用于评估模型是否有效

划分比例

  • 训练集 :70% 80% 75%
  • 测试集 : 30% 20% 30%

数据划分

  • sklearn.model_selection.train_test_split(array,"options")
    • x 数据集的特征值
    • y 数据集的标签值
    • test_size 测试集的大小,一般为float
    • random_state 随机数种子,不同的种子会造成不同的随机采样结果,相同的种子采用结构相同
    • return 训练集特征值(x_train),测试集特征值(x_test),训练集目标值(y_train),测试集目标值(y_test)
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.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)
    print("测试集特征值: \n", x_test)
    print("训练集目标值: \n", y_train)
    print("测试集目标值: \n",y_train)
    return None

if __name__ == '__main__':
    # 数据集的使用
    datasets_demo()

2.2 特征工程介绍

2.2.1 字典特征提取

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

  • sklearn.feature_extraction.DictVectorizer(sparse=True,...)
    • DictVectorizer.fit transform() X:字典或者包含字典的回sparse矩阵
    • DictVectorizer.inverse_transform(X) X:array数组或者S转换之前数据格式
    • DictVectorizer.get feature_names() 返回类别名称
  • 返回sparse(稀疏)矩阵
    • = False : 将非零值按位置表示出来 -内存节省,提高速度
    • = True : 转换为二维数组表述

应用场景:

  1. 数据类别特征比较多的时候
    1. 将数据集特征 -> 字典类型
    2. DictVectorizer转换
  2. 本身拿到的就说字典类型
def dict_demo():
    """
    字典特征抽取
    :return:
    """
    data = [{'city': '北京', 'temperature': 35}, {'city': '上海', 'temperature': 37}, {'city': '广州', 'temperature': 38}]
    # 1. 实列化一个转换器类
    transfer = DictVectorizer(sparse=False)
    # 2. 调用fit_transform(字典或包含字典的迭代器)
    data_new = transfer.fit_transform(data)
    print("data_new: \n", data_new)
    return None

image-20250304125755483

2.2.2 文本特征提取

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

  • sklearn.feature_extraction.text.CountVectorizer(stop_words=[])
    • stop_words 停用词 : 将不需要词汇添加后就不会再出现这个词
    • 返回词频矩阵
  • CountVectorizer.fit_transform(x) X:文本或包含文本字符串的可迭代对象
    • 返回spares矩阵
  • CountVectorizer.inverse_transform(x) X:array数组或则spares矩阵
    • 返回转换之前的数据格
  • CountVectorizer.get_feature_names_out()
    • 返回单词列表
  • sklearn.feature_extraction.text.TfidVectorizer

应用

  • CountVectorize()
    • 统计样本特征值出现的个数
def count_demo():
    """
    文本特征抽取
    :return:
    """
    data = ["life is fucking move", "live is fucking fucking shit"]
    # 1. 实列化转换器
    transfer = CountVectorizer()
    # 2. 调用fit_transform
    data_new = transfer.fit_transform(data)
    print("data_name:\n", data_new.toarray())
    print("data_name:\n", transfer.get_feature_names_out())
    return None

image-20250304131955696

2.2.2.1 中文文本特征提取

1. jieba分词处理

def cut_word(text):
    """
    jieba分词器 自动分词
    :param text:
    :return:
    """
    return " ".join(list(jieba.cut(text)))

2. 文本特征提取

def count_chinese_demo2():
    """
    中文文本特征抽取
    :return:
    """
    data = ["我爱Python", "冲冲冲", "您需要一个合适的软件,如自动CAD打开一个MND文件。如果没有适当的软件,您将收到 Windows 消息您希望如何打开此文件?或Windows 无法打开此文件或类似的 Mac/iPhone/Android 警报。如果您无法正确打开 MND 文件,请尝试右键单击或长时间按压文件。然后单击打开并选择应用程序。您也可以直接在浏览器中显示 MND 文件.只需将文件拖到此浏览器窗口并将其丢弃。"]
    # 调用jieba分词方法
    data_list = []
    for sent in data:
        data_list.append(cut_word(sent))
    print(data_list)

    # 1. 实列化转换器
    transfer = CountVectorizer(stop_words=["单击", "可以"])
    # 2. 调用fit_transform
    data_new = transfer.fit_transform(data_list)
    print("data_name:\n", data_new.toarray())
    print("特征名称:\n", transfer.get_feature_names_out())
    return None

2.2.2.2 文本特征抽取 TfidVectorizer

作用:

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

  • TF-IDF的主要思想是:如果某个词或短语在一篇文章中出现的概率高,并且在其他e文章中很少出现,则认为此词或者短语具有很好的类别区分能力,适合用来分类。
  • TF-IDF作用:用以评估一字词对于一个文件集或一个语料库中的其中一份文件的重要程度。

公式:

  • 词频(term freguency,tf)指的是某一个给定的词语在该文件中出现的频率
  • 逆向文档频率(inverse document frequency,idf)是一个词语普遍重要性的度量。某一特定词语的idf,可以由总文件数目除以包含该词语之文件的数目,再将得到的商取以10为底的对数得到

image-20250304133505733

  • 举例

    • 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: log 10 1000/100 = 1

    ​ 对数?

    ​ 2 ^ 3 = 8

    ​ log 2 8 = 3

    ​ log 10 10 = 1

    ​ TF - 词频(term frequency,tf)

    ​ IDF - 逆向文档频率

2.2.3 特征预处理

解释: 通过一些转换函数将特征数据转换成更加适合算法模型的特征数据过程

包含内容

  • 数值类型数据的无量纲化
    • 归一化
    • 标准化

特征预处理API

sklearn.preprocessing

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

  • 特征的单位或者大小相差较大,或者某特征的方差相比其他的特征要大出几个数量级,容易影响(支配)目标结果,使得一些算法无法学习到其它的特征

2.2.3.1 归一化

定义

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

公式

image-20250304134736416

作用于每一列,max为一列的最大值,min为一列的最小值,那么X”为最终结果,mx,mi分别为指定区间值默认mx为1,mi为0

def minmax_demo():
    """
    归一化
    :return:
    """
    # 设置最大行数和列数为 None(即不设限制)
    # pd.set_option('display.max_rows', None)
    # pd.set_option('display.max_columns', None)

    # 1.获取数据集
    data = pd.read_csv("dating.txt")
    data = data.iloc[:, :3]
    print("data: \n", data)
    # 2.实列化一个转换器类
    transfer = MinMaxScaler(feature_range=(1, 3))
    # 3.调用fit_transform
    data_new = transfer.fit_transform(data)
    print("data_new: \n", data_new)
    return None

image-20250304135014161

总结

注意最大值最小值是变化的,另外,最大值与最小值非常容易受异常点影响所以这种方法鲁棒性较差,只适合传统精确小数据场景。

2.2.3.2 标准化

1. 定义

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

2. 公式

image-20250304135426449

作用于每一列,mean为平均值,a为标准差

  • 对于归一化来说:如果出现异常点,影响了最大值和最小值,那么结果显然会发生改变
  • 对于标准化来说:如果出现异常点,由于具有一定数据量,少量的异常点对于平均值的影响并不大,从而方差改变较小。

3. API

  • sklearn.preprocessing.StandardScaler( )
    • 处理之后,对每列来说,所有数据都聚集在均值为0附近,标准差为1
    • StandardScaler.fit_transform(X)
      • X:numpy array格式的数据[n_samples,n_features]
    • 返回值:转换后的形状相同的array

总结

在已有样本足够多的情况下比较稳定,适合现代嘈杂大数据环境

2.2.4 降维

维数:嵌套维度

  • 0维 标量
  • 1维 向量
  • 2维 矩阵 ……

处理对象: 二维数组,降低特征的个数

包含内容

  • 特征选择
  • 主要成分分析(可以理解一种特征提取的方式)

2.2.4.1 特征选择

定义

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

比如一只鸟的特征有 : 羽毛颜色、眼镜宽度、眼睛长度、爪子长度、体格大小

方法

  • FIlter (过滤式)
    • 方差选择法:低方差特征过滤
    • 相关系数法:特征与特征之间的相关程度
  • Embeded(嵌入式)
    • 决策树
    • 正则化
    • 深度学习