scikit-learn的Scaler数据归一化
- 一、摘要
- 二、训练数据集和测试数据集的归一化处理原则
- 三、scikit-learn中的Scalar类及示例
- 四、自定义StandardScaler类进行数据归一化处理
- 五、小结
一、摘要
本文主要介绍了scikit-learn中Scaler的使用方法,特别强调了数据归一化在机器学习过程中的重要性。讲述了归一化算法在训练模型前对训练数据集的处理,以及预测时对测试数据集的正确归一化方式。强调了保存训练数据集得到的均值和方差的重要性,并介绍了scalar类在数据处理中的封装理念和过程。最后通过实际代码示例,演示了如何使用standard scalar对数据进行归一化处理,并进行了knn分类实验,展示了归一化处理对提高模型预测准确度的重要性。
二、训练数据集和测试数据集的归一化处理原则
- 训练数据集用于训练模型,测试数据集用于评估模型性能。
- 归一化处理包括均值和方差的计算,用于将数据转换为标准正态分布。
- 测试数据集应使用训练数据集得到的均值和方差进行归一化处理。
- 不应直接对测试数据集计算均值和方差,应使用训练数据集的均值和方差。
三、scikit-learn中的Scalar类及示例
- Scalar类封装了数据的归一化处理,使流程与机器学习算法一致。
- fit方法用于计算训练数据集的均值和方差,保存关键信息。
- transform方法用于对输入样例进行归一化处理,输出结果。
- 使用scalar类可以方便地对后续样本进行归一化,并送入机器学习算法中进行预测处理。
- StandardScaler的使用示例,具体实现步骤如下:
-
1.加载鸢尾花数据集,分为训练数据集和测试数据集。
import numpy as np from sklearn import datasets # 引入鸢尾花数据集 iris = datasets.load_iris() # 特征矩阵和标签向量 X = iris.data y = iris.target # 将特征矩阵划分成训练集和测试集及其对应的特征向量 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=666)
-
2.使用StandardScaler对训练数据集进行归一化处理。
# 使用StandardScaler对训练数据集进行归一化处理. from sklearn.preprocessing import StandardScaler # 初始化对象 standardScaler = StandardScaler() # 训练数据集进行归一化 standardScaler.fit(X_train) X_train_standard = standardScaler.transform(X_train) X_train_standard
执行效果:
-
3.使用相同的StandardScaler对测试数据集进行归一化处理。
# 使用StandardScaler对测试数据集进行归一化处理. standardScaler.fit(X_test) X_test_standard = standardScaler.transform(X_test) X_test_standard
执行效果:
-
4.使用归一化后的数据训练k-近邻分类器,并评估分类准确度。
# 使用归一化后的数据训练k-近邻分类器,并评估分类准确度。 from sklearn.neighbors import KNeighborsClassifier # 初始化分类器 knn_clf = KNeighborsClassifier(n_neighbors=3,n_jobs=-1) # 调用fit函数 knn_clf.fit(X_train_standard,y_train) # 调用score函数 knn_clf.score(X_test_standard,y_test)
执行效果:
-
5.对比未归一化处理的测试数据集会导致分类准确度降低。
# 传入未归一化的测试集 knn_clf.score(X_test,y_test)
执行效果:
传入未归一化的测试集后,kNN分类器的准确度就下降了很多。
-
四、自定义StandardScaler类进行数据归一化处理
- 创建自定义StandardScaler类,包含fit和transform方法。
- fit方法计算训练数据集的均值和方差,保存为类的属性。
- transform方法使用训练数据集的均值和方差对输入数据进行归一化处理。
- 自定义StandardScaler的使用方式与sklearn中的StandardScaler一致。
- 自定义完整代码如下:
import numpy as np class MyStandardScaler: def __init__(self): self.mean_ = None # 均值 self.scale_ = None # 方差 def fit(self, X): """根据训练集X(二维的)获得数据的均值和方差""" assert X.ndim == 2, \ "The dimenstion of X must be 2." self.mean_ = np.array([(np.mean(X[:, col])) for col in range(X.shape[1])]) self.scale_ = np.array([(np.std(X[:, col])) for col in range(X.shape[1])]) return self def transform(self, X): """将X进行均值方差归一化处理""" assert X.ndim == 2, \ "The dimenstion of X must be 2." assert self.mean_ is not None and self.scale_ is not None, \ "must fit before transform." assert X.shape[1] == len(self.mean_), \ "The number of X`s features must be equal to the number of self.mean_. " # 定义一个与X大小一致的空的矩阵 retX = np.empty(shape=X.shape, dtype=float) # 均值方差归一化算法 for col in range(X.shape[1]): retX[:, col] = (X[:, col] - self.mean_[col]) / self.scale_[col] return retX
- 在jupyter中执行效果如下:
五、小结
本文围绕 scikit - learn 中 Scaler 的使用方法展开介绍,着重强调了数据归一化在机器学习中的重要性。文中阐述了归一化算法在训练模型前对训练数据集的处理操作,以及预测时对测试数据集的正确归一化方式。特别指出保存训练数据集所得均值和方差的重要意义,还介绍了 scalar 类在数据处理中的封装理念与过程。最后借助实际代码示例,演示了运用 standard scalar 对数据进行归一化处理的过程,并开展了 knn 分类实验,以此展示归一化处理对提升模型预测准确度的重要作用。