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 # 一定要用归一化后的测试数据做预测