Machine Learning 简明教程

Machine Learning - Data Understanding

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

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

数据理解阶段通常涉及以下步骤 −

  1. Data Collection − 这涉及收集您将在分析中使用的相关数据。数据可以从各种来源收集,例如数据库、网站和 API。

  2. Data Cleaning − 这涉及通过删除任何不相关或重复的数据以及处理缺失数据值来清理数据。应该以一种易于分析的方式格式化数据。

  3. Data Exploration − 这涉及探索数据以识别存在的任何模式或趋势。可以使用各种统计技术(如直方图、散点图和相关性分析)来完成此操作。

  4. Data Visualization − 这涉及创建数据的可视化表示形式,以帮助您更好地理解它。可以使用图形、图表和地图等工具来完成此操作。

  5. Data Preprocessing − 这涉及转换数据以使其适合机器学习算法使用。这可能包括缩放数据、将其转换为不同的格式或降低其维度。

Understand the Data before Uploading It in ML Projects

在将数据上传到我们的 ML 项目之前了解我们的数据出于以下几个原因非常重要 −

Identify Data Quality Issues

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

Determine Data Relevance

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

Select Appropriate ML Techniques

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

Improve Model Performance

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

Data Understanding with Statistics

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

在这一章中,在以下 Python 配方的帮助下,我们将使用统计数据来理解机器学习数据。

Looking at Raw Data

第一个配方是查看原始数据。查看原始数据非常重要,因为查看原始数据后获得的见解将增加我们更好地对机器学习项目的进行数据预处理和处理的机会。

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

Example

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

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

Checking Dimensions of Data

了解我们为机器学习项目准备的行列数据量始终是一个好习惯。背后的原因是 −

  1. 假设如果我们有太多行和列,那么运行算法和训练模型将需要很长时间。

  2. 假设如果我们有太少的行和列,那么我们就没有足够的数据来很好地训练模型。

以下是通过在 Pandas 数据框架中打印 shape 属性来实现的 Python 脚本。我们将对 iris 数据集进行实现以获取其中的行数和列数。

Example

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

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

Getting Each Attribute’s Data Type

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

Example

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

从上面的输出中,我们可以轻松获得每个属性的数据类型。

Statistical Summary of Data

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

  1. Count

  2. Mean

  3. Standard Deviation

  4. Minimum Value

  5. Maximum value

  6. 25%

  7. Median i.e. 50%

  8. 75%

Example

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 Indian Diabetes 数据集的数据统计摘要以及数据形状。

Reviewing Class Distribution

类分布统计在分类问题中很有用,在这些问题中我们需要了解类值之间的平衡。了解类值分布非常重要,因为如果我们的类分布极不平衡,即一个类的观察值远多于另一个类,那么在机器学习项目的 data preparation 阶段可能需要特殊处理。我们可以借助 Pandas DataFrame 轻松地在 Python 中获取类分布。

Example

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 的观测值数量的两倍。

Reviewing Correlation between Attributes

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

  1. Coefficient value = 1 − 它表示变量之间完全 positive 相关。

  2. Coefficient value = -1 − 它表示变量之间完全 negative 相关。

  3. Coefficient value = 0 − 它表示变量之间完全 no 相关。

在我们将其用于 ML 项目之前,始终审阅我们数据集中的属性对相关性非常有益,因为如果我们具有高度相关的属性,某些机器学习算法(如线性回归和逻辑回归)的性能会很差。在 Python 中,我们可以借助 Pandas DataFrame 上的 corr() 函数轻松计算数据集属性的相关性矩阵。

Example

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

上方输出中的矩阵提供了数据集中的所有成对属性之间的相关性。

Reviewing Skew of Attribute Distribution

偏度可以定义为一个假定为高斯分布但看起来已向另一个方向扭曲或偏移,或朝左或朝右的分布。审阅属性的偏度至关重要,原因如下所述−

  1. 数据中出现偏度需要在数据准备阶段进行校正,以便我们从模型中获得更高精度。

  2. 大多数 ML 算法假设数据呈高斯分布,即产生正态或钟形曲线数据。

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

Example

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

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