简介
在本实验中,我们将探索 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)
缩放
将特征缩放到特定范围是另一种常见的预处理技术。当特征具有不同的尺度,而我们希望将它们都带到相似的范围时,这种技术很有用。MinMaxScaler和MaxAbsScaler可用于执行缩放。
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 中的OrdinalEncoder和OneHotEncoder来编码分类特征。
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 中练习更多实验来提升你的技能。