Machine Learning 简明教程
Machine Learning - Data Understanding
在使用机器学习项目时,我们通常会忽略两个最重要的部分,分别称为 mathematics 和 data 。数据理解是 ML 中的关键步骤,其原因在于它的数据驱动方法。我们的 ML 模型只会产生与我们提供给它的数据一样好或一样差的结果。
数据理解基本上涉及分析和探索数据,以识别可能存在的任何模式或趋势。
数据理解阶段通常涉及以下步骤 −
-
Data Collection − 这涉及收集您将在分析中使用的相关数据。数据可以从各种来源收集,例如数据库、网站和 API。
-
Data Cleaning − 这涉及通过删除任何不相关或重复的数据以及处理缺失数据值来清理数据。应该以一种易于分析的方式格式化数据。
-
Data Exploration − 这涉及探索数据以识别存在的任何模式或趋势。可以使用各种统计技术(如直方图、散点图和相关性分析)来完成此操作。
-
Data Visualization − 这涉及创建数据的可视化表示形式,以帮助您更好地理解它。可以使用图形、图表和地图等工具来完成此操作。
-
Data Preprocessing − 这涉及转换数据以使其适合机器学习算法使用。这可能包括缩放数据、将其转换为不同的格式或降低其维度。
Understand the Data before Uploading It in ML Projects
在将数据上传到我们的 ML 项目之前了解我们的数据出于以下几个原因非常重要 −
Identify Data Quality Issues
通过了解您的数据,您可以识别数据质量问题,例如可能影响您的 ML 模型性能的缺失值、异常值、不正确的 data 类型和不一致性。通过解决这些问题,您可以提高模型的质量和准确性。
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
了解我们为机器学习项目准备的行列数据量始终是一个好习惯。背后的原因是 −
-
假设如果我们有太多行和列,那么运行算法和训练模型将需要很长时间。
-
假设如果我们有太少的行和列,那么我们就没有足够的数据来很好地训练模型。
以下是通过在 Pandas 数据框架中打印 shape 属性来实现的 Python 脚本。我们将对 iris 数据集进行实现以获取其中的行数和列数。
Getting Each Attribute’s Data Type
了解每个属性的数据类型是另一个好习惯。背后的原因是,根据要求,有时我们可能需要将一种数据类型转换为另一种数据类型。例如,我们可能需要将字符串转换为浮点数或整数来表示分类或序数。我们可以通过查看原始数据来了解属性的数据类型,但另一种方法是使用 Pandas DataFrame 的 dtypes 属性。在 dtypes 属性的帮助下,我们可以对每个属性的数据类型进行分类。借助以下 Python 脚本可以理解 −
Statistical Summary of Data
我们讨论了 Python 配方以获取数据的形状,即行数和列数,但很多时候我们需要查看该数据形状的摘要。这可以通过 Pandas DataFrame 的 describe() 函数来完成,该函数进一步提供每个数据属性的以下 8 个统计属性 −
-
Count
-
Mean
-
Standard Deviation
-
Minimum Value
-
Maximum value
-
25%
-
Median i.e. 50%
-
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
两个变量之间的关系称为相关性。在统计学中,计算相关性的最常用方法是皮尔逊相关系数。它可以具有以下三个值 −
-
Coefficient value = 1 − 它表示变量之间完全 positive 相关。
-
Coefficient value = -1 − 它表示变量之间完全 negative 相关。
-
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
偏度可以定义为一个假定为高斯分布但看起来已向另一个方向扭曲或偏移,或朝左或朝右的分布。审阅属性的偏度至关重要,原因如下所述−
-
数据中出现偏度需要在数据准备阶段进行校正,以便我们从模型中获得更高精度。
-
大多数 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,则表示偏差较小。