在 Python 中使用描述性统计理解您的机器学习数据

您必须理解您的数据才能获得最佳结果。

在这篇文章中,您将发现7个可以在Python中使用的技巧,以了解更多关于您的机器学习数据。

我的新书《使用Python进行机器学习精通》可助您“启动您的项目”,其中包含分步教程和所有示例的Python源代码文件。

让我们开始吧。

  • **2018 年 3 月更新**:添加了下载数据集的备用链接,因为原始链接似乎已被删除。
Understand Your Machine Learning Data With Descriptive Statistics in Python

在 Python 中使用描述性统计理解您的机器学习数据
照片由passer-by拍摄,保留部分权利。

Python技巧,助您理解机器学习数据

本节列出了7个您可以用来更好地理解机器学习数据的技巧。

每个技巧都通过加载Pima印第安人糖尿病分类数据集进行演示。

打开您的Python交互式环境,并逐一尝试每个技巧。

需要 Python 机器学习方面的帮助吗?

参加我为期 2 周的免费电子邮件课程,探索数据准备、算法等等(附带代码)。

立即点击注册,还将免费获得本课程的 PDF 电子书版本。

1. 快速浏览您的数据

没有什么能替代直接查看原始数据。

查看原始数据可以揭示您无法通过其他方式获得的洞察力。它还可以播下种子,这些种子可能会在以后发展成如何更好地预处理和处理机器学习任务数据的想法。

您可以使用Pandas DataFrame上的head()函数查看数据的前20行。

您可以看到第一列列出了行号,这对于引用特定观测值非常方便。

2. 数据的维度

您必须非常清楚您有多少数据,包括行数和列数。

  • 行数过多可能会导致算法训练时间过长。行数过少可能导致数据不足以训练算法。
  • 特征过多,一些算法可能会因维度诅咒而分散注意力或性能不佳。

您可以通过打印Pandas DataFrame的形状属性来查看数据集的形状和大小。

结果按行和列列出。您可以看到数据集有768行和9列。

3. 每个属性的数据类型

每个属性的类型都很重要。

字符串可能需要转换为浮点值或整数以表示分类或序数值。

您可以通过如上所示的原始数据概览来了解属性的类型。您还可以使用dtypes属性列出DataFrame用于表征每个属性的数据类型。

您可以看到大多数属性是整数,而“mass”和“pedi”是浮点值。

4. 描述性统计

描述性统计可以为您提供每个属性形状的深刻见解。

通常,您可以创建比您有时间审查的更多摘要。Pandas DataFrame上的describe()函数列出了每个属性的8个统计属性

  • 计数
  • 平均值
  • 标准差
  • 最小值
  • 第25百分位数
  • 第50百分位数(中位数)
  • 第75百分位数
  • 最大值

您可以看到确实获得了大量数据。您会注意到代码中调用了一些pandas.set_option()来改变数字的精度和输出的首选宽度。这是为了让这个例子更具可读性。

在以这种方式描述数据时,值得花一些时间并回顾结果中的观测值。这可能包括缺失数据的“NA”值的存在或属性的令人惊讶的分布。

5. 类别分布(仅限分类)

在分类问题中,您需要了解类别值是否平衡。

高度不平衡的问题(一个类别比另一个类别有更多的观测值)很常见,可能需要在项目的数据准备阶段进行特殊处理。

您可以快速了解Pandas中类别属性的分布。

您可以看到,类别0(未发病糖尿病)的观测值数量几乎是类别1(发病糖尿病)的两倍。

6. 属性之间的相关性

相关性指的是两个变量之间的关系以及它们是否会一起变化。

计算相关性最常用的方法是皮尔逊相关系数,它假设所涉及的属性呈正态分布。相关系数为-1或1分别表示完全负相关或正相关。而值为0则表示完全没有相关性。

如果数据集中存在高度相关的属性,一些机器学习算法(如线性回归和逻辑回归)的性能可能会很差。因此,检查数据集中所有属性的成对相关性是一个好主意。您可以使用Pandas DataFrame的corr()函数计算相关矩阵。

该矩阵在顶部和侧面列出所有属性,以显示所有属性对之间的相关性(两次,因为矩阵是对称的)。您可以看到矩阵从左上角到右下角的对角线显示了每个属性与其自身的完美相关性。

7. 单变量分布的偏度

偏度指的是假定为高斯分布(正态或钟形曲线)的分布,它向一个方向或另一个方向移动或挤压。

许多机器学习算法都假定高斯分布。了解属性存在偏度可能允许您执行数据准备以纠正偏度,并随后提高模型的准确性。

您可以使用Pandas DataFrame上的skew()函数计算每个属性的偏度。

偏度结果显示正(右)或负(左)偏度。值越接近零,偏度越小。

更多技巧

这只是您可以在机器学习数据上用于分类和回归的最有用摘要和描述性统计数据的一部分。

您可以计算许多其他统计数据。

当您开始处理新的数据集时,是否有您喜欢计算和审查的特定统计数据?请留言告诉我。

值得记住的提示

本节提供了一些在使用摘要统计数据审查数据时需要记住的提示。

  • 审查数字。仅仅生成摘要统计数据是不够的。花点时间暂停,阅读并认真思考您看到的数字。
  • 追问原因。审查您的数字并提出大量问题。您看到特定数字的原因和方式是什么?思考这些数字如何与一般问题领域以及观测值所涉及的特定实体相关联。
  • 写下想法。写下您的观察和想法。保留一个小文本文件或记事本,记下所有关于变量可能如何关联、数字意味着什么以及以后尝试的技术的想法。您现在趁数据新鲜时写下的东西,在以后尝试新事物时将非常有价值。

总结

在这篇文章中,您发现了在开始机器学习项目之前描述数据集的重要性。

您发现了7种使用Python和Pandas汇总数据集的不同方法

  1. 快速浏览您的数据
  2. 数据的维度
  3. 数据类型
  4. 类别分布
  5. 数据摘要
  6. 相关性
  7. 偏度

行动步骤

  1. 打开您的Python交互式环境。
  2. 输入或复制粘贴每个技巧并查看其工作方式。
  3. 在评论中告诉我您的进展。

您对Python、Pandas或本文中的技巧有任何疑问吗?请留言提问,我将尽力回答。

发现 Python 中的快速机器学习!

Master Machine Learning With Python

在几分钟内开发您自己的模型

...只需几行 scikit-learn 代码

在我的新电子书中学习如何操作
精通 Python 机器学习

涵盖自学教程端到端项目,例如
加载数据可视化建模调优等等...

最终将机器学习带入
您自己的项目

跳过学术理论。只看结果。

查看内容

对《在Python中使用描述性统计理解您的机器学习数据》的40条回复

  1. M. Wilson 2016年8月28日 下午8:23 #

    精彩的文章。我非常感谢这个网站。请继续努力。
    加油!

  2. Mayur Agarwal 2017年4月19日 下午10:11 #

    嗨,Jason。

    感谢您的解释。

    这篇文章非常清晰,让我对很多事情有了很好的理解。

    也许我有一个疑问,就是不明白每一步的目的,就像它在数据方面传达了什么信息。例如,“描述性统计”给出了很多关于数据的输出,但我从中理解了什么呢?

    希望得到一些澄清。

    • Jason Brownlee 2017年4月20日 上午9:26 #

      我们正在理解每个特征的单变量分布。

      这有助于数据准备和算法选择。

      • Hamza 2020年2月13日 上午7:21 #

        先生,您能解释一下它如何帮助我们选择算法吗?

        • Jason Brownlee 2020年2月13日 下午1:22 #

          例如,高斯分布可能表明使用线性模型。偏斜的高斯分布可能建议进行幂变换。如果存在异常值,可以将其删除。指数分布可以进行幂变换。离散整数值可能暗示使用决策树,不同的单位可能建议在knn和加权和算法之前进行缩放,等等。

  3. Neeraj Wagh 2017年5月2日 下午4:48 #

    嘿,杰森,一如既往,这篇帖子简洁而高效。

    关于如何对二元特征进行探索性分析有什么建议吗?

    请不要停止您的工作,它非常有帮助。 🙂

    • Jason Brownlee 2017年5月3日 上午7:32 #

      谢谢,很高兴听到这个消息,Neeraj。

      对二元和分类变量的一个好的开始是查看每个级别的比例。

  4. Rizwan Mian, 博士 2017年8月1日 上午11:55 #

    “当您开始处理新的数据集时,是否有您喜欢计算和审查的特定统计数据?”

    > 除了.describe()给出的描述性统计数据,我还喜欢计算
    ——中位数
    ——95百分位数

  5. Sarra,数据科学家 2017年10月2日 下午10:38 #

    您好,我想感谢您的有用且解释清晰的文章,特别是这一篇。但我想问您关于不平衡数据和重采样有效性,如果您不介意的话。

    正如您在另一篇文章中指出的那样,在某些情况下,不平衡是如此自然,因为在我的情况下,我有两个主要类别,数据分布为(A:6418,B:81),类别B是一种罕见的现象,我们正在寻求理解其原因。

    我对B类更感兴趣,但我担心重采样对我的数据改变了很多,因为我注意到在对A类进行欠采样和对B类进行过采样以在最终数据集中获得1000:1000个样本后,相关性发生了变化。

    我的6个特征与目标特征的总相关性从0.14变为0.67,我觉得这有些人工,不切实际。

    如果您能帮助我理解这一点,我将不胜感激。感谢这个精彩的网站 🙂

  6. Aman Tandon 2018年3月31日 下午9:22 #

    我正在构建一个线性回归模型,并使用一个CSV文件数据集,其中包含13列和5299行的一些数字。我按照您的教程应用了偏度函数和相关性,但它显示一个空数组,而且在数据类型部分,所有13列都显示为对象。请帮助我

    • Jason Brownlee 2018年4月1日 上午5:49 #

      也许可以尝试将您的代码和数据发布到stackoverflow?

  7. Vineeth 2018年6月21日 下午4:20 #

    嗨,Jason!
    很喜欢这篇博文!您组织得非常好。感谢所有的指导。

    我有一个小问题。正如您在数据类型部分提到的,许多机器学习算法将数值属性作为输入。有没有什么具体的原因说明它们为什么这样做?

    • Jason Brownlee 2018年6月21日 下午5:00 #

      不完全是,更多的是工程原因,以便相同的API可以用于许多算法。

      许多算法原则上不关心数据类型,例如决策树、knn等。

  8. Leni 2018年6月23日 下午2:53 #

    尊敬的先生,

    我是Python的新手。我很幸运能找到这个网站并开始学习。我刚刚根据您上面的课程做了一个小练习(我尝试用numpy.loadtxt加载数据)

    import pandas
    import numpy
    names = [‘preg’, ‘plas’, ‘pres’, ‘skin’, ‘test’, ‘mass’, ‘pedi’, ‘age’, ‘class’]
    dataset = numpy.loadtxt(“pima-indians-diabetes.csv”, delimiter=”,”)
    description = dataset.dtypes()
    print(description)

    然而,出现了一个错误,我不知道如何纠正。
    “AttributeError: ‘numpy.ndarray’ object has no attribute ‘dtypes’ ”

    请帮助我。谢谢。

    • Jason Brownlee 2018年6月24日 上午7:30 #

      看起来您将Numpy数据加载示例与pandas探索示例混淆了。

      您可以将数据加载为pandas的DataFrame,或者将加载的numpy数组更改为DataFrame,以便调用dtypes()。

      • Leni 2018年6月25日 下午4:55 #

        非常感谢。您说得对。问题现在解决了。

  9. munaz 2018年8月30日 下午6:10 #

    你太棒了……非常感谢

  10. Mickel 2019年4月12日 上午12:01 #

    你好,

    我有一个项目的数据,我使用了偏度方法,但是一些数字达到了20多,一些数字保持在0.5。这到底意味着什么?

    我没有使用分类。我使用的是0-10之间的分数。这仍然是好的方法吗?或者有人对此有什么想法吗?请帮忙……

    问候……

    • Jason Brownlee 2019年4月12日 上午7:48 #

      也许可以尝试使用和不使用一些缩放/转换的模型,看看是否对模型性能有影响。

  11. Wing Tian 2019年5月14日 上午4:06 #

    嗨,Jason,

    我一如既往地喜欢您的教学方式。

    您能建议一些代码,让相关性更加可视化吗?仅凭数字,我认为很难阅读。但我知道,我们可以利用一些热力图。

    提前感谢您的帮助。

    • Jason Brownlee 2019年5月14日 上午7:52 #

      是的,您可以使用每对变量的散点图矩阵。

  12. THARUN KUMAR TALLAPALLI 2019年6月28日 下午8:07 #

    您的分析很好!
    如果我想知道有关特征的详细信息怎么办?
    DESCR在哪里使用?

    • Jason Brownlee 2019年6月29日 上午6:48 #

      抱歉,您具体是什么意思,能详细说明一下吗?

      什么是DESCR?是描述吗?

  13. Ahmad Abdalrada 2019年7月7日 上午7:26 #

    一切都好,非常感谢

  14. shadia 2020年2月1日 下午11:25 #

    谢谢杰森的帖子
    我想知道您是否可以帮助我
    我正在尝试构建一个随机森林模型
    我用pandas读取了一个csv数据集
    在将数据集分割成y和x之后,我尝试打印x列,但是出现了这个错误

    AttributeError: 'numpy.ndarray' object has no attribute 'columns'

    • Jason Brownlee 2020年2月2日 上午6:26 #

      看起来您正在尝试在numpy数组上调用.columns。您不能这样做。

      也许可以尝试使用您的数据的dataframe来运行相同的代码。

  15. KAPILA 2020年2月10日 下午9:58 #

    写得非常好,解释清晰。
    您能添加一些散点图、直方图等图表吗?

  16. Kavidha 2021年6月4日 上午4:35 #

    在机器学习中,有人说描述性分析是对整个数据集进行的,而另一些人说只对训练数据集进行。您能解释一下哪种方法是正确的吗?
    谢谢你。

  17. Mosam khan 2021年10月29日 上午2:13 #

    我喜欢您解释一切的方式,

    非常感谢您,亲爱的先生。

  18. PriyaK 2022年6月10日 上午4:46 #

    感谢您提供的数据准备分步过程。

    • James Carmichael 2022年6月10日 上午9:15 #

      非常欢迎您,PriyaK!感谢您的反馈和支持!

留下回复

Machine Learning Mastery 是 Guiding Tech Media 的一部分,Guiding Tech Media 是一家领先的数字媒体出版商,专注于帮助人们了解技术。访问我们的公司网站以了解更多关于我们的使命和团队的信息。