1. 初识机器学习数据集

刚接触机器学习时,最让我头疼的就是找不到合适的数据集。记得第一次尝试写分类算法时,我花了整整三天在网上搜罗各种数据文件,结果不是格式混乱就是字段缺失。后来才发现,Python生态早就为我们准备好了开箱即用的解决方案。

数据集之于机器学习,就像食材之于厨师。没有好的数据,再精巧的算法也难有作为。在Python中,我们主要使用两类经典数据集:

  • sklearn内置数据集 :像随身携带的瑞士军刀,随时可用
  • UCI公共数据集 :如同专业食材市场,选择丰富但需要简单处理

初学者常犯的错误是直接扎进复杂的数据采集和清洗工作,其实应该先从标准数据集入手。我建议的学习路径是:先用sklearn内置数据掌握基础操作,再用UCI数据练习完整流程,最后再挑战自定义数据。

2. sklearn内置数据集实战

2.1 数据集全家福

sklearn.datasets模块就像个百宝箱,我最常使用的有三类数据集:

from sklearn import datasets

# 小型数据集(内存加载)
iris = datasets.load_iris()  # 鸢尾花分类数据集
boston = datasets.load_boston()  # 波士顿房价回归数据集

# 大型数据集(需下载)
newsgroups = datasets.fetch_20newsgroups()  # 文本分类数据集

# 生成数据集(自定义参数)
X, y = datasets.make_classification(n_samples=1000, n_features=20)  # 自定义分类数据

每个数据集都是Bunch对象,包含以下关键属性:

  • data : 特征矩阵(numpy数组)
  • target : 标签数组
  • feature_names : 特征说明
  • DESCR : 数据集文档

2.2 鸢尾花数据集深度探索

以经典的鸢尾花数据集为例,我们来解剖一只完整的"麻雀":

import matplotlib.pyplot as plt
from sklearn.datasets import load_iris

iris = load_iris()
print(f"特征矩阵形状:{iris.data.shape}")  # (150, 4)
print(f"标签类别:{iris.target_names}")  # ['setosa', 'versicolor', 'virginica']

# 绘制特征分布图
plt.figure(figsize=(15, 8))
for i in range(4):
    plt.subplot(2, 2, i+1)
    plt.hist(iris.data[:, i], bins=30)
    plt.title(iris.feature_names[i])
plt.tight_layout()

通过这个简单的探索,我们能立即发现:

  • 样本量:150条记录
  • 特征数:4个(花萼/花瓣的长宽)
  • 分类数:3种鸢尾花
  • 特征分布:基本符合正态分布,无明显异常值

2.3 手写数字识别实战

MNIST的简化版——load_digits()数据集包含1797个8x8像素的手写数字:

from sklearn.datasets import load_digits

digits = load_digits()
print(f"图像数据形状:{digits.images.shape}")  # (1797, 8, 8)

# 可视化前64个数字
plt.figure(figsize=(10, 8))
for i in range(64):
    plt.subplot(8, 8, i+1)
    plt.imshow(digits.images[i], cmap='binary')
    plt.axis('off')

处理图像数据时要注意:

  1. 像素值范围是0-16,需要归一化
  2. images和data是相同数据的两种形式(前者保持图像结构)
  3. 适合练习降维算法(PCA/t-SNE)

3. UCI数据集获取与处理

3.1 UCI数据宝库介绍

UCI机器学习库就像数据科学的"新华字典",包含500+个跨领域数据集。我常用的获取方式:

import pandas as pd
from ucimlrepo import fetch_ucirepo 

# 获取葡萄酒数据集
wine = fetch_ucirepo(id=109) 
df = pd.DataFrame(wine.data.features, columns=wine.data.feature_names)
df['target'] = wine.data.targets

UCI数据集通常需要处理以下问题:

  • 缺失值(标记为?或NaN)
  • 非数值特征(需编码)
  • 不同特征的量纲差异

3.2 心脏病数据集实战

以UCI的Cleveland心脏病数据集为例:

# 原始数据预处理
url = "http://archive.ics.uci.edu/ml/machine-learning-databases/heart-disease/processed.cleveland.data"
heart = pd.read_csv(url, header=None, na_values='?')

# 添加列名
columns = ['age', 'sex', 'cp', 'trestbps', 'chol', 'fbs', 
           'restecg', 'thalach', 'exang', 'oldpeak', 'slope', 
           'ca', 'thal', 'target']
heart.columns = columns

# 处理缺失值
heart = heart.dropna().reset_index(drop=True)
print(f"处理后数据形状:{heart.shape}")

关键处理步骤:

  1. 识别特殊缺失标记(如?)
  2. 处理分类变量(如thal列)
  3. 目标变量二值化(0表示无疾病)

3.3 数据标准化技巧

UCI数据集常需要特征缩放:

from sklearn.preprocessing import StandardScaler

scaler = StandardScaler()
numeric_cols = ['age', 'trestbps', 'chol', 'thalach', 'oldpeak']
heart[numeric_cols] = scaler.fit_transform(heart[numeric_cols])

4. 高级数据集操作

4.1 自定义数据生成

当标准数据集不能满足需求时,可以生成模拟数据:

from sklearn.datasets import make_classification

# 生成非线性可分数据
X, y = make_classification(n_samples=1000, n_features=2, n_informative=2,
                          n_redundant=0, n_clusters_per_class=1,
                          flip_y=0.1, class_sep=0.8, random_state=42)

# 生成环形数据
from sklearn.datasets import make_circles
X_circle, y_circle = make_circles(n_samples=500, noise=0.1, factor=0.5)

4.2 数据集划分策略

正确的数据划分能避免过拟合:

from sklearn.model_selection import train_test_split

X_train, X_test, y_train, y_test = train_test_split(
    iris.data, iris.target, 
    test_size=0.2, 
    stratify=iris.target,  # 保持类别比例
    random_state=42
)

对于时间序列数据,需要使用TimeSeriesSplit:

from sklearn.model_selection import TimeSeriesSplit

tscv = TimeSeriesSplit(n_splits=5)
for train_index, test_index in tscv.split(X):
    print(f"训练集:{len(train_index)},测试集:{len(test_index)}")

5. 数据可视化探索

5.1 特征关联分析

使用seaborn快速分析特征关系:

import seaborn as sns

iris_df = pd.DataFrame(iris.data, columns=iris.feature_names)
iris_df['target'] = iris.target
sns.pairplot(iris_df, hue='target', palette='husl')

5.2 降维可视化

高维数据可以通过PCA或t-SNE降维:

from sklearn.decomposition import PCA

pca = PCA(n_components=2)
X_pca = pca.fit_transform(iris.data)

plt.scatter(X_pca[:, 0], X_pca[:, 1], c=iris.target, cmap='viridis')
plt.xlabel('PC1')
plt.ylabel('PC2')

6. 避坑指南

在多年使用数据集的经历中,我总结出这些常见陷阱:

  1. 数据泄露 :在划分数据前进行标准化(应该只在训练集上fit)
  2. 类别不平衡 :UCI的Adult数据集收入分类中高收入样本仅占25%
  3. 过时数据 :部分UCI数据集多年未更新(如房价数据)
  4. 单位不一致 :某些数据集混合使用公制/英制单位

一个实用的数据检查清单:

  • [ ] 检查缺失值比例
  • [ ] 验证特征取值范围
  • [ ] 分析类别分布
  • [ ] 检查时间相关性
  • [ ] 确认数据采集方式

记得第一次用波士顿房价数据集时,我没注意到'B'列(黑人比例)的取值范围是0-100还是0-1,导致模型权重完全失真。现在我会先用describe()快速检查:

print(boston_df.describe().loc[['min', 'max']])
Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐