scikit-learn中的Scaler

均值方差归一化时,对训练数据集做归一化,测试数据集要用训练数据集的均值和方差做归一化。$\frac {x_{test} - mean_{train}} {{Std}_{train}}$

真实环境中很有可能无法得到所有测试数据的均值和方差。 对数据的归一化也是算法的一部分。

在sklearn中,需要保存训练数据的均值和方差,用于测试集用,所以封装了一个Scaler类, 在sklearn.preprocessing模块里。

  • mean_
  • std_
import numpy as np
import matplotlib.pyplot as plt
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, random_state=666)
from sklearn.preprocessing import StandardScaler
standardScaler = StandardScaler()
standardScaler.fit(X_train)
standardScaler.mean_
standardScaler.scale_ #描述数据分布范围,和std_一样,只是std_这个变量名在sklearn中弃用了。

结果:

array([5.825     , 3.09285714, 3.68571429, 1.16428571])
array([0.80239597, 0.4493476 , 1.75828941, 0.75543946])

数据归一化后做knn分类的效果:

X_train_standard = standardScaler.transform(X_train)
X_test_standard = standardScaler.transform(X_test)
from sklearn.neighbors import KNeighborsClassifier
knn_clf = KNeighborsClassifier(n_neighbors=3)
knn_clf.fit(X_train_standard, y_train)
knn_clf.score(X_test_standard, y_test)
knn_clf.score(X_test, y_test)

结果:

0.9736842105263158 
0.34210526315789475 # 一定要用归一化后的测试数据做预测