我们对模型进行训练时,数据集的特征差距过大,会对模型产生不利的影响,就比如我们在预测一个人普通人身高时,如果数据集中包含正常人的身高数据、侏儒症身高和NBA球员的身高数据,那么我们在构建一个预测普通人身高的模型时,侏儒症身高和NBA球身高数据就会对我们的模型产生不利的影响,从而无法准确预测一个普通人的身高。
因此我们将训练集数据传入模型之前,需要对数据集进行预处理。常规的数据预处理有两种方法:归一化和标准化。
归一化是把所有数据映射到(0,1)之间。公式如下:
流程如下:
归一化适用于有明显分界的特征数据,比如分数得分0-100
受异常值影响很大
from sklearn import datasets
from sklearn.preprocessing import MinMaxScaler
from sklearn.model_selection import train_test_split
from sklearn.neighbors import KNeighborsClassifier
# 加载鸢尾花数据集
iris = datasets.load_iris()
X = iris.data
y = iris.target
# 归一化处理后数据集划分
X1_train,X1_test,y_train,y_test = train_test_split(X,y,test_size=0.3,random_state=1)
# 使用MinMaxScaler进行归一化处理
scaler = MinMaxScaler()
scaler.fit(X_train)
X_train1 = scaler.transform(X_train)
X_test1 = scaler.transform(X_test)
# knn分类
knn_clf= KNeighborsClassifier(n_neighbors=3)
knn_clf1.fit(X_train1,y_train)
# 模型评估
knn_clf1.score(X_test1,y_test)
标准化是将所有数据往正态分布调整,也叫Z分数。公式如下:
流程如下:
异常值对标准化影响不大,一般用于没有明显分界的数据分布
from sklearn import datasets
from sklearn.preprocessing import StandardScaler
from sklearn.model_selection import train_test_split
from sklearn.neighbors import KNeighborsClassifier
# 加载鸢尾花数据集
iris = datasets.load_iris()
X = iris.data
y = iris.target
# 归一化处理后数据集划分
X1_train,X1_test,y_train,y_test = train_test_split(X,y,test_size=0.3,random_state=1)
# 使用MinMaxScaler进行归一化处理
scaler = StandardScaler()
scaler.fit(X1)
X_train2 = scaler.transform(X_train)
X_test2 = scaler.transform(X_test)
# knn分类
knn_clf= KNeighborsClassifier(n_neighbors=3)
knn_clf1.fit(X_train2,y_train)
# 模型评估
knn_clf1.score(X_test2,y_test)
以上数据没有体现出两种数据预处理对于模型的结果的影响
from sklearn.preprocessing import MinMaxScaler
from sklearn.preprocessing import StandardScaler
一般来说,我们用训练集的关键信息进行预处理,因为我们模型在实际使用过程中要预测的真实数据经常没有办法计算均值和方差。所以一般先进行数据划分,再使用训练集得出关键信息,然后对训练集和测试集分别进行预处理。