sklearn.preprocessing归一化标准化等
目录
sklearn.preprocessing
sklearn.preprocessing
属于数据预处理阶段,经过一定缩放,标准化等处理使得数据能被模型识别
sklearn.preprocessing 有多个缩放器(Scaler):
- StandardScaler
- MinMaxScaler
- RobustScaler
- Normalizer
还有可以直接使用的函数:scale(),maxabs_scale(),minmax_scale(),robust_scale(),normaizer()
1.StandardScaler,标准化,也叫z-score规范化
z = (x - u) / s
其中u是训练样本或者特征的均值,s是训练样本或者特征的标准偏差,z是标准化之后的值
这个方法被广泛使用在支持向量机,逻辑回归神经网络等
StandardScaler有fit,fit_transform,transform等方法
fit:用于计算训练数据的均值和方差
fit_transform:不仅计算训练数据的值和方差,还会基于计算出来的均值方差来转换训练数据,将数据转为标准正态分布
transform:只进行转换,把数据转换成标准正态分布
一般会把train和test集放在一起做标准化,或者在train集上做标准化后,用同样的标准化器去标准化test集
from sklearn.preprocessing import StandardScaler from sklearn.datasets import load_iris from sklearn.model_selection import train_test_split import pandas as pd import numpy as np iris=load_iris() df=pd.DataFrame(iris.data,columns=iris.feature_names) df['sample']=iris.target train_x=df.iloc[:,:4] train_y=df.iloc[:,-1] x_train,x_test,y_train,y_test=train_test_split(train_x,train_y,test_size=0.3,random_state=0) #一般这样使用,其中fit_transform可以代替fit位置 scaler=preprocessing.StandardScaler().fit(x_train) scaler.transform(x_train) scaler.transform(x_test)
其中计算原理,标准化之后的值如下:
#(x-均值)/标准差 (x_train.values[:,0]- x_train.values[:,0].mean())/ x_train.values[:,0].std()
2.最小-最大规范化
使用这个缩放的情况包括:增强极小方差的值还有保留稀疏样本中的零值。也叫作最大最小标准化,[0,1]标准化
对原始数据的线性变换,使得结果落在[ 0,1 ]区间,
z=(x-min)/(max-min)
这种方法有一个缺陷就是当有新数据加入时,可能导致max和min的变化,需要重新定义
#feature_range: 定义归一化范围,注用()括起来 scaler = preprocessing.MinMaxScaler(feature_range=(0, 1)).fit(train_data) scaler.transform(train_data) scaler.transform(test_data)
还有一个例子:
import numpy as np from sklearn import preprocessing X_train = np.array([[ 1., -1., 2.], [ 2., 0., 0.], [ 0., 1., -1.]]) min_max_sacler = preprocessing.MinMaxScaler() min_max_sacler.fit(X_train) print(min_max_sacler.transform(X_train)) ''' [[0.5 0. 1. ] [1. 0.5 0.33333333] [0. 1. 0. ]] '''
3.正则化(normalize)
首先求出样本的p范数,然后该样本的所有元素都要除以该范数,这样最终使得每个样本的范数都是1。
规范化(Normalization)是将不同变化范围的值映射到相同的固定范围,常见的是[0,1],也成为归一化
该方法主要应用于文本分类和聚类中
sklearn.preprocessing.Normalizer(norm=’l2’, copy=True)
norm:可以为l1、l2或max,默认为l2
- 若为l1时,每个样本(每行)的值除以每个样本(每行)各值的绝对值之和
- 若为l2时,变换后每个样本(每行)的各维特征的平方和为1
- 若为max时,样本各个特征值除以样本中特征值最大的值
也有这样的说法:
需要说明是,这里的归一化不是对一列的特征进行操作,而是对一行的样本(记录)进行操作。归一化适用于这样的场景:需要使用点积,或者有的模型需要对样本的相似性进行度量。
preprocessing中的normalize方法提供了这样的操作,这个方法有个参数叫做norm,取值可以为 ‘l1’,’l2’,’max’,取不同的值,使用不同的方式进行归一化。
当取值为’l1‘的时候,运用l1范数进行归一化,计算的方法是 :
运用l2范数进行归一化的时候,计算方法是这样的:
preproceing 的Normalizer也提供了标准化的方法,可以进行fit和transform操作,而preprocessing.normalize()函数不可以
from sklearn import preprocessing X = [[ 1., -1., 2.], [ 2., 0., 0.],[ 0., 1., -1.]] #1、可以使用preprocessing.normalize()函数对指定数据进行转换: preprocessing.normalize(X, norm='l2') ''' array([[ 0.40824829, -0.40824829, 0.81649658], [ 1. , 0. , 0. ], [ 0. , 0.70710678, -0.70710678]]) ''' preprocessing.normalize(X, norm='l1') ''' array([[ 0.25, -0.25, 0.5 ], [ 1. , 0. , 0. ], [ 0. , 0.5 , -0.5 ]]) ''' preprocessing.normalize(X, norm='max') ''' array([[ 0.5, -0.5, 1. ], [ 1. , 0. , 0. ], [ 0. , 1. , -1. ]]) ''' #2、可以使用processing.Normalizer()类实现对训练集和测试集的拟合和转换: normalizer = preprocessing.Normalizer().fit(X)#fit does nothing normalizer #Normalizer(copy=True, norm='l2') normalizer.transform(X) normalizer.transform([[-1., 1., 0.]]) # array([[-0.70..., 0.70..., 0. ...]])
norm不同算法:
#norm='l2', X = [[ 1., -1., 2.], [ 2., 0., 0.],[ 0., 1., -1.]] X=np.array(X) X/np.sqrt(np.sum(X*X,axis=1)) #norm='l1' X = [[ 1., -1., 2.], [ 2., 0., 0.],[ 0., 1., -1.]] X=np.array(X) X/np.sum(abs(X),axis=1) #norm='max' X = [[ 1., -1., 2.], [ 2., 0., 0.],[ 0., 1., -1.]] X=np.array(X) X/np.max(X,axis=0)
4.one-hot编码
one-hot编码是一种对离散特征值的编码方式,在LR模型中常用到,用于给线性模型增加非线性能力
就是看看每个特征有多少个唯一值n,然后组成n列,按照顺序排唯一值,如果轮到该值,则1,其余是0
from sklearn import preprocessing data = [[0, 0, 3], [1, 1, 0], [0, 2, 1], [1, 0, 2]] encoder = preprocessing.OneHotEncoder().fit(data) encoder.transform(data).toarray() #输出 array([[1., 0., 1., 0., 0., 0., 0., 0., 1.], [0., 1., 0., 1., 0., 1., 0., 0., 0.], [1., 0., 0., 0., 1., 0., 1., 0., 0.], [0., 1., 1., 0., 0., 0., 0., 1., 0.]])
5.特征二值化
Binarizer类和binarize方法根据指定的阈值将特征二值化,小于等于阈值的,将特征值赋予0,大于特征值的赋予1,其阈值threshold默认都为0
sklearn.preprocessing.binarize(X, threshold=0.0, copy=True)
binarizer = sklearn.preprocessing.Binarizer(threshold=1.1)
binarizer.transform(X)
6.标签编码(Label encoding)
sklearn.preprocessing.LabelEncoder():标准化标签,将标签值统一转换成range(标签值个数-1)范围内
from sklearn import preprocessing le = preprocessing.LabelEncoder() le.fit([1,2,2,6,3]) #获取标签值 le.classes_ #array([1, 2, 3, 6]) #将标签标准化 le.transform([1, 1, 2, 6]) #array([0, 0, 1, 2]) #将标准化的标签值反转 le.inverse_transform([0, 0, 2, 3, 1]) #array([1, 1, 3, 6, 2]) #非数值型转化为数值型 le.fit(["paris", "paris", "tokyo", "amsterdam"]) le.transform(["tokyo", "tokyo", "paris"]) #array([2, 2, 1])
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· winform 绘制太阳,地球,月球 运作规律
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人