Scikit-learn 中的数据预处理技术

Beginner

This tutorial is from open-source community. Access the source code

简介

在本实验中,我们将探索 scikit-learn 中可用的预处理技术。预处理是任何机器学习工作流程中的重要步骤,因为它有助于将原始数据转换为适合学习算法的格式。我们将介绍各种预处理技术,如标准化、缩放、归一化、编码分类特征、插补缺失值、生成多项式特征以及创建自定义转换器。

虚拟机使用提示

虚拟机启动完成后,点击左上角切换到“笔记本”标签,以访问 Jupyter Notebook 进行练习。

有时,你可能需要等待几秒钟让 Jupyter Notebook 完成加载。由于 Jupyter Notebook 的限制,操作验证无法自动化。

如果你在学习过程中遇到问题,请随时向 Labby 提问。课程结束后提供反馈,我们将立即为你解决问题。

标准化

标准化是许多机器学习算法常见的预处理步骤。它将特征转换为均值为零、方差为一。我们可以使用 scikit-learn 中的StandardScaler来执行标准化。

from sklearn.preprocessing import StandardScaler
import numpy as np

## 创建一个示例数据集
X = np.array([[1., -1., 2.],
              [2., 0., 0.],
              [0., 1., -1.]])

## 初始化 StandardScaler
scaler = StandardScaler()

## 在训练数据上拟合 scaler
scaler.fit(X)

## 转换训练数据
X_scaled = scaler.transform(X)

## 打印转换后的数据
print(X_scaled)

缩放

将特征缩放到特定范围是另一种常见的预处理技术。当特征具有不同的尺度,而我们希望将它们都带到相似的范围时,这种技术很有用。MinMaxScalerMaxAbsScaler可用于执行缩放。

from sklearn.preprocessing import MinMaxScaler, MaxAbsScaler
import numpy as np

## 创建一个示例数据集
X = np.array([[1., -1., 2.],
              [2., 0., 0.],
              [0., 1., -1.]])

## 初始化 MinMaxScaler
min_max_scaler = MinMaxScaler()

## 拟合并转换训练数据
X_minmax = min_max_scaler.fit_transform(X)

## 打印转换后的数据
print(X_minmax)

## 初始化 MaxAbsScaler
max_abs_scaler = MaxAbsScaler()

## 拟合并转换训练数据
X_maxabs = max_abs_scaler.fit_transform(X)

## 打印转换后的数据
print(X_maxabs)

归一化

归一化是将单个样本缩放到具有单位范数的过程。当数据的大小不重要,而我们只对数据的方向(或角度)感兴趣时,通常会使用它。我们可以使用 scikit-learn 中的Normalizer来执行归一化。

from sklearn.preprocessing import Normalizer
import numpy as np

## 创建一个示例数据集
X = np.array([[1., -1., 2.],
              [2., 0., 0.],
              [0., 1., -1.]])

## 初始化 Normalizer
normalizer = Normalizer()

## 拟合并转换训练数据
X_normalized = normalizer.fit_transform(X)

## 打印转换后的数据
print(X_normalized)

编码分类特征

分类特征在用于机器学习算法之前需要被编码为数值。我们可以使用 scikit-learn 中的OrdinalEncoderOneHotEncoder来编码分类特征。

from sklearn.preprocessing import OrdinalEncoder, OneHotEncoder
import numpy as np

## 创建一个示例数据集
X = [['male', 'from US', 'uses Safari'],
     ['female', 'from Europe', 'uses Firefox']]

## 初始化 OrdinalEncoder
ordinal_encoder = OrdinalEncoder()

## 拟合并转换训练数据
X_encoded = ordinal_encoder.fit_transform(X)

## 打印转换后的数据
print(X_encoded)

## 初始化 OneHotEncoder
onehot_encoder = OneHotEncoder()

## 拟合并转换训练数据
X_onehot = onehot_encoder.fit_transform(X)

## 打印转换后的数据
print(X_onehot.toarray())

缺失值插补

数据集中的缺失值可能会给机器学习算法带来问题。我们可以使用 scikit-learn 的impute模块中提供的方法来处理缺失值。在这里,我们将使用SimpleImputer来插补缺失值。

from sklearn.impute import SimpleImputer
import numpy as np

## 创建一个带有缺失值的示例数据集
X = np.array([[1., 2., np.nan],
              [3., np.nan, 5.],
              [np.nan, 4., 6.]])

## 初始化 SimpleImputer
imputer = SimpleImputer()

## 拟合并转换训练数据
X_imputed = imputer.fit_transform(X)

## 打印转换后的数据
print(X_imputed)

生成多项式特征

有时,通过考虑输入数据的非线性特征来增加模型的复杂度是有益的。我们可以使用 scikit-learn 中的PolynomialFeatures来生成多项式特征。

from sklearn.preprocessing import PolynomialFeatures
import numpy as np

## 创建一个示例数据集
X = np.array([[0, 1],
              [2, 3],
              [4, 5]])

## 初始化 PolynomialFeatures
poly = PolynomialFeatures(2)

## 拟合并转换训练数据
X_poly = poly.fit_transform(X)

## 打印转换后的数据
print(X_poly)

创建自定义转换器

在某些情况下,我们可能希望将现有的 Python 函数转换为转换器,以协助进行数据清理或处理。我们可以使用 scikit-learn 中的FunctionTransformer来实现这一点。

from sklearn.preprocessing import FunctionTransformer
import numpy as np

## 创建一个自定义函数
def custom_function(X):
    return np.log1p(X)

## 初始化 FunctionTransformer
transformer = FunctionTransformer(custom_function)

## 创建一个示例数据集
X = np.array([[0, 1],
              [2, 3]])

## 使用自定义函数转换数据
X_transformed = transformer.transform(X)

## 打印转换后的数据
print

总结

恭喜你!你已经完成了数据预处理实验。你可以在 LabEx 中练习更多实验来提升你的技能。