- 机器学习基础
- ML - 首页
- ML - 简介
- ML - 入门
- ML - 基本概念
- ML - 生态系统
- ML - Python 库
- ML - 应用
- ML - 生命周期
- ML - 技能要求
- ML - 实现
- ML - 挑战与常见问题
- ML - 局限性
- ML - 真实案例
- ML - 数据结构
- ML - 数学
- ML - 人工智能
- ML - 神经网络
- ML - 深度学习
- ML - 获取数据集
- ML - 分类数据
- ML - 数据加载
- ML - 数据理解
- ML - 数据准备
- ML - 模型
- ML - 监督学习
- ML - 无监督学习
- ML - 半监督学习
- ML - 强化学习
- ML - 监督学习与无监督学习
- 机器学习数据可视化
- ML - 数据可视化
- ML - 直方图
- ML - 密度图
- ML - 箱线图
- ML - 相关矩阵图
- ML - 散点矩阵图
- 机器学习统计学
- ML - 统计学
- ML - 均值、中位数、众数
- ML - 标准差
- ML - 百分位数
- ML - 数据分布
- ML - 偏度和峰度
- ML - 偏差和方差
- ML - 假设
- ML 中的回归分析
- ML - 回归分析
- ML - 线性回归
- ML - 简单线性回归
- ML - 多元线性回归
- ML - 多项式回归
- ML 中的分类算法
- ML - 分类算法
- ML - 逻辑回归
- ML - K 近邻 (KNN)
- ML - 朴素贝叶斯算法
- ML - 决策树算法
- ML - 支持向量机
- ML - 随机森林
- ML - 混淆矩阵
- ML - 随机梯度下降
- ML 中的聚类算法
- ML - 聚类算法
- ML - 基于中心点的聚类
- ML - K 均值聚类
- ML - K 中值聚类
- ML - 均值漂移聚类
- ML - 层次聚类
- ML - 基于密度的聚类
- ML - DBSCAN 聚类
- ML - OPTICS 聚类
- ML - HDBSCAN 聚类
- ML - BIRCH 聚类
- ML - 亲和传播
- ML - 基于分布的聚类
- ML - 凝聚层次聚类
- ML 中的降维
- ML - 降维
- ML - 特征选择
- ML - 特征提取
- ML - 后退消除法
- ML - 前向特征构造
- ML - 高相关性过滤器
- ML - 低方差过滤器
- ML - 缺失值比率
- ML - 主成分分析
- 强化学习
- ML - 强化学习算法
- ML - 利用与探索
- ML - Q 学习
- ML - REINFORCE 算法
- ML - SARSA 强化学习
- ML - 演员-评论家方法
- 深度强化学习
- ML - 深度强化学习
- 量子机器学习
- ML - 量子机器学习
- ML - 使用 Python 的量子机器学习
- 机器学习杂项
- ML - 性能指标
- ML - 自动工作流
- ML - 提升模型性能
- ML - 梯度提升
- ML - 自举汇聚 (Bagging)
- ML - 交叉验证
- ML - AUC-ROC 曲线
- ML - 网格搜索
- ML - 数据缩放
- ML - 训练和测试
- ML - 关联规则
- ML - Apriori 算法
- ML - 高斯判别分析
- ML - 成本函数
- ML - 贝叶斯定理
- ML - 精度和召回率
- ML - 对抗性
- ML - 堆叠
- ML - 时期
- ML - 感知器
- ML - 正则化
- ML - 过拟合
- ML - P 值
- ML - 熵
- ML - MLOps
- ML - 数据泄露
- ML - 机器学习的盈利模式
- ML - 数据类型
- 机器学习 - 资源
- ML - 快速指南
- ML - 速查表
- ML - 面试问题
- ML - 有用资源
- ML - 讨论
机器学习 - 数据理解
在处理机器学习项目时,通常我们会忽略两个最重要的部分,即数学和数据。数据理解在 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
从以上输出中,可以观察到正偏度或负偏度。如果值接近于零,则表示偏度较小。