【技术专题】Scikit-learn Python机器学习 - 特征工程之数据集

0 阅读10分钟

大家好,我是锋哥。最近连载更新《Scikit-learn Python机器学习》技术专题。 image.png 本课程主要讲解基于Scikit-learn的Python机器学习知识,包括机器学习概述,特征工程(数据集,特征抽取,特征预处理,特征降维等),分类算法(K-临近算法,朴素贝叶斯算法,决策树等),回归与聚类算法(线性回归,欠拟合,逻辑回归与二分类,K-means算法)等。 同时也配套视频教程《Scikit-learn Python机器学习 视频教程》

特征工程 是使用领域知识来从原始数据中创建特征(或称变量),使机器学习算法能够更有效地工作,从而提升模型性能的过程。

你可以把它想象成 为模型准备和烹饪食材

  • 原始数据 = 生的、未处理的食材(如整条鱼、未洗的蔬菜、未去壳的鸡蛋)
  • 特征工程 = 洗菜、切菜、调味、搭配的烹饪过程
  • 机器学习模型 = 食客(它只能吃你准备好的食物)
  • 模型性能 = 菜肴最终的味道

即使你请来世界上最好的厨师(最先进的模型),如果给你的食材是没洗没切的(糟糕的特征),他也很难做出一流的美食。反之,优质的食材处理(好的特征工程)即使配上一个普通的厨师(简单的模型,如线性回归),也能做出非常可口的菜肴。

一句话总结:特征工程是将原始数据转换为能更好地表示预测问题的特征,从而改善机器学习模型性能的过程。

数据集介绍

了解机器学习数据集确实是上手实践的关键一步。我会为你梳理机器学习数据集的常见类型、一些经典和值得关注的新数据集,以及如何选择和使用数据集的基本建议。让我用一个表格来汇总这些信息,方便你快速了解:

类型数据集名称简介典型任务获取方式/备注
经典多维数据Iris包含3种鸢尾花的4个特征分类常用于教学和算法验证
Boston Housing包含506个样本,每个样本有13个特征回归预测房价
图像与视觉MNIST包含70,000张手写数字图像分类深度学习中最经典的图像分类数据集之一
CIFAR-10包含60,000张32x32的彩色图片,分为10个类别分类深度学习中常用的图像分类数据集之一
ImageNet包含超过1400万张标注图像分类、目标检测深度学习中最为常用的图像分类数据集之一
文本与自然语言IMDB Movie Reviews包含电影评论及情感标签情感分析用于情感分析,包含正面和负面评论,适合文本分类
新兴与领域特定EcomMMMU电商多模态数据集,406K样本,899万图像,关注视觉效用多模态理解研究表明图像并非总是提升模型性能
ECD高质量合成图表数据集,10k+图表,300k+QA对,提升图表理解图表理解与推理包含复杂的推理类问题
Orange Fruit Diseases橙子病害图像数据集,包含多种疾病类别图像分类(农业)可用于精准农业研究
Taxol Exposure Cell Images显示不同浓度Taxol处理下C6胶质瘤细胞的显微镜图像数据集图像分类(医疗)用于自动化形态学分析,支持生物医学研究

🧠 如何选择合适的数据集

面对众多的数据集,你可以参考以下几点来选择:

  1. 明确任务目标:你的项目要解决的是什么问题?是分类、回归、聚类,还是图像识别、自然语言处理?这直接决定了你需要什么样的数据。

  2. 评估数据质量与规模

    • 质量:数据是否准确完整(缺失值少)、一致(格式统一)?高质量的数据是模型效果的基石。
    • 规模:数据量是否足够支持模型学习?同时,数据是否具有多样性,能否覆盖问题场景的各个方面,以减少模型过拟合的风险。
  3. 考虑数据标注与平衡

    • 标注:对于监督学习,高质量的标注至关重要。对于无监督学习,则更关注数据内在的结构和规律。
    • 平衡:对于分类任务,要警惕类别不平衡问题。即某些类别的样本数量远多于其他类别,这可能导致模型预测偏向多数类。
  4. 关注数据获取与合规

    • 数据是否易于获取?是否开源?以及其许可证是否允许你的使用方式(如商业用途)。
    • 务必注意数据隐私伦理问题,确保数据来源合法合规。
  5. 数据预处理需求:初步判断数据是否需要以及能否进行有效的清洗转换增强

🔍 获取数据集的途径

  • 主流平台

    • Kaggle Datasets:包含大量社区上传的数据集,覆盖各种领域和类型。www.kaggle.com/datasets
    • UCI Machine Learning Repository:加州大学欧文分校,历史悠久的经典数据集集合,非常适合学术研究和入门。archive.ics.uci.edu/
    • TensorFlow Datasets / Hugging Face Datasets:提供了便捷的API供用户快速加载和使用多种常见数据集。
  • 领域特定来源:关注特定领域的会议、期刊或机构发布的数据集,如计算机视觉领域的ImageNetMS COCO,自然语言处理领域的 GLUE(未在搜索结果中提及,但为重要基准)等。

  • 政府与科研机构开放数据:许多政府和科研机构会开放数据,例如Data.gov中国国家统计局等。

Scikit-learn自带的数据集

Scikit-learn 提供了一些经典且实用的内置数据集,非常适合机器学习入门练习和快速验证算法模型。由于搜索结果中的详细信息有限,我会结合自己的知识,用一个表格来汇总这些数据集的主要信息,希望能帮你更好地了解和选用:

数据集名称主要用途样本数量特征数量目标/标签说明备注
鸢尾花 (Iris)分类15043种鸢尾花品种 (setosa, versicolor, virginica)非常经典的多分类入门数据集,数据均衡,特征为花卉的测量数据。12
手写数字 (Digits)分类1797640-9的数字每个特征是一个8x8像素图像的灰度值,用于图像识别入门。125
乳腺癌 (Breast Cancer)分类(二分类)56930恶性肿瘤 (0) 或良性肿瘤 (1)医学诊断相关,特征源自细胞核的数字化图像。135
葡萄酒 (Wine)分类178133种葡萄酒产地源自化学分析,特征包括酒精度、酚类、颜色强度等。1
波士顿房价 (Boston Housing)回归50613房屋价格的中位数 (单位:千美元)注意:此数据集因伦理问题已在 scikit-learn 0.24 及更高版本中弃用。6
糖尿病 (Diabetes)回归44210疾病进展的定量测量生理指标特征。134
体能训练 (Linnerud)多输出回归2033项生理指标(如体重、腰围)包含3个运动特征和3个生理目标值,适用于多输出回归任务。14

Scikit-learn加载数据集

Scikit-learn 数据集 API 概览

Scikit-learn 的数据集接口主要分为三类,对应三种不同的函数:

函数类型前缀说明经典示例
加载小型数据集load_*加载内置的、小型标准数据集,无需下载。load_iris(), load_digits()
下载大型数据集fetch_*从网络仓库下载更大、更复杂的数据集。fetch_california_housing()
生成人造数据集make_*根据特定模型生成可控的合成数据集,用于测试。make_classification()

1. 加载小型数据集 (load_*)

这些函数直接返回一个 Bunch 对象,这是一个类似字典的对象,具有以下重要属性:

  • data: 特征数据数组(X)
  • target: 标签数组(y)
  • feature_names: 特征名称列表
  • target_names: 目标标签名称列表
  • DESCR: 数据集的完整描述
  • filename: 数据文件的路径

示例:加载鸢尾花 (Iris) 数据集

image.png

from sklearn.datasets import load_iris
​
if __name__ == '__main__':
    # 加载鸢尾花数据集
    iris = load_iris()
    print('鸢尾花数据集:', iris)
    print('数据集描述:', iris['DESCR'])
    print('特征名称:', iris.feature_names)
    print('特征数据值:', iris.data)
    print('特征数据形状:', iris.data.shape)
    print('目标名称:', iris.target_names)
    print('目标值:', iris.target)

数学知识标准差:

标准差(Standard Deviation,SD),是一个统计学中的专有名词,用于描述数据的离散程度的统计量。标准差也被称为标准偏差,或者实验标准差 。一般而言,标准差越小,表明数据越聚集;标准差越大,表明数据越离散。

image.png

(快速理解可以参考 抖音-杨老师讲数据分析 关于标准差视频)

离散的概念:

离散在数学和计算机科学中主要指不连续、可分离的元素或结构,与连续相对,常见于离散数学、数据处理等领域。

数据集的划分

我们需要把数据集进行划分,一部分用于训练构建模型,另外一部分用于测试。常见划分比例8:2,7:3,或者75%:25%。

train_test_split() 是 Scikit-learn 中最常用的数据集划分方法之一,用于将数据集随机划分为训练子集和测试子集。这个方法简单易用,但功能强大,提供了多个参数来满足不同的数据划分需求。

基本语法:

X_train, X_test, y_train, y_test = train_test_split(
    X, y, 
    test_size=None, 
    train_size=None, 
    random_state=None, 
    shuffle=True, 
    stratify=None
)

参数详解:

  1. X 和 y
  • X: 特征数据集,通常是二维数组或矩阵
  • y: 目标变量,通常是一维数组
  1. test_size 和 train_size
  • test_size: 测试集的比例或数量

    • 浮点数 (0.0-1.0): 表示测试集占总数据集的比例
    • 整数: 表示测试集的绝对样本数
    • 默认: None (使用补集,即 1 - train_size)
  • train_size: 训练集的比例或数量

    • 浮点数 (0.0-1.0): 表示训练集占总数据集的比例
    • 整数: 表示训练集的绝对样本数
    • 默认: None (使用补集,即 1 - test_size)

注意:test_sizetrain_size 只需指定一个即可。

  1. random_state
  • 整数: 设置随机种子,确保每次划分结果相同
  • 默认: None (每次划分结果不同)
  • 在需要可重复实验时非常有用
  1. shuffle
  • 布尔值: 是否在划分前打乱数据
  • 默认: True
  • 对于时间序列数据,通常设置为 False
  1. stratify
  • 数组-like 对象: 用于分层抽样,保持划分后各类别比例与原始数据集相同
  • 默认: None (不进行分层抽样)
  • 常用于分类问题中类别不平衡的情况

使用实例:

from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
​
if __name__ == '__main__':
    # 加载鸢尾花数据集
    iris = load_iris()
    print('鸢尾花数据集:', iris)
    print('数据集描述:', iris['DESCR'])
    print('特征名称:', iris.feature_names)
    print('特征数据值:', iris.data)
    print('特征数据形状:', iris.data.shape)
    print('目标名称:', iris.target_names)
    print('目标值:', iris.target)
​
    # 数据集划分
    x_train, x_test, y_train, y_test = train_test_split(iris.data, iris.target, test_size=0.2)
    print("训练集的特征值:", x_train, x_train.shape)
    print("训练集的目标值:", y_train, len(y_train))
    print("测试集的特征值:", x_test, x_test.shape)
    print("测试集的目标值:", y_test, len(y_test))

运行输出:

image.png