机器学习 - 数据理解



在处理机器学习项目时,通常我们会忽略两个最重要的部分,即数学数据。数据理解在 ML 中成为一个关键步骤的原因在于其数据驱动的方法。我们的 ML 模型产生的结果只会与我们提供给它的数据一样好或一样坏。

数据理解基本上涉及分析和探索数据,以识别可能存在的任何模式或趋势。

数据理解阶段通常包括以下步骤:

  • 数据收集 - 这涉及收集您将用于分析的相关数据。数据可以从各种来源收集,例如数据库、网站和 API。

  • 数据清洗 - 这涉及通过去除任何不相关或重复的数据以及处理缺失数据值来清理数据。数据应以易于分析的方式进行格式化。

  • 数据探索 - 这涉及探索数据以识别可能存在的任何模式或趋势。这可以使用各种统计技术来完成,例如直方图、散点图和相关分析。

  • 数据可视化 - 这涉及创建数据的视觉表示以帮助您更好地理解它。这可以使用诸如图形、图表和地图之类的工具来完成。

  • 数据预处理 - 这涉及转换数据,使其适合用于机器学习算法。这可能包括缩放数据、将其转换为不同的格式或降低其维度。

在 ML 项目中上传数据之前,请先了解数据

在将数据上传到 ML 项目之前了解我们的数据非常重要,原因如下:

识别数据质量问题

通过了解您的数据,您可以识别可能影响 ML 模型性能的数据质量问题,例如缺失值、异常值、不正确的数据类型和不一致性。通过解决这些问题,您可以提高模型的质量和准确性。

确定数据相关性

您可以确定您收集的数据是否与您试图解决的问题相关。通过了解您的数据,您可以确定哪些特征对您的模型很重要,哪些特征可以忽略。

选择合适的 ML 技术

根据数据的特性,您可能需要选择特定的 ML 技术或算法。例如,如果您的数据是分类的,您可能需要使用分类技术,而如果您的数据是连续的,您可能需要使用回归技术。了解您的数据可以帮助您为您的问题选择合适的 ML 技术。

提高模型性能

通过了解您的数据,您可以设计新的特征、预处理您的数据并选择合适的 ML 技术来提高模型的性能。这可以带来更好的准确性、精确率、召回率和 F1 分数。

使用统计学理解数据

在上一章中,我们讨论了如何将 CSV 数据上传到我们的 ML 项目中,但在上传之前了解数据会更好。我们可以通过两种方式了解数据,一种是使用统计学,另一种是使用可视化。

在本章中,我们将借助以下 Python 示例来使用统计学方法理解 ML 数据。

查看原始数据

第一个示例是查看您的原始数据。查看原始数据非常重要,因为我们在查看原始数据后获得的洞察力将提高我们更好地进行预处理以及处理 ML 项目数据的可能性。

以下是使用 Pandas DataFrame 的 head() 函数在 Pima 印第安人糖尿病数据集上实现的 Python 脚本,用于查看前 10 行以更好地了解它:

示例

from pandas import read_csv
path = r"C:\pima-indians-diabetes.csv"
headernames = ['preg', 'plas', 'pres', 'skin', 'test', 'mass', 'pedi', 'age', 'class']
data = read_csv(path, names=headernames)
print(data.head(10))

输出

preg   plas  pres    skin  test  mass   pedi    age      class
0      6      148     72     35   0     33.6    0.627    50    1
1      1       85     66     29   0     26.6    0.351    31    0
2      8      183     64      0   0     23.3    0.672    32    1
3      1       89     66     23  94     28.1    0.167    21    0
4      0      137     40     35  168    43.1    2.288    33    1
5      5      116     74      0   0     25.6    0.201    30    0
6      3       78     50     32   88    31.0    0.248    26    1
7     10      115      0      0   0     35.3    0.134    29    0
8      2      197     70     45  543    30.5    0.158    53    1
9      8      125     96      0   0     0.0     0.232    54    1
10     4      110     92      0   0     37.6    0.191    30    0

从以上输出中我们可以观察到,第一列给出了行号,这对于引用特定观察结果非常有用。

检查数据的维度

了解 ML 项目有多少数据(以行和列表示)始终是一个好习惯。其背后的原因是:

  • 如果我们有太多行和列,则算法运行和模型训练将需要很长时间。

  • 如果我们有太少的行和列,则我们就没有足够的数据来很好地训练模型。

以下是通过在 Pandas DataFrame 上打印 shape 属性实现的 Python 脚本。我们将它应用于 iris 数据集,以获取其中行和列的总数。

示例

from pandas import read_csv
path = r"C:\iris.csv"
data = read_csv(path)
print(data.shape)

输出

(150, 4)

我们可以很容易地从输出中观察到,我们将要使用的 iris 数据集有 150 行和 4 列。

获取每个属性的数据类型

了解每个属性的数据类型是另一个好习惯。其背后的原因是,根据需要,我们有时可能需要将一种数据类型转换为另一种数据类型。例如,我们可能需要将字符串转换为浮点数或整数以表示分类或序数值。我们可以通过查看原始数据来了解属性的数据类型,但另一种方法是使用 Pandas DataFrame 的 dtypes 属性。借助 dtypes 属性,我们可以对每个属性的数据类型进行分类。这可以通过以下 Python 脚本了解:

示例

from pandas import read_csv
path = r"C:\iris.csv"
data = read_csv(path)
print(data.dtypes)

输出

sepal_length  float64
sepal_width   float64
petal_length  float64
petal_width   float64
dtype: object

从以上输出中,我们可以很容易地获取每个属性的数据类型。

数据的统计摘要

我们讨论了获取数据形状(即行数和列数)的 Python 示例,但很多时候我们需要查看该形状之外的数据摘要。这可以通过 Pandas DataFrame 的 describe() 函数来完成,该函数进一步提供了每个数据属性的以下 8 个统计属性:

  • 计数
  • 均值
  • 标准差
  • 最小值
  • 最大值
  • 25%
  • 中位数,即50%
  • 75%

示例

from pandas import read_csv
from pandas import set_option
path = r"C:\pima-indians-diabetes.csv"
names = ['preg', 'plas', 'pres', 'skin', 'test', 'mass', 'pedi', 'age', 'class']
data = read_csv(path, names=names)
set_option('display.width', 100)
set_option('precision', 2)
print(data.shape)
print(data.describe())

输出

(768, 9)
         preg      plas       pres      skin      test        mass       pedi      age      class
count 768.00      768.00    768.00     768.00    768.00     768.00     768.00    768.00    768.00
mean    3.85      120.89     69.11      20.54     79.80      31.99       0.47     33.24      0.35
std     3.37       31.97     19.36      15.95    115.24       7.88       0.33     11.76      0.48
min     0.00        0.00      0.00       0.00      0.00       0.00       0.08     21.00      0.00
25%     1.00       99.00     62.00       0.00      0.00      27.30       0.24     24.00      0.00
50%     3.00      117.00     72.00      23.00     30.50      32.00       0.37     29.00      0.00
75%     6.00      140.25     80.00      32.00    127.25      36.60       0.63     41.00      1.00
max    17.00      199.00    122.00      99.00    846.00      67.10       2.42     81.00      1.00

从以上输出中,我们可以观察到Pima印第安人糖尿病数据集的数据统计摘要以及数据的形状。

查看类别分布

类别分布统计在分类问题中非常有用,在这些问题中我们需要了解类别值的平衡情况。了解类别值分布非常重要,因为如果我们有高度不平衡的类别分布,即一个类别的观测值远多于其他类别,那么在机器学习项目的“数据准备”阶段可能需要进行特殊处理。借助Pandas DataFrame,我们可以轻松地获取Python中的类别分布。

示例

from pandas import read_csv
path = r"C:\pima-indians-diabetes.csv"
names = ['preg', 'plas', 'pres', 'skin', 'test', 'mass', 'pedi', 'age', 'class']
data = read_csv(path, names=names)
count_class = data.groupby('class').size()
print(count_class)

输出

Class
0  500
1  268
dtype: int64

从以上输出可以清楚地看出,类别为0的观测值数量几乎是类别为1的观测值数量的两倍。

查看属性之间的相关性

两个变量之间的关系称为相关性。在统计学中,计算相关性的最常用方法是皮尔逊相关系数。它可以有以下三个值:

  • 系数值为1 - 表示变量之间存在完全相关。

  • 系数值为-1 - 表示变量之间存在完全相关。

  • 系数值为0 - 表示变量之间不存在相关性。

在将数据集用于机器学习项目之前,审查数据集中的属性的两两相关性始终是一个好习惯,因为如果存在高度相关的属性,一些机器学习算法(如线性回归和逻辑回归)的性能会很差。在Python中,我们可以借助Pandas DataFrame上的corr()函数轻松地计算数据集属性的相关矩阵。

示例

from pandas import read_csv
from pandas import set_option
path = r"C:\pima-indians-diabetes.csv"
names = ['preg', 'plas', 'pres', 'skin', 'test', 'mass', 'pedi', 'age', 'class']
data = read_csv(path, names=names)
set_option('display.width', 100)
set_option('precision', 2)
correlations = data.corr(method='pearson')
print(correlations)

输出

preg     plas     pres     skin     test      mass     pedi       age      class
preg     1.00     0.13     0.14     -0.08     -0.07   0.02     -0.03       0.54   0.22
plas     0.13     1.00     0.15     0.06       0.33   0.22      0.14       0.26   0.47
pres     0.14     0.15     1.00     0.21       0.09   0.28      0.04       0.24   0.07
skin    -0.08     0.06     0.21     1.00       0.44   0.39      0.18      -0.11   0.07
test    -0.07     0.33     0.09     0.44       1.00   0.20      0.19      -0.04   0.13
mass     0.02     0.22     0.28     0.39       0.20   1.00      0.14       0.04   0.29
pedi    -0.03     0.14     0.04     0.18       0.19   0.14      1.00       0.03   0.17
age      0.54     0.26     0.24     -0.11     -0.04   0.04      0.03       1.00   0.24
class    0.22     0.47     0.07     0.07       0.13   0.29      0.17       0.24   1.00

以上输出中的矩阵给出了数据集中所有属性对之间的相关性。

查看属性分布的偏度

偏度可以定义为假设为高斯分布但看起来在一个方向或另一个方向(向左或向右)扭曲或偏移的分布。由于以下原因,查看属性的偏度是一项重要的任务:

  • 数据中存在偏度需要在数据准备阶段进行校正,以便我们可以从模型中获得更高的准确性。

  • 大多数机器学习算法假设数据服从高斯分布,即正态分布或钟形曲线数据。

在Python中,我们可以通过在Pandas DataFrame上使用skew()函数轻松地计算每个属性的偏度。

示例

from pandas import read_csv
path = r"C:\pima-indians-diabetes.csv"
names = ['preg', 'plas', 'pres', 'skin', 'test', 'mass', 'pedi', 'age', 'class']
data = read_csv(path, names=names)
print(data.skew())

输出

preg   0.90
plas   0.17
pres  -1.84
skin   0.11
test   2.27
mass  -0.43
pedi   1.92
age    1.13
class  0.64
dtype: float64

从以上输出中,可以观察到正偏度或负偏度。如果值接近于零,则表示偏度较小。

广告