三、数据集:机器学习的基石

1. sklearn 玩具数据集:快速入门的理想选择

1.1 玩具数据集的特点与价值

sklearn 内置的玩具数据集(Toy Datasets)是机器学习入门的绝佳资源。这类数据集通常具有以下特点:

  • 数据量小:样本数量通常在几十到几千之间,例如鸢尾花数据集仅包含 150 个样本,便于快速加载和处理。
  • 本地存储:无需联网即可直接通过sklearn.datasets模块调用,如load_iris()函数直接返回数据集对象。
  • 结构清晰:特征和标签明确,适合用于算法原理验证和可视化分析。
1.2 经典案例:鸢尾花数据集解析

鸢尾花数据集是分类任务的经典示例,包含 3 个类别(山鸢尾、变色鸢尾、维吉尼亚鸢尾),每个样本由 4 个特征描述(花萼长宽、花瓣长宽)。以下是加载和分析该数据集的完整流程:

from sklearn.datasets import load_iris

import pandas as pd

# 加载数据集

iris = load_iris()

X, y = iris.data, iris.target

# 数据整合与可视化

data = pd.DataFrame(X, columns=iris.feature_names)

data['target'] = y

data['target_name'] = data['target'].map(dict(zip(iris.target, iris.target_names)))

# 特征分布可视化

import seaborn as sns

import matplotlib.pyplot as plt

sns.pairplot(data, hue='target_name', height=2.5)

plt.show()

运行上述代码会生成特征关系矩阵图,清晰展示不同类别在各特征上的分布差异。例如,维吉尼亚鸢尾的花瓣长度明显大于其他两类,这为后续特征工程提供了直观依据。

1.3 其他常用玩具数据集

除鸢尾花外,sklearn 还提供了多种类型的玩具数据集:

  • 回归任务:波士顿房价数据集(load_boston())用于预测房价,包含 13 个特征和 1 个连续目标值。
  • 聚类任务:手写数字数据集(load_digits())包含 8x8 像素的手写数字图像,可用于无监督特征提取。
  • 多分类任务:葡萄酒数据集(load_wine())包含 13 个化学特征,用于区分 3 种葡萄酒类型。

2. sklearn 现实世界数据集:实战项目的数据源

2.1 现实世界数据集的特点

与玩具数据集相比,现实世界数据集(Real-world Datasets)具有以下特点:

  • 数据量大:样本数量通常在万级以上,例如 20 新闻组数据集包含近 2 万篇文档。
  • 网络获取:需通过网络下载,默认存储路径可通过datasets.get_data_home()查看。
  • 复杂性高:数据可能包含缺失值、噪声或高维特征,需进行复杂预处理。
2.2 典型案例:20 新闻组文本分类

20 新闻组数据集是文本分类的经典基准,包含 20 个主题的新闻文档。以下是加载和处理该数据集的关键步骤:

from sklearn.datasets import fetch_20newsgroups

# 加载训练集与测试集

train_data = fetch_20newsgroups(subset='train', remove=('headers', 'footers', 'quotes'))

test_data = fetch_20newsgroups(subset='test', remove=('headers', 'footers', 'quotes'))

# 文本特征提取(TF-IDF)

from sklearn.feature_extraction.text import TfidfVectorizer

vectorizer = TfidfVectorizer(max_df=0.95, min_df=2, max_features=1000)

X_train = vectorizer.fit_transform(train_data.data)

X_test = vectorizer.transform(test_data.data)

# 模型训练与评估

from sklearn.ensemble import RandomForestClassifier

from sklearn.metrics import classification_report

clf = RandomForestClassifier(n_estimators=100)

clf.fit(X_train, train_data.target)

y_pred = clf.predict(X_test)

print(classification_report(test_data.target, y_pred, target_names=train_data.target_names))

2.3 数据下载与缓存机制

现实世界数据集首次下载时会自动保存到本地缓存目录,后续调用无需重复下载。若需指定存储路径,可通过data_home参数实现:

news = fetch_20newsgroups(data_home='./datasets', subset='all')

3. 本地 CSV 数据:自定义数据集的处理

3.1 CSV 文件的创建与加载

CSV(逗号分隔值)是最常用的数据集格式之一。以下是创建和加载 CSV 文件的两种方法:

方式 1:手动创建

milage,Liters,Consumtime,target

40920,8.326976,0.953952,3

14488,7.153469,1.673904,2

26052,1.441871,0.805124,1

75136,13.147394,0.428964,1

方式 2:使用 pandas 生成

import pandas as pd

data = {

    'milage': [40920, 14488, 26052, 75136],

    'Liters': [8.326976, 7.153469, 1.441871, 13.147394],

    'Consumtime': [0.953952, 1.673904, 0.805124, 0.428964],

    'target': [3, 2, 1, 1]

}

df = pd.DataFrame(data)

df.to_csv('custom_data.csv', index=False)

加载 CSV 文件:

df = pd.read_csv('custom_data.csv')

X = df.drop('target', axis=1)

y = df['target']

3.2 数据清洗与预处理

实际项目中,本地 CSV 数据可能存在缺失值、异常值等问题。以下是常用处理方法:

缺失值填充:

from sklearn.impute import SimpleImputer

imputer = SimpleImputer(strategy='mean')

X_imputed = imputer.fit_transform(X)

异常值检测:

from scipy.stats import zscore

z_scores = zscore(X)

mask = np.abs(z_scores) < 3  # 保留Z-score绝对值小于3的数据

X_clean = X[mask.all(axis=1)]

y_clean = y[mask.all(axis=1)]

4. 数据集划分:模型评估的关键步骤

4.1 基础划分方法:train_test_split

train_test_split是最常用的数据集划分工具,可将数据随机划分为训练集和测试集:

from sklearn.model_selection import train_test_split

X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

参数说明:

  • test_size:测试集比例(0.0-1.0)。
  • random_state:随机种子,确保结果可复现。
  • stratify:分层抽样,适用于类别分布不均的分类任务。
4.2 进阶划分策略:交叉验证

交叉验证(Cross-Validation)通过多次划分数据评估模型稳定性,常用方法包括:

K 折交叉验证:

from sklearn.model_selection import KFold

kf = KFold(n_splits=5, shuffle=True, random_state=42)

for train_index, test_index in kf.split(X):

    X_train, X_test = X[train_index], X[test_index]

    y_train, y_test = y[train_index], y[test_index]

分层 K 折交叉验证:

from sklearn.model_selection import StratifiedKFold

skf = StratifiedKFold(n_splits=5, shuffle=True, random_state=42)

for train_index, test_index in skf.split(X, y):

    X_train, X_test = X[train_index], X[test_index]

    y_train, y_test = y[train_index], y[test_index]

4.3 模型调优与网格搜索

结合交叉验证和网格搜索(Grid Search)可自动寻找最优超参数:

from sklearn.model_selection import GridSearchCV

param_grid = {

    'n_estimators': [50, 100],

    'max_depth': [None, 10]

}

grid_search = GridSearchCV(RandomForestClassifier(), param_grid, cv=5)

grid_search.fit(X_train, y_train)

print(grid_search.best_params_)

5. 数据预处理:提升模型性能的关键

5.1 特征标准化与归一化

标准化(Standardization)和归一化(Normalization)是常用的特征缩放方法:

标准化:

from sklearn.preprocessing import StandardScaler

scaler = StandardScaler()

X_scaled = scaler.fit_transform(X_train)

X_test_scaled = scaler.transform(X_test)

归一化:

from sklearn.preprocessing import MinMaxScaler

scaler = MinMaxScaler(feature_range=(0, 1))

X_normalized = scaler.fit_transform(X_train)

X_test_normalized = scaler.transform(X_test)

5.2 文本特征提取

对于文本数据,常用 TF-IDF(词频 - 逆文档频率)进行特征提取:

from sklearn.feature_extraction.text import TfidfVectorizer

corpus = ["The quick brown fox jumps over the lazy dog",

          "Never jump over the lazy dog twice"]

vectorizer = TfidfVectorizer()

X_tfidf = vectorizer.fit_transform(corpus)

print(vectorizer.get_feature_names_out())

5.3 类别特征处理

对于类别特征,可使用OneHotEncoder进行独热编码:

from sklearn.preprocessing import OneHotEncoder

data = [['Male', 1], ['Female', 2], ['Male', 3]]

encoder = OneHotEncoder()

X_encoded = encoder.fit_transform(data)

6. 大规模数据处理:技术与工具

6.1 分块加载与处理

当数据量超过内存容量时,可使用分块加载:

import pandas as pd

chunk_size = 10000

for chunk in pd.read_csv('large_data.csv', chunksize=chunk_size):

    process(chunk)  # 对每个数据块进行处理

6.2 分布式计算框架

Dask 是一个灵活的并行计算库,可处理远超内存的数据集:

import dask.dataframe as dd

df = dd.read_csv('large_data.csv', blocksize=1e6)

df = df.dropna()

df['mean'] = df.mean(axis=1)

df.compute()  # 触发计算

6.3 模型优化与内存管理
  • 使用稀疏矩阵:对于高维稀疏数据(如文本特征),使用scipy.sparse矩阵可显著减少内存占用。
  • 在线学习:使用partial_fit方法进行增量训练,避免一次性加载全部数据:

from sklearn.linear_model import SGDClassifier

clf = SGDClassifier()

for chunk in pd.read_csv('large_data.csv', chunksize=1000):

    X_chunk = chunk.drop('target', axis=1)

    y_chunk = chunk['target']

    clf.partial_fit(X_chunk, y_chunk, classes=np.unique(y))

7. 数据隐私保护:合规与安全

7.1 数据匿名化

通过删除或泛化个人标识信息(PII)实现匿名化:

import pandas as pd

df = pd.read_csv('patient_data.csv')

df_anonymized = df.drop(['name', 'ssn'], axis=1)  # 删除敏感列

df_anonymized['age'] = pd.cut(df_anonymized['age'], bins=10)  # 年龄分箱

7.2 差分隐私

差分隐私(Differential Privacy)通过添加噪声保护个体隐私:

import numpy as np

from diffprivlib.mechanisms import Laplace

mechanism = Laplace(epsilon=1.0, delta=0.0001)

result = mechanism.randomise(df['age'].mean())

7.3 联邦学习

联邦学习允许多机构联合训练模型而不共享原始数据:

from syft.frameworks.torch.fl import FederatedLearningClient

client = FederatedLearningClient()

client.connect("http://server:8080")

client.send_model(model)

client.receive_model()

8. 数据集版本控制与管理

8.1 使用 DVC 管理数据集

DVC(Data Version Control)是专门用于数据版本控制的工具:

dvc init

dvc add large_data.csv

dvc commit -m "Add initial dataset"

8.2 数据目录结构建议

project/

├── data/

│   ├── raw/           # 原始数据

│   ├── processed/     # 预处理后的数据

│   └── external/      # 第三方数据集

├── models/            # 训练好的模型

├── notebooks/         # 分析脚本

└── reports/           # 结果报告

9. 常见问题与解决方案

9.1 数据下载失败

使用requests库实现重试机制:

import requests

from requests.adapters import HTTPAdapter

from requests.packages.urllib3.util.retry import Retry

session = requests.Session()

retries = Retry(total=5, backoff_factor=1)

session.mount('https://', HTTPAdapter(max_retries=retries))

response = session.get('https://example.com/dataset.zip')

9.2 内存不足
  • 使用生成器:

def batch_generator(X, y, batch_size=32):

    for i in range(0, len(X), batch_size):

        yield X[i:i+batch_size], y[i:i+batch_size]

  • 分块处理:

from sklearn.externals.joblib import Parallel, delayed

def process_chunk(chunk):

    # 对数据块进行处理

    return processed_chunk

results = Parallel(n_jobs=-1)(delayed(process_chunk)(chunk) for chunk in chunks)

9.3 数据格式不兼容

使用pandas进行格式转换:

df = pd.read_excel('data.xlsx')

df.to_parquet('data.parquet')  # 转换为Parquet格式

10. 实战案例:MNIST 手写数字识别

10.1 数据加载与预处理

from sklearn.datasets import fetch_openml

# 加载MNIST数据集

mnist = fetch_openml('mnist_784', version=1, as_frame=False)

X, y = mnist.data, mnist.target.astype(int)

# 数据归一化

X = X / 255.0

# 划分训练集与测试集

X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

10.2 模型训练与评估

from sklearn.ensemble import RandomForestClassifier

clf = RandomForestClassifier(n_estimators=100)

clf.fit(X_train, y_train)

y_pred = clf.predict(X_test)

accuracy = clf.score(X_test, y_test)

print(f"Test Accuracy: {accuracy:.4f}")

10.3 模型保存与加载

from sklearn.externals.joblib import dump, load

# 保存模型

dump(clf, 'mnist_model.joblib')

# 加载模型

loaded_clf = load('mnist_model.joblib')

结语

数据集是机器学习的基石,其质量和处理方式直接影响模型性能。通过掌握 sklearn 提供的数据集加载工具、数据预处理技术和模型评估方法,开发者能够高效地将原始数据转化为可用于训练的高质量输入。同时,合理运用分布式计算、隐私保护和版本控制技术,可进一步提升项目的可扩展性和可靠性。在实践中,建议结合具体业务需求选择合适的数据集和处理流程,并持续关注数据安全与合规性要求。通过不断积累经验,开发者将逐步掌握从数据中挖掘价值的核心能力,为人工智能项目的成功奠定基础。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/news/916839.shtml
繁体地址,请注明出处:http://hk.pswp.cn/news/916839.shtml
英文地址,请注明出处:http://en.pswp.cn/news/916839.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

SQL排查、分析海量数据以及锁机制

1. SQL排查 1.1 慢查询日志: mysql提供的一种日志记录, 用户记录MySQL中响应时间超过阈值的SQL语句(long_query_time, 默认10秒), 慢查询日志默认是关闭的, 建议开发调优时打开, 最终部署的时候关闭 1.1.1 检查是否开启了慢查询日志 show variables like %slow_query_log%;临…

conda 安装prokka教程

本章教程,记录如何在wsl2+ubuntu下载通过conda安装prokka软件包。 Prokka 是一个快速的、功能强大的基因组注释工具,特别适用于细菌基因组的注释。它能够自动化完成从基因组序列到功能注释的整个流程,包括基因的识别、功能预测和注释,并且支持多种文件格式输出,广泛应用于…

CSS3 圆角

CSS3 圆角 引言 CSS3圆角是现代网页设计中非常重要的一项功能&#xff0c;它使得网页元素的外观更加平滑、美观。本文将详细介绍CSS3圆角的概念、实现方法以及相关属性&#xff0c;帮助您更好地掌握这一技巧。 CSS3圆角概念 CSS3圆角指的是通过CSS3属性为元素&#xff08;如div…

牛顿-拉夫森法求解非线性方程组

牛顿-拉夫森法&#xff08;Newton-Raphson method&#xff09;是一种用于求解非线性方程组的迭代方法。该方法通过线性化非线性方程组&#xff0c;并逐步逼近方程组的解。以下是牛顿-拉夫森法求解非线性方程组的详细步骤和MATLAB实现。 1. 牛顿-拉夫森法的基本原理 对于非线性方…

Windows系统使用命令生成文件夹下项目目录树(文件结构树)的两种高效方法

Windows系统使用命令生成文件夹下项目目录树&#xff08;文件结构树&#xff09;的两种高效方法前言&#xff1a;**方法一&#xff1a;tree 命令 —— 快速生成经典目录树****方法二&#xff1a;PowerShell —— 可以精准过滤“降噪”的命令**这份列表非常精炼&#xff0c;只包…

react中暴露事件useImperativeHandle

注&#xff1a;本页面模块主要是使用 useImperativeHandle &#xff0c;一、概述1、要点hooks 中的暴露事情件方法useImperativeHandle&#xff0c;需要和forwardRef、ref 结合一起使用。1、外层校验的时候会校验里面所有需要校验的验证2、基础使用二、demo案例1、场景1、弹框打…

【论文阅读】-《RayS: A Ray Searching Method for Hard-label Adversarial Attack》

RayS&#xff1a;一种用于硬标签对抗攻击的光线搜索方法 Jinghui Chen University of California, Los Angeles jhchencs.ucla.edu Quanquan Gu University of California, Los Angeles qgucs.ucla.edu 原文链接&#xff1a;https://arxiv.org/pdf/2006.12792 摘要 深度神经…

15K的Go开发岗,坐标北京

好久没有分享最新的面经了&#xff0c;今天分享一下北京某公司Go开发岗的面经&#xff0c;薪资是15K左右&#xff0c;看看难度如何&#xff1a; 为什么要用分布式事务 分布式事务的核心作用是解决跨服务、跨数据源操作的数据一致性问题。在单体应用中&#xff0c;数据库本地事务…

Linux 文件管理高级操作:复制、移动与查找的深度探索

目录一、文件复制&#xff1a;从基础到企业级同步的全维度解析1. cp命令&#xff1a;基础工具的进阶密码&#xff08;1&#xff09;文件属性保留&#xff1a;从基础到极致&#xff08;2&#xff09;特殊文件处理&#xff1a;稀疏文件与设备文件&#xff08;3&#xff09;安全操…

Redis内存使用耗尽情况分析

目录 1、内存上限介绍 1.1、产生原因 1.2、Redis的maxmemory限额 1.3、影响的命令与场景 2. 内存用完后的策略 2.1、淘汰策略分类 2.2、淘汰策略介绍 2.3、不同策略对比 3、常见业务示例 3.1、影响 3.2、监控与自动告警 前言 在日常项目中&#xff0c;不知道你思考过…

Ubuntu 系统中配置 SSH 服务教程

一、什么是 SSH&#xff1f;SSH&#xff08;Secure Shell&#xff09;是一种加密的网络协议&#xff0c;用于在不安全的网络中安全地进行远程登录、远程命令执行和文件传输。它是 Telnet、FTP 等传统协议的安全替代品。二、确认系统环境在开始配置之前&#xff0c;请确认你的系…

基于springboot的编程训练系统设计与实现(源码+论文)

一、开发环境 技术/工具描述MYSQL数据库一个真正的多用户、多线程SQL数据库服务器&#xff0c;适用于Web站点或其他应用软件的数据库后端开发。B/S结构基于互联网系统的软件系统开发架构&#xff0c;利用浏览器进行访问&#xff0c;支持多平台使用。Spring Boot框架简化新Spri…

K8s集群两者不同的对外暴露服务的方式

在工作中&#xff0c;我们暴露集群内的服务通常有几种方式&#xff0c;对于普通的http或者https,我们通常使用​Ingress Nginx​ &#xff0c;对于原始的TCP或者UDP端口服务&#xff0c;可能需要选择 ​LoadBalancer​ &#xff0c;它们的核心区别在于工作层级、协议支持和流量…

实习日志111

第一天 加入内网和内网域&#xff0c;设置自己的操作系统 第二天 安装常用软件和平台 Notepad 是一款免费的源代码编辑器&#xff0c;支持多种编程语言&#xff0c;其功能强大且界面友好&#xff0c;适用于 Windows 操作系统。WinMerge 是一款开源的差异比较和合并工具&…

Redis 服务挂掉排查与解决

Redis 是一个高性能的键值对存储系统&#xff0c;广泛应用于缓存、会话存储、消息队列等场景。在使用 Redis 的过程中&#xff0c;偶尔会遇到 Redis 服务挂掉或无法连接的情况。本文将通过常见错误 RedisException in Redis.php line 63 Connection refused 来讲解如何排查并解…

DOM + HTML + HTTP

一、HTML5的新特性 1.语义化标签:其实就是可以让标签有自己的含义 html4之前都是有的,比如:<h1>、<ul>、<li> html5新增了很多语义化标签:<header>、<nav> html5的语义化标签的常用页面布局: 优点: 1.代码结构清晰,方便阅读,有利于团…

HTML 音频/视频

HTML 音频/视频 引言 HTML 音频和视频标签是网页设计中不可或缺的部分,它们为用户提供了一种将多媒体内容嵌入到网页中的方式。本文将详细介绍 HTML 音频/视频标签的用法、属性和注意事项,帮助开发者更好地在网页中嵌入音频和视频。 HTML 音频标签( ) 1. 标签基本用法 …

Apache Ignite Cluster Groups的介绍

以下这段内容是 Apache Ignite 官方文档中关于 Cluster Groups&#xff08;集群组&#xff09; 的介绍。我来用通俗易懂的方式帮你全面理解这个概念。&#x1f310; 什么是 Cluster Group&#xff1f; 简单来说&#xff1a;Cluster Group 就是一个“节点的子集”。想象一下你的…

github上传本地项目过程记录

最近有和别人进行unity项目协作的需求&#xff0c;需要把自己的本地代码上传到github已有的一个仓库里。记录一下上传过程&#xff0c;防止后续还需要用。 文章目录一、把自己的本地代码上传到github已有的一个仓库中二、常用功能一、把自己的本地代码上传到github已有的一个仓…

Spring AI Alibaba

目录 前言&#xff1a; 一、Spring AI 和Spring AI Alibaba 二、Spring AI Alibaba快速入门 1.环境 2.ollama 3.阿里百炼 前言&#xff1a; 2025年真的是AI大爆发的一年&#xff0c;以后无论是什么行业我想都需要AI了&#xff0c;作为一名计算机人&#xff0c;你不学习AI…