Advertisement

Structured Data: A Primer on Data Modeling for Machine

阅读量:

作者:禅与计算机程序设计艺术

1.简介

在本文中,我们将讨论结构化数据建模,即如何组织结构化的数据才能有效地进行机器学习的训练。在讨论之前,让我们先来回顾一下什么是结构化数据及其相关术语。

什么是结构化数据?

结构化数据是计算机处理、分析和理解数据的一种方式。它通常呈现为表格形式、XML文件或关系型数据库中的记录,每个记录都有一个明确定义的结构。结构化数据包括各类事实信息(如日期、时间、货币金额等)以及它们之间的关系(如学生与教授之间的联系)。

数据模型术语

  • Record:结构化数据集中的一个实体,例如一条订单中的一行数据或一条客户的数据。
  • Attribute:关于某个记录的描述性特征。例如,订单号、客户名、价格等属性。
  • Value:记录的一个特定属性的值。例如,订单号12345的价格值可能是50美元。
  • Field:由不同数据类型组成的连续单元,例如整数、字符串、浮点数等。
  • Type:用于区分不同字段的数据类型。
  • Entity Set:构成结构化数据集的多个Record。例如,可以将一张电子商务网站上的所有商品归为一个实体集合。
  • Relationship:两个或更多实体集之间存在的联系。例如,在一个电子商务网站上,一个用户可能希望购买多个商品,而这些商品又可能和其他产品相关联。

数据模型原则

  • 完整性:每条记录都是完整且准确的,不存在任何缺失值、重复值或错误值。
  • 一致性:同一类实体在所有记录中具有相同的属性和值的约束。
  • 可用性:结构化数据应该能够被有效地检索、聚合、过滤、排序、连接和查询。
  • 关联性:不同实体之间的关系应该能够被清晰地表示。
  • 可扩展性:结构化数据模型应能够处理多种数据存储格式,包括文本文件、数据库或图形数据库。

1.背景介绍

机器学习和人工智能领域在过去的几年取得了重大的进步。越来越多的应用场景需要从海量的数据中学习有用的模式,其中一个重要领域就是结构化数据建模。

随着结构化数据越来越普遍,各种工具和方法已经被开发出来帮助工程师更好地处理结构化数据。但是,对新手来说,如何有效地构建出高效的结构化数据模型却是一个难题。这项工作需要通过对数据模型的原理和基础知识、数据建模的最佳实践和常见问题的解答,来提升大家的技能水平。

2.基本概念术语说明

下面我们介绍一些关键术语。

(1)Record 和 Instance

Record 是指构成结构化数据的实体。每一条 Record 可以看作一个 Instance。一般情况下,Record 会涉及到多个 Instance。比如,对于一张电子表格,每行对应一条 Record,列对应一个 Instance。

(2)Attribute 和 Feature

Attribute 表示记录中的一个属性。它可以理解为是记录的特征或维度。比如,在一张销售订单中,可能有 Product ID、Product Name、Price、Quantity、Date of Purchase 等 Attribute。

(3)Value

Value 是记录的一个特定的 Attribute 的取值。比如,Order Number = 12345 中,12345 就是 Order Number 属性的 Value。

(4)Field

Field 是指由不同的数据类型组成的连续单元,它一般与 Attribute 相对应。比如,Name 这个 Attribute 可以由姓名、名字、名等不同的 Field 拼接而成。

(5)Type

Type 是用来区分不同 Field 的数据类型。比如,数字型、字符型、日期型等。

(6)Entity Set 和 Domain

Entity Set 是指构成结构化数据的多个 Record 。它代表了一个具有某些共同特征的实体群体,如订单、产品、顾客等。Domain 是指 Record 的集合,它通常与一个应用系统相关。

(7)Relationship

Relationship 是指两个或更多实体集之间存在的联系。比如,在一个电子商务网站上,一个用户可能希望购买多个商品,而这些商品又可能和其他产品相关联。这种联系可以通过添加额外的 Attribute 来表示,比如 BuyerID 和 SellerID 等。

3.核心算法原理和具体操作步骤以及数学公式讲解

(1)数据预处理阶段

数据预处理阶段主要包含以下几个方面:

  1. 数据规范化:将原始数据按照规定好的标准转化为统一的格式,比如统一用小写字母。
  2. 数据编码:将离散值转换为数字,方便后续计算。比如,把性别用数字代替,“男”=1,“女”=2。
  3. 数据缺失处理:根据具体情况,对缺失值进行填充或者删除。
  4. 数据切分:将数据按比例分为训练集、验证集、测试集。
  5. 数据扩增:生成更多的样本数据。

(2)数据建模阶段

数据建模阶段包含以下几个方面:

  1. 变量选择:选择模型中最有价值的变量,并对其进行编码。
  2. 异常值检测:寻找数据中可能出现的异常值,并做出相应的处理。
  3. 变量合并:将两个变量合并为一个变量,并做出相应的编码。
  4. 变量拆分:将复杂变量拆分为若干个简单变量。
  5. 模型训练:使用选出的变量进行训练,得到模型参数。
  6. 模型评估:评估模型的性能。
  7. 模型融合:将多个模型结果融合成最终的预测结果。

(3)决策树算法

决策树是一种非常常用的机器学习算法,它能够快速、准确地预测出分类问题。它的基本思想是基于特征的选择和条件的组合,递归地构造分类树。

下图展示的是决策树的流程:

(a)决策树的原理

决策树是一种树形结构,树的根结点代表着决策的起始点,而树的叶子结点则代表着结论。因此,决策树是一种带有层次的分类方法。

决策树的构造过程如下:

  1. 从根节点开始。
  2. 判断待分类的实例是否满足根节点的选择条件。如果满足,则到达相应的叶子结点;否则,进入下一层。
  3. 在当前层继续判断,直至叶子结点。
  4. 将待分类实例分配到叶子结点中,从而完成分类。
(b)决策树算法的实现

决策树算法一般分为两步:第一步为选择变量作为划分依据,第二步为递归地构建决策树。下面我们分别介绍。

变量选择

变量选择是决策树算法的核心步骤之一。由于决策树构造模型时,往往会考虑多个因素,所以需要综合考虑多个变量,以达到最优效果。常见的方法有三种:信息增益法、信息增益率法、基尼系数法。

(i)信息熵

信息熵是表示随机变量不确定性的度量,或者是衡量不确定性的大小。随机变量的不确定性越大,信息熵就越大。信息熵公式为:H=-\frac{1}{n}\sum_{i=1}^{n}p(x_{i})log(p(x_{i}))

熵的单位是比特(bit),表示随机变量的信息的期望。举个例子,一组音乐数据有8首歌曲,每首歌曲的风格有三种(民谣、摇滚、流行),那么风格这个变量的熵就可以用下面公式计算:

H=\frac{3}{8}\times log(\frac{3}{8})+\frac{3}{8}\times log(\frac{3}{8})+\frac{3}{8}\times log(\frac{3}{8})=-\frac{9}{8}(log(3))=-\frac{2}{3}(log(2))+log(3)

(ii)信息增益

信息增益表示的是已知分类结果的信息而得到的新信息。假设有一组数据,其特征A有两种取值(值1和值2),特征B也有两种取值(值3和值4),假定最后的分类结果C取值为值3或值4。已知C的信息而获得特征A的信息所得的期望值,称为特征A的增益(Gain)。信息增益公式为:Gain=H(C)-H(C|A)

为了求取最大的信息增益,就要使信息增益最大化。计算信息增益的方法是对数据集D的信息熵H(D)进行加权平均:IG(D,A)=\sum_{v\in values(A)}\frac{|D_{v}|}{\|D\|}\times H(D_{v}),其中D_v表示特征A取值为v的子集。

总的来说,信息增益法的基本思想是选择使得划分后的信息不纯度最小的特征作为分类特征。

(iii)信息增益率

信息增益率(Information Gain Ratio)是用来度量特征有无用的度量。特征A的信息增益比特征B的信息增益更有用,是因为前者包含了更多的信息。信息增益率可以用比值表示:\frac{Gain(D,A)}{IV(A)}

IV表示特征A给定分类结果C的信息期望,等于划分后的信息熵H(D|A)。IV(A)表示A的信息期望,等于经验熵H(D)。因此,信息增益率公式可写作:Gain\_Ratio=\frac{\frac{H(D)-H(D|A)}{H(D)}}{\frac{H(D|A)}{H(D)}}

信息增益率法在避免偏向于只有两个取值的特征上有所改善。

递归构造决策树

构造决策树实际上就是递归地进行选择,选择哪个变量来划分,使得划分后的子集拥有最大的类别纯度。构造完毕后,需要将其保存起来,便于后续预测。

决策树的剪枝

决策树的剪枝是决策树算法的一个重要优化策略。通过剪枝,可以降低决策树的复杂度,减少过拟合,提高模型的泛化能力。

剪枝的基本思想是找到影响训练误差最小的叶子结点,然后将其剪掉。剪枝可以分为预剪枝和后剪枝。

(i)预剪枝

预剪枝是指在决策树的构建过程中就对局部叶子结点进行裁剪,这样可以在尽可能不损害整体结构的情况下减少预测误差。预剪枝的基本思路是先在全量数据上构建完整的决策树,然后按照一定规则对其进行裁剪,剔除影响性能最差的局部结点。

(ii)后剪枝

后剪枝是指在决策树的训练之后,通过迭代的方式逐渐修剪决策树的叶子结点,直到其达到一定的高度或性能没有明显变化为止。后剪枝的基本思想是找到影响训练误差最小的叶子结点,然后不断迭代地对其进行裁剪,使之收敛于全局最优。

(c)决策树的调参

决策树的调参是解决决策树模型的三个问题之一——模型的复杂度,模型的正确率,以及模型的运行速度。调参可以帮助我们在不引入太大的错误的情况下,获取最佳的模型性能。

下面介绍决策树的调参方法。

(i)树的高度限制

树的高度限制是指限定决策树的最大深度。过深的决策树容易过拟合,过浅的决策树可能欠拟合。常用的树的高度限制有几种:预剪枝、后剪枝、交叉验证法。

(ii)节点的个数限制

节点的个数限制是指限定决策树的最大叶子结点数量。过多的叶子结点容易过拟合,过少的叶子结点可能会导致欠拟合。常用的节点个数限制有三种:预剪枝、后剪枝、最大深度。

(iii)终止阈值

终止阈值(Pruning Threshold)是指判定叶子结点是否划分为叶子结点的阈值。当某个叶子结点的输出概率低于该阈值时,就停止划分该叶子结点,将其标记为叶子结点。常用的终止阈值有固定值、固定的百分比、提升法。

(iv)最小样本数限制

最小样本数限制是指某个叶子结点能够接受的样本的最少数量。当某个叶子结点的样本数量小于该限制时,就停止划分该叶子结点,将其标记为叶子结点。常用的最小样本数限制有固定值、固定的百分比、提升法。

4.具体代码实例和解释说明

为了更好地理解结构化数据建模的原理和步骤,我们举个例子说明如何用Python实现决策树算法。

4.1 加载数据

首先,我们加载一些数据作为示例。这里我们使用 Iris 数据集作为示范。Iris 数据集是一个经典的分类数据集,里面含有四个特征,分别是 Sepal Length、Sepal Width、Petal Length、Petal Width,其中 Sepal 和 Petal 分别表示花瓣的长度和宽度。我们通过下面命令导入数据集:

复制代码
    from sklearn import datasets
    
    iris = datasets.load_iris()
    X = iris.data[:, :2] # 使用前两个特征
    y = iris.target
    
    
      
      
      
      
      
    
    代码解读

datasets.load_iris() 函数可以载入 Iris 数据集。X 是数据集中所有的特征,也就是 Sepal LengthSepal Widthy 是目标值,也就是花瓣的类别,有三种:山鸢尾、变色鸢尾和维吉尼亚鸢尾。

4.2 数据探索

我们用箱线图来探索数据集。首先,我们绘制 Sepal Length 的箱线图:

复制代码
    import matplotlib.pyplot as plt
    
    plt.boxplot([X[y==0][:,0], X[y==1][:,0], X[y==2][:,0]], labels=['Setosa', 'Versicolor', 'Virginica'])
    plt.xlabel('Feature')
    plt.ylabel('Sepal Length')
    plt.title("Box plot of sepal length grouped by species")
    plt.show()
    
    
      
      
      
      
      
      
      
    
    代码解读

结果如下图所示:

箱线图可以直观地显示数据的分布情况。在上图中,横轴表示 Sepal Length,纵轴表示花瓣的 Sepal Length。蓝色竖线表示 Setosa 品种,红色竖线表示 Versicolor 品种,绿色竖线表示 Virginica 品种。中间的直线表示 Median,四条线表示数据的上下界。

4.3 创建决策树

我们使用 DecisionTreeClassifier 类创建决策树。DecisionTreeClassifier 类的参数如下:

  • criterion:用于评估划分质量的函数,可以使用 ginientropy
  • splitter:用于指定生成叶子结点的方式,可以使用 bestrandom
  • max_depth:决策树的最大深度。
  • min_samples_split:内部节点再划分所需最小样本数。
  • min_samples_leaf:叶子节点最少样本数。
  • random_state:随机种子,可以控制每次运行结果的一致性。

下面,我们创建一个简单的决策树:

复制代码
    from sklearn.tree import DecisionTreeClassifier
    
    clf = DecisionTreeClassifier(criterion='entropy',
    splitter='best',
    max_depth=None,
    min_samples_split=2,
    min_samples_leaf=1,
    random_state=1)
    
    clf.fit(X, y)
    
    
      
      
      
      
      
      
      
      
      
      
    
    代码解读

clf.fit(X, y) 方法用于训练决策树。criterion='entropy' 指定用信息熵作为划分质量的评估函数。splitter='best' 指定采用最佳拆分策略。max_depth=None 意味着决策树的深度没有限制。min_samples_split=2 指定内部节点再划分所需最小样本数为 2。min_samples_leaf=1 指定叶子节点最少样本数为 1。

4.4 绘制决策边界

我们可以用 matplotlib 库绘制决策边界。首先,我们计算决策边界:

复制代码
    xx, yy = np.meshgrid(np.arange(-1, 4),
    np.arange(-1, 4))
    Z = clf.predict(np.c_[xx.ravel(), yy.ravel()])
    Z = Z.reshape(xx.shape)
    
    
      
      
      
      
    
    代码解读

np.meshgrid() 方法用于产生网格坐标矩阵。np.c_ 方法用于将多个数组沿第0轴组合。ravel() 方法用于将数组转换为一维数组。reshape() 方法用于调整数组形状。Z = clf.predict(np.c_[xx.ravel(), yy.ravel()]) 用于预测网格矩阵的所有元素属于哪一类。Z = Z.reshape(xx.shape) 用于调整预测结果的形状,使之与网格矩阵的形状一致。

然后,我们绘制决策边界:

复制代码
    fig, ax = plt.subplots()
    ax.contourf(xx, yy, Z, alpha=0.4)
    scatter = ax.scatter(X[:, 0], X[:, 1], c=y, s=50, cmap='viridis')
    legend = ax.legend(*scatter.legend_elements(),
    loc="upper right", title="Classes")
    ax.set_xlabel('Sepal Length')
    ax.set_ylabel('Sepal Width')
    ax.set_title('Decision Boundary and Classes')
    plt.show()
    
    
      
      
      
      
      
      
      
      
      
    
    代码解读

结果如下图所示:

决策边界显示了分类结果的范围。我们可以看到,决策边界把山鸢尾、变色鸢尾、维吉尼亚鸢尾的区分开了。

5.未来发展趋势与挑战

结构化数据建模的未来仍然面临诸多挑战。下面是一些未来可能发生的方向:

  1. 数据采集:越来越多的数据源正在涌现,结构化数据集的规模也在扩大。这将带来新的挑战,如何收集、存储和管理海量的数据。
  2. 数据融合:数据量变大后,如何有效地进行数据融合,建立起更为精细和丰富的分析模型。
  3. 关联发现:如何发现不同实体之间的复杂关系,是结构化数据建模的关键环节。
  4. 增量建模:如何有效地处理新增数据,是结构化数据建模的重要研究方向。
  5. 数据共享:不同部门、团队之间的共享数据如何更好地协同工作,是结构化数据建模的一项关键任务。

全部评论 (0)

还没有任何评论哟~