Skip to content

Scikit Learn - 数据表示

机器学习模型从数据中学习。为了被 Scikit-learn 中的算法理解,数据需要以特定的数值格式表示。本章讨论 Scikit-learn 期望的数据结构。

对于 Scikit-learn 来说,思考和表示数据的最常见方式是将其视为一个表格。这个表格本质上是一个二维网格,其中:

  • 行代表单个观测或 样本 (samples)(例如,一个客户、一朵花、一份文档)。
  • 列代表这些样本的不同特征 (characteristics) 或 特征 (features)(例如,客户的年龄、花瓣的长度、文档中的词频)。

让我们以 Iris 数据集为例,它是机器学习中的经典数据集。我们可以使用 Scikit-learn 的 datasets 模块加载它,并通常借助 Pandas 来以表格形式查看它。

from sklearn.datasets import load_iris
import pandas as pd
# 加载 Iris 数据集对象
iris_dataset = load_iris()
# 为特征创建 Pandas DataFrame
# iris_dataset.data 包含特征值
# iris_dataset.feature_names 包含列名
X_df = pd.DataFrame(iris_dataset.data, columns=iris_dataset.feature_names)
# 为目标变量创建 Pandas Series
# iris_dataset.target 包含目标值(物种编码为 0, 1, 2)
# iris_dataset.target_names 包含物种名称
y_s = pd.Series(iris_dataset.target, name='species')
print("First 5 rows of the feature DataFrame (X_df):")
print(X_df.head())
print("\nFirst 5 values of the target Series (y_s):")
print(y_s.head())
print(f"\nTarget names: {list(iris_dataset.target_names)}")
First 5 rows of the feature DataFrame (X_df):
sepal length (cm) sepal width (cm) petal length (cm) petal width (cm)
0 5.1 3.5 1.4 0.2
1 4.9 3.0 1.4 0.2
2 4.7 3.2 1.3 0.2
3 4.6 3.1 1.5 0.2
4 5.0 3.6 1.4 0.2
First 5 values of the target Series (y_s):
0 0
1 0
2 0
3 0
4 0
Name: species, dtype: int32
Target names: ['setosa', 'versicolor', 'virginica']

在这个表格中,每一行都是一朵被观察到的花(一个样本),每一列代表对该花的测量值(一个特征)。

Scikit-learn 期望特征是以二维数组状结构的形式提供,通常称为特征矩阵 (feature matrix),并约定用 X 表示。这个矩阵的形状为 [n_samples, n_features]:

  • n_samples:数据集中的项目或观测数量(行数)。
  • n_features:用于描述每个样本的不同特征的数量(列数)。

特征矩阵 X 通常是一个 NumPy 数组或 Pandas DataFrame。Scikit-learn 算法针对 NumPy 数组进行了优化。如果您提供 Pandas DataFrame,Scikit-learn 通常会在内部进行转换。X 中的所有数据必须是数值型的(整数或浮点数)。分类数据(如文本标签)在使用大多数 Scikit-learn 估计器 (estimators) 之前必须转换为数值表示(例如,使用独热编码 one-hot encoding 或标签编码 label encoding)。

除了特征矩阵 X,大多数监督学习 (supervised learning) 算法在 Scikit-learn 中还需要一个目标数组 (target array),约定用 y 表示。这个数组包含我们想要预测的值。

  • 目标数组 y 通常是一个一维数组(或 Pandas Series),长度为 n_samples。
  • y 中的每个条目对应于 X 中的一个样本(行)。
  • 对于分类 (classification) 任务,y 包含离散类别标签 (discrete class labels)(例如,整数 0、1、2 或字符串 ‘cat’、‘dog’)。Scikit-learn 通常与整数标签配合得最好。
  • 对于回归 (regression) 任务,y 包含连续的数值(例如,房屋价格、温度)。

无监督学习 (Unsupervised learning) 算法,如聚类或 PCA,通常只需要特征矩阵 X,在训练期间不使用目标数组 y。

关键区别在于,目标数组 y 代表我们希望预测的数量(因变量,dependent variable),而特征矩阵 X 中的列是用于进行预测的输入(自变量,independent variables)。

示例:从 Iris 数据中分离特征和目标

Section titled “示例:从 Iris 数据中分离特征和目标”

如果我们想根据 Iris 的测量值来预测其物种,那么物种列就成为我们的目标 y,而测量值列构成了我们的特征矩阵 X。

from sklearn.datasets import load_iris
iris = load_iris()
# X:特征矩阵(测量值)
X_iris = iris.data
# y:目标数组(物种,编码为整数)
y_iris = iris.target
print(f"Shape of feature matrix X_iris: {X_iris.shape}")
print(f"First 3 rows of X_iris:\n{X_iris[:3]}")
print(f"\nShape of target array y_iris: {y_iris.shape}")
print(f"First 10 values of y_iris: {y_iris[:10]}")
print(f"Unique values in y_iris: {pd.unique(y_iris)}")
print(f"Target names corresponding to unique values: {iris.target_names}")
Shape of feature matrix X_iris: (150, 4)
First 3 rows of X_iris:
[[5.1 3.5 1.4 0.2]
[4.9 3. 1.4 0.2]
[4.7 3.2 1.3 0.2]]
Shape of target array y_iris: (150,)
First 10 values of y_iris: [0 0 0 0 0 0 0 0 0 0]
Unique values in y_iris: [0 1 2]
Target names corresponding to unique values: ['setosa' 'versicolor' 'virginica']

确保您的数据符合这种 X(二维数值数组)和 y(一维数值数组,用于监督任务)的格式是有效使用 Scikit-learn 的第一步。