大家好,我是锋哥。最近连载更新《Scikit-learn Python机器学习》技术专题。 本课程主要讲解基于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胶质瘤细胞的显微镜图像数据集 | 图像分类(医疗) | 用于自动化形态学分析,支持生物医学研究 |
🧠 如何选择合适的数据集
面对众多的数据集,你可以参考以下几点来选择:
-
明确任务目标:你的项目要解决的是什么问题?是分类、回归、聚类,还是图像识别、自然语言处理?这直接决定了你需要什么样的数据。
-
评估数据质量与规模:
- 质量:数据是否准确、完整(缺失值少)、一致(格式统一)?高质量的数据是模型效果的基石。
- 规模:数据量是否足够支持模型学习?同时,数据是否具有多样性,能否覆盖问题场景的各个方面,以减少模型过拟合的风险。
-
考虑数据标注与平衡:
- 标注:对于监督学习,高质量的标注至关重要。对于无监督学习,则更关注数据内在的结构和规律。
- 平衡:对于分类任务,要警惕类别不平衡问题。即某些类别的样本数量远多于其他类别,这可能导致模型预测偏向多数类。
-
关注数据获取与合规:
- 数据是否易于获取?是否开源?以及其许可证是否允许你的使用方式(如商业用途)。
- 务必注意数据隐私和伦理问题,确保数据来源合法合规。
-
数据预处理需求:初步判断数据是否需要以及能否进行有效的清洗、转换或增强。
🔍 获取数据集的途径
-
主流平台:
- Kaggle Datasets:包含大量社区上传的数据集,覆盖各种领域和类型。www.kaggle.com/datasets
- UCI Machine Learning Repository:加州大学欧文分校,历史悠久的经典数据集集合,非常适合学术研究和入门。archive.ics.uci.edu/
- TensorFlow Datasets / Hugging Face Datasets:提供了便捷的API供用户快速加载和使用多种常见数据集。
-
领域特定来源:关注特定领域的会议、期刊或机构发布的数据集,如计算机视觉领域的ImageNet、MS COCO,自然语言处理领域的 GLUE(未在搜索结果中提及,但为重要基准)等。
-
政府与科研机构开放数据:许多政府和科研机构会开放数据,例如Data.gov、中国国家统计局等。
Scikit-learn自带的数据集
Scikit-learn 提供了一些经典且实用的内置数据集,非常适合机器学习入门练习和快速验证算法模型。由于搜索结果中的详细信息有限,我会结合自己的知识,用一个表格来汇总这些数据集的主要信息,希望能帮你更好地了解和选用:
| 数据集名称 | 主要用途 | 样本数量 | 特征数量 | 目标/标签说明 | 备注 |
|---|---|---|---|---|---|
| 鸢尾花 (Iris) | 分类 | 150 | 4 | 3种鸢尾花品种 (setosa, versicolor, virginica) | 非常经典的多分类入门数据集,数据均衡,特征为花卉的测量数据。12 |
| 手写数字 (Digits) | 分类 | 1797 | 64 | 0-9的数字 | 每个特征是一个8x8像素图像的灰度值,用于图像识别入门。125 |
| 乳腺癌 (Breast Cancer) | 分类(二分类) | 569 | 30 | 恶性肿瘤 (0) 或良性肿瘤 (1) | 医学诊断相关,特征源自细胞核的数字化图像。135 |
| 葡萄酒 (Wine) | 分类 | 178 | 13 | 3种葡萄酒产地 | 源自化学分析,特征包括酒精度、酚类、颜色强度等。1 |
| 波士顿房价 (Boston Housing) | 回归 | 506 | 13 | 房屋价格的中位数 (单位:千美元) | 注意:此数据集因伦理问题已在 scikit-learn 0.24 及更高版本中弃用。6 |
| 糖尿病 (Diabetes) | 回归 | 442 | 10 | 疾病进展的定量测量 | 生理指标特征。134 |
| 体能训练 (Linnerud) | 多输出回归 | 20 | 3 | 3项生理指标(如体重、腰围) | 包含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) 数据集
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),是一个统计学中的专有名词,用于描述数据的离散程度的统计量。标准差也被称为标准偏差,或者实验标准差 。一般而言,标准差越小,表明数据越聚集;标准差越大,表明数据越离散。
(快速理解可以参考 抖音-杨老师讲数据分析 关于标准差视频)
离散的概念:
离散在数学和计算机科学中主要指不连续、可分离的元素或结构,与连续相对,常见于离散数学、数据处理等领域。
数据集的划分
我们需要把数据集进行划分,一部分用于训练构建模型,另外一部分用于测试。常见划分比例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
)
参数详解:
- X 和 y
- X: 特征数据集,通常是二维数组或矩阵
- y: 目标变量,通常是一维数组
- 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_size 和 train_size 只需指定一个即可。
- random_state
- 整数: 设置随机种子,确保每次划分结果相同
- 默认: None (每次划分结果不同)
- 在需要可重复实验时非常有用
- shuffle
- 布尔值: 是否在划分前打乱数据
- 默认: True
- 对于时间序列数据,通常设置为 False
- 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))
运行输出: