4.2 外部数据集加载与适配
Scikit-learn 数据加载:从 CSV、数据库到自定义数据集完整指南
本教程章节讲解如何使用 Scikit-learn 加载和适配外部数据集,包括从 CSV/Excel、数据库(MySQL/PostgreSQL)加载数据,并构建符合 Scikit-learn 输入规范的自定义数据集。
外部数据集加载与适配
在机器学习项目中,数据加载是第一步,也是最关键的一步。Scikit-learn 库要求输入数据必须是二维特征矩阵(n_samples, n_features)和一维标签向量。本章将详细介绍如何从外部源加载数据,并适配到 Scikit-learn 的规范格式。我们将覆盖从 CSV/Excel、数据库以及自定义数据集的构建。
1. 从 CSV/Excel 加载数据(使用 Pandas 和 Scikit-learn 适配)
CSV 和 Excel 是常见的数据存储格式,我们可以使用 Pandas 库轻松读取它们,然后转换为 Scikit-learn 兼容的格式。
步骤:
-
安装必要的库(如果未安装):
- 确保已安装
pandas和scikit-learn。 - 安装方法:
pip install pandas scikit-learn。
- 确保已安装
-
读取数据:
- 使用 Pandas 的
read_csv()函数读取 CSV 文件。 - 使用
read_excel()函数读取 Excel 文件。
- 使用 Pandas 的
-
适配到 Scikit-learn:
- 分离特征和标签:假设数据集最后一列是标签,其余是特征。
- 特征矩阵(X)和标签向量(y)必须是 NumPy 数组或类似数组。
示例代码:
import pandas as pd
import numpy as np
from sklearn.model_selection import train_test_split
# 从 CSV 文件加载数据
data_csv = pd.read_csv('your_data.csv')
# 从 Excel 文件加载数据
data_excel = pd.read_excel('your_data.xlsx')
# 假设数据框中有 'feature1', 'feature2', ..., 'label' 列
# 分离特征和标签
X = data_csv[['feature1', 'feature2']].values # 转换为 NumPy 数组
y = data_csv['label'].values
# 或者,如果标签列是最后一列
X = data_csv.iloc[:, :-1].values # 所有行,除最后一列
Y = data_csv.iloc[:, -1].values # 最后一列作为标签
# 现在 X 和 y 符合 Scikit-learn 输入规范
print(f'特征矩阵形状: {X.shape}')
print(f'标签向量形状: {y.shape}')
注意事项:
- 确保数据没有缺失值,可以使用
fillna()方法处理。 - 如果标签是类别数据,可能需要编码为数值(如使用
sklearn.preprocessing.LabelEncoder)。
2. 从数据库加载数据(MySQL/PostgreSQL → DataFrame → 特征/标签分离)
对于存储在数据库中的数据,我们可以使用 SQL 查询和 Pandas 来加载,然后进行适配。
步骤:
-
安装数据库驱动(如果需要):
- 对于 MySQL:
pip install mysql-connector-python或pip install pymysql。 - 对于 PostgreSQL:
pip install psycopg2。
- 对于 MySQL:
-
连接到数据库:使用 SQLAlchemy 或直接使用 Pandas 的
read_sql_query()函数。 -
执行查询并转换为 DataFrame。
-
分离特征和标签,类似 CSV/Excel 方法。
示例代码:
import pandas as pd
from sqlalchemy import create_engine # 可选,用于连接数据库
# 连接到 MySQL 数据库(示例)
mysql_engine = create_engine('mysql+mysqlconnector://user:password@host/database')
# 执行查询并加载到 DataFrame
query = "SELECT feature1, feature2, label FROM your_table"
data_db = pd.read_sql_query(query, mysql_engine)
# 对于 PostgreSQL,类似
# postgres_engine = create_engine('postgresql://user:password@host/database')
# data_db = pd.read_sql_query(query, postgres_engine)
# 分离特征和标签
X = data_db[['feature1', 'feature2']].values
y = data_db['label'].values
print(f'从数据库加载的特征矩阵形状: {X.shape}')
print(f'标签向量形状: {y.shape}')
建议:
- 如果数据量大,考虑分批加载或优化查询以避免内存问题。
- 确保数据库连接安全和权限正确。
3. 自定义数据集构建(符合 Scikit-learn 输入规范)
有时候,数据来自非标准源,或者需要手动创建数据集,例如从文本文件或模拟生成数据。关键是确保数据格式符合 Scikit-learn 的要求。
步骤:
- 收集或生成数据:可以使用 NumPy 或列表手动创建数据。
- 组织数据:特征矩阵应为二维数组(n_samples, n_features),标签向量为一维数组(n_samples)。
- 可选预处理:如标准化或编码。
示例代码:
import numpy as np
# 创建自定义数据集:假设有 100 个样本,每个样本有 2 个特征和 1 个标签
# 生成随机数据
np.random.seed(42) # 为了可重复性
X_custom = np.random.rand(100, 2) # 特征矩阵:100 行 2 列
y_custom = np.random.randint(0, 2, size=100) # 标签向量:100 个 0 或 1
# 或者,从列表中构建
X_list = [[1, 2], [3, 4], [5, 6]] # 列表的列表
y_list = [0, 1, 0]
# 转换为 NumPy 数组(Scikit-learn 推荐使用数组)
X_array = np.array(X_list)
y_array = np.array(y_list)
print(f'自定义特征矩阵形状: {X_custom.shape}')
print(f'自定义标签向量形状: {y_custom.shape}')
重要点:
- Scikit-learn 兼容任何类似数组的结构(如 NumPy 数组、Pandas DataFrame 的 .values)。
- 确保标签是一维的,特征矩阵是二维的。
总结
在本章中,我们学习了如何从外部数据集加载数据并适配到 Scikit-learn 的输入规范。无论是从 CSV/Excel、数据库还是自定义构建,关键步骤都是使用 Pandas 或 NumPy 来管理和转换数据。记住:特征矩阵(X)应为二维,标签向量(y)为一维。这确保了数据可以直接用于 Scikit-learn 的模型训练和评估。
下一步:在加载数据后,通常需要进行数据预处理,如处理缺失值、特征缩放或编码,这将在后续章节中介绍。