机器学习归一化特征编码


特征缩放

因为对于大多数的机器学习算法和优化算法来说,将特征值缩放到相同区间可以使得获取性能更好的模型。就梯度下降算法而言,例如有两个不同的特征,第一个特征的取值范围为1——10,第二个特征的取值范围为1——10000。在梯度下降算法中,代价函数为最小平方误差函数,所以在使用梯度下降算法的时候,算法会明显的偏向于第二个特征,因为它的取值范围更大。在比如,k近邻算法,它使用的是欧式距离,也会导致其偏向于第二个特征。对于决策树和随机森林以及XGboost算法而言,特征缩放对于它们没有什么影响。

常用的特征缩放算法有两种,归一化(normalization)和标准化(standardization)。归一化算法是通过特征的最大最小值将特征缩放到[0,1]区间范围

归一化(Normalization)

归一化是利用特征的最大最小值,为了方便数据处理,将特征的值缩放到[0,1]区间,对于每一列的特征使用min-max函数进行缩放,可以使处理过程更加便捷、快速,计算。

特征归一化的优势

  • 提升收敛速度 :对于线性model来说,数据归一化后,最优解的寻优过程明显会变得平缓,更容易正确的收敛到最优解。

造成图像的等高线为类似椭圆形状,最优解的寻优过程图像如下:

两个特征区别相差特别大。所形成的等高线比较尖锐。当时用梯度下降法时,很可能要垂直等高线走,需要很多次迭代才能收敛。

而数据归一化之后,损失函数的表达式可以表示为:

 

其中变量的前面系数几乎一样,则图像的等高线为类似圆形形状,最优解的寻优过程图像如下:

 

  • 对两个原始特征进行了归一化处理,其对应的等高线相对来说比较圆,在梯度下降时,可以较快的收敛。
     
  • 提升模型精度:如果我们选用的距离度量为欧式距离,如果数据预先没有经过归一化,那么那些绝对值大的features在欧式距离计算的时候起了决定性作用。 从经验上说,归一化是让不同维度之间的特征在数值上有一定比较性,可以大大提高分类器的准确性。

特征归一化方法MinMaxScaler 

from sklearn.preprocessing import MinMaxScaler
x=[[10001,2],[16020,4],[12008,6],[13131,8]]
min_max_scaler = MinMaxScaler()
X_train_minmax = min_max_scaler.fit_transform(x)#归一化后的结果
X_train_minmax# 它默认将每种特征的值都归一化到[0,1]之间
MinMaxScaler的实现
X_std = (X - X.min(axis=0)) / (X.max(axis=0) - X.min(axis=0))
X_scaled = X_std * (max - min) + min

这是向量化的表达方式,说明X是矩阵,其中

  • X_std:将X归一化到[0,1]之间
  • X.min(axis=0)表示列最小值
  • max,min表示MinMaxScaler的参数feature_range参数。即最终结果的大小范围
       以下例说明计算过程(max=1,min=0)

 

S11=(10001-10001)/(16020-10001)=0
S21=(16020-10001)/(16020-10001)=1
S31=(12008-10001)/(16020-10001)=0.333444
S41=(13131-10001)/(16020-10001)=0.52002
S12=(2-2)/(8-2)=0
S22=(4-2)/(8-2)=0.33
S32=(6-2)/(8-2)=0.6667
S42=(8-2)/(8-2)=1

 数据的标准化

和0-1标准化不同,Z-score标准化利用原始数据的均值(mean)和标准差(standard deviation)进行数据的标准化。同样是逐列进行操作,每一条数据都减去当前列的均值再除以当前列的标准差,在这种标准化操作下,如果原数据服从正态分布,处理之后的数据服从标准正态分布。Z-Score标准化计算公式如下:

我们也可通过如下方式对张量进行Z-Score标准化处理。 

from sklearn.preprocessing import StandardScaler
x=[[10001,2],[16020,4],[12008,6],[13131,8]]
ss = StandardScaler()
X_train = ss.fit_transform(x)
X_trainarray([[-1.2817325 , -1.34164079],[ 1.48440157, -0.4472136 ],[-0.35938143,  0.4472136 ],[ 0.15671236,  1.34164079]])

 和0-1标准化不同,Z-Score标准化并不会将数据放缩在0-1之间,而是均匀地分布在0的两侧

特征编码

我们拿到的数据通常比较脏乱,特征变量除了数值外可能还会包括带有各种非数字特殊符号等特征值,比如中文。但一般的机器学习模型一般都是处理数值型的特征值,因此需要将一些非数值的特殊特征值转为为数值,因为只有数字类型才能进行计算。因此,对于各种特殊的特征值,我们都需要对其进行相应的编码,也是量化的过程,这就要用到特征编码。

编码方法

  • LabelEncoder :适合处理字符型数据或label类,一般先用此方法将字符型数据转换为数值型,然后再用以下两种方法编码;
  • get_dummies :pandas 方法,处理DataFrame 数据更便捷
  • OneHotEncoder :更普遍的编码方法

LabelEncoder🏖️

label-encoding就是用标签进行编码的意思,即我们给特征变量自定义数字标签,量化特征。

将离散的数值或字符串,转化为连续的数值型数据。n个类别就用0到n-1个数表示。没有扩维,多用于标签列的编码(如果用于特征的编码,那编码后还要用get_dummies或OneHotEncoder进行再编码,才能实现扩维)。

import pandas as pd
Class=['大一','大二','大三','大四']
df = pd.DataFrame({'Class':Class})
classMap = {'大一':1,'大二':2,'大三':3,'大四':4}
df['Class'] = df['Class'].map(classMap)

上面就将Class特征进行相应的编码。其实,Label encoding并没有任何限制,你也可以将Class定义为10,20,30,40,只不过1,2,3,4看起来比较方便。因此总结概括,Label encoding就是将原始特征值编码为自定义的数字标签完成量化编码过程。

get_dummies🏖️

pandas编码工具,直接将数据扩维

pandas.get_dummies(data, prefix=None, prefix_sep='_', dummy_na=False, columns=None, sparse=False, drop_first=False, dtype=None)
import pandas as pd  # 创建一个包含分类变量的 DataFrame  
data = {'Color': ['Red', 'Blue', 'Green', 'Red', 'Blue']}  
df = pd.DataFrame(data)  print("原始 DataFrame:")  
print(df)  # 使用 get_dummies 进行独热编码  
df_dummies = pd.get_dummies(df)  print("\n独热编码后的 DataFrame:")  
print(df_dummies)原始 DataFrame:  Color  
0    Red  
1   Blue  
2  Green  
3    Red  
4   Blue  独热编码后的 DataFrame:  Color_Blue  Color_Green  Color_Red  
0           0            0          1  
1           1            0          0  
2           0            1          0  
3           0            0          1  
4           1            0          0

同时在pandas可以指定 columns参数,pd.get_dummies(df,columns=[“length”,“size”])指定被编码的列,返回被编码的列和不被编码的列

df_4 =pd.get_dummies(df,columns=["length","size"])

OneHotEncoder🏖️

当然,除了自然顺序编码外,常见的对离散变量的编码方式还有独热编码,独热编码的过程如下

不难发现,独热编码过程其实和我们此前介绍的哑变量创建过程一致(至少在sklearn中并无差别)。对于独热编码的过程,我们可以通过pd.get_dummies函数实现,也可以通过sklearn中OneHotEncoder评估器(转化器)来实现。 

import numpy as np  
from sklearn.preprocessing import OneHotEncoder  # 假设我们有一些分类数据  
categories = np.array(['cat', 'dog', 'fish', 'cat', 'dog', 'bird']).reshape(-1, 1)  # 创建 OneHotEncoder 实例  
encoder = OneHotEncoder(sparse=False)  # 使用数据拟合编码器并转换数据  
onehot = encoder.fit_transform(categories)  # 输出独热编码的结果  
print(onehot)  # 输出编码器的类别  
print(encoder.categories_)[[1. 0. 0.]  [0. 1. 0.]  [0. 0. 1.]  [1. 0. 0.]  [0. 1. 0.]  [0. 0. 0.]]  
[array(['bird', 'cat', 'dog', 'fish'], dtype=object)]

对于独热编码的使用,有一点是额外需要注意的,那就是对于二分类离散变量来说,独热编码往往是没有实际作用的。例如对于上述极简数据集而言,Gender的取值是能是M或者F,独热编码转化后,某行Gender_F取值为1、则Gender_M取值必然为0,反之亦然。因此很多时候我们在进行独热编码转化的时候会考虑只对多分类离散变量进行转化,而保留二分类离散变量的原始取值。此时就需要将OneHotEncoder中drop参数调整为’if_binary’,以表示跳过二分类离散变量列

sklearn中逻辑回归的参数解释

  • C 惩罚系数
  • penalty 正则化项

 相比原始损失函数,正则化后的损失函数有两处发生了变化,其一是在原损失函数基础上乘以了系数C,其二则是加入了正则化项。其中系数C也是超参数,需要人工输入,用于调整经验风险部分和结构风险部分的权重,C越大,经验风险部分权重越大,反之结构风险部分权重越大。此外,在L2正则化时,采用的表达式,其实相当于是各参数的平方和除以2,在求最小值时本质上和w的2-范数起到的作用相同,省去开平方是为了简化运算,而除以2则是为了方便后续求导运算,和2次方结果相消。

其实除了最小二乘法和梯度下降以外,还有非常多的关于损失函数的求解方法,而选择损失函数的参数,就是solver参数。

逻辑回归可选的优化方法包括:

  • liblinear,这是一种坐标轴下降法,并且该软件包中大多数算法都有C++编写,运行速度很快,支持OVR+L1或OVR+L2;
  • lbfgs,全称是L-BFGS,牛顿法的一种改进算法(一种拟牛顿法),适用于小型数据集,并且支持MVM+L2、OVR+L2以及不带惩罚项的情况;
  • newton-cg,同样也是一种拟牛顿法,和lbfgs适用情况相同;
  • sag,随机平均梯度下降,随机梯度下降的改进版,类似动量法,会在下一轮随机梯度下降开始之前保留一些上一轮的梯度,从而为整个迭代过程增加惯性,除了不支持L1正则化的损失函数求解以外(包括弹性网正则化)其他所有损失函数的求解;
  • saga,sag的改进版,修改了梯度惯性的计算方法,使得其支持所有情况下逻辑回归的损失函数求解;
import pandas as pd
import numpy as np
import warnings
warnings.filterwarnings('ignore')
%matplotlib inlinedata = pd.read_csv("creditcard2.csv")from sklearn.preprocessing import MinMaxScaler
data['normAmount'] = MinMaxScaler().fit_transform(data['Amount'].values.reshape(-1, 1))
data = data.drop(['Time','Amount'],axis=1)X = data.iloc[:, data.columns != 'Class'].values
y = data.iloc[:, data.columns == 'Class']['Class'].valuesX_train, X_test, y_train, y_test = train_test_split(X,y,test_size = 0.3, random_state = 114)def kflod_scores(X,y):fold = KFold(5,shuffle=False)c_param_range = [0.01, 0.1, 1]show_result = pd.DataFrame()recalls = []cv = KFold(n_splits=5, shuffle=True, random_state=114)for c_param in c_param_range:lr_model = LogisticRegression(C=c_param, penalty="l2")print('-------------------------------------------')print('正则化惩罚力度: ', c_param)print('-------------------------------------------')print('')result = cross_validate(lr_model, X, y, cv=cv, scoring="recall", verbose=True, n_jobs=-1)print(result["test_score"])recalls.append(np.mean(result["test_score"]))show_result["c_param"] = list(c_param_range)show_result["recall"] = recallsreturn show_result
kflod_scores(X_train,y_train)

刚刚进行的建模存在一些问题:

(1).过程不够严谨,诸如测试集中测试结果不能指导建模、参数选取及搜索区间选取没有理论依据等问题仍然存在;

(2).执行效率太低,如果面对更多的参数(这是更一般的情况),手动执行过程效率太低,无法进行超大规模的参数挑选;

(3).结果不够精确,一次建模结果本身可信度其实并不高,我们很难证明上述挑选出来的参数就一定在未来数据预测中拥有较高准确率。

网格搜索 

sklearn中最常用的搜索策略就是使用GridSearchCV进行全搜索,即对参数空间内的所有参数进行搜索.

 

from sklearn.model_selection import GridSearchCV

 GridSearchCV它的参数主要如下

from sklearn.datasets import load_iris
X, y = load_iris(return_X_y=True)
X_train, X_test, y_train, y_test = train_test_split(X, y, random_state=114)param_grid_simple = {'penalty': ['l1', 'l2'],'C': [1, 0.5, 0.1, 0.05, 0.01]}search = GridSearchCV(estimator=lgr,param_grid=param_grid_simple)search.fit(X_train, y_train)search.best_estimator_
# 训练完成后的最佳评估器search.best_estimator_.coef_
# 逻辑回归评估器的所有属性search.best_score_
# 0.9727272727272727

 

在默认情况下(未修改网格搜索评估器中评估指标参数时),此处的score就是准确率。此处有两点需要注意:

  • 其一:该指标和训练集上整体准确率不同,该指标是交叉验证时验证集准确率的平均值,而不是所有数据的准确率;
  • 其二:该指标是网格搜索在进行参数挑选时的参照依据。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/27062.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Facebook隐私保护:用户数据安全的挑战与应对策略

在当今数字化时代,随着社交媒体的普及和信息技术的快速发展,人们对于个人数据隐私和安全的关注越来越高。作为全球最大的社交网络平台之一,Facebook在用户数据保护方面面临着诸多挑战和责任。本文将深入探讨Facebook在隐私保护方面的现状、面…

k8s+springcloud+nacos部署配置

1 k8s 部署nacos-2.1.2配置k8s-nacos-statefulSet.yaml文件 apiVersion: v1 kind: Service metadata:name: nacos-headlessnamespace: rz-dtlabels:app: nacosannotations:service.alpha.kubernetes.io/tolerate-unready-endpoints: "true" spec:# 3个端口打开&…

拓扑排序和关键路径详解

目录 拓扑排序 关键路径 拓扑排序 如果有一个有向图的任意顶点都无法通过一些有向边回到身边,那么称这个有向图为有向无环图。 拓扑排序是将有向无环图的所有顶点排成一个线性序列,使得对图中的任意两个顶点u,v,如果存在边u->v,那么在…

VMware ESXi 8.0U2c macOS Unlocker OEM BIOS ConnectX-3 网卡定制版 (集成驱动版)

VMware ESXi 8.0U2c macOS Unlocker & OEM BIOS ConnectX-3 网卡定制版 (集成驱动版) 发布 ESXi 8.0U2 集成驱动版,在个人电脑上运行企业级工作负载 请访问原文链接:https://sysin.org/blog/vmware-esxi-8-u2-sysin/,查看最新版。原创作…

UE5.2打包安卓

目录 简介: 一. 根据官网配置 二. 手动定位SDK路径 三: 设置Android基本信息 四: 设置KeyStore 五: 开始打包 六:其他 七. 总结 简介: UE5.2 打包安卓是指将使用 Unreal Engine 5.2 开发的项目编译为可在安卓设备上运行的安装包。 以下是一般的打包步骤: 安装…

centos7 xtrabackup mysql 基本测试(3)---虚拟机环境 安装mysql

centos7 xtrabackup mysql 基本测试(3)—虚拟机环境 安装mysql centos7 安装 mysql5.7 可以在运行安装程序之前导入密钥: sudo rpm --import https://repo.mysql.com/RPM-GPG-KEY-mysql-2022第一步、下载MySQL 安装包: sudo w…

Web前端CreateJS:探索、深化与应用

Web前端CreateJS:探索、深化与应用 在Web前端的世界里,CreateJS是一套功能强大的JavaScript库,它让开发者能够轻松创建富交互性的动画、游戏和应用程序。本文将从四个方面、五个方面、六个方面和七个方面深入探讨CreateJS的魅力与应用。 四…

Spring Cloud全家桶(上)【Nacos、OpenFeign、LoadBalancer、GateWay、金丝雀灰色发布】

0.零基础入门微服务实战课 1.微服务和 Spring Cloud1.1 什么是微服务?1.2 什么是 Spring Cloud?1.3 微服务 VS Spring Cloud 2.为什么要学微服务?3.Spring Cloud 组件介绍1.什么是 Nacos?1.1 Nacos 功能1.1.1 配置中心1.1.2 注册中心 1.2 Na…

HashMap底层源码分析

目录 一、知识点二、数据结构三、resize() 扩容方法四、putVal() 添加数据方法五、remove() 删除方法六、removeTreeNode() 退化链表方法 一、知识点 加载因子: HashMap 的默认的加载因子: 0.75,用来限定阈值(用于控制 HashMap 的饱和度) 阈值…

红酒保存中的摆放方式:倾斜瓶身的重要性

在探讨云仓酒庄雷盛红酒的保存方法时,我们不得不提及一个关键的细节:瓶身的倾斜。许多人可能认为红酒的保存方式仅仅是温度控制和存储环境的湿度问题,然而实际上,摆放方式同样至关重要。雷盛红酒在保存过程中,需要一个…

安川机器人MA1440减速机维修方法

一、安川机械臂减速器维修方法 1. 齿轮磨损维修 对于轻微磨损的齿轮,可以通过重新调整啮合间隙来恢复性能。对于严重磨损的齿轮,需要更换新安川MA1440机械手齿轮箱齿轮。 2. 轴承损坏维修 对于损坏的轴承,需要更换新的轴承。在更换过程中&…

Linux/Ubuntu/Debian常用服务管理命令

Linux/Ubuntu/Debian常用服务管理命令 在 Linux 系统中,服务管理是系统管理员日常维护工作的重要组成部分。通过一些常用的命令,我们可以查看服务状态、启动或停止服务、重启服务等。掌握这些命令,可以让系统管理工作更加高效和便捷。 1. s…

省市县选择三级联动(使用高德API实现)

省市县选择如果自己实现是比较麻烦的,最近发现可以使用高德实现省市县联动选择,实现后来记录一下供大家参考。 文章目录 最终效果:一、准备工作二、完整页面代码 最终效果: 实现单次点击获取省市县名称,选择完成后返回…

Java中的多态性

形成多态性前提:有继承关系,且子类重写父类的方法 场景 一般用于方法的参数传递,形参声明父类,实参传入子类,这样在方法体中调用被重写方法的时候,实际执行的是子类重写的方法,以此形成多态&…

web端即时通信技术

web端即时通信技术 对于IM/消息推送这类即时通讯系统而言,系统的关键就是“实时通信”能力。所谓实时通信有以下两层含义 客户端可以主动向服务端发送信息。 当服务端内容发生变化时,服务端可以实时通知客户端。 HTTP局限 Http是客户端/服务器模式中…

高可用系统的设计原则

降级 在软件开发和系统设计中,降级(Degradation)是一种应对系统压力或异常情况的策略,旨在保持系统的核心功能运行,即使这可能意味着临时牺牲一些非关键功能。降级模式通常分为主动降级和被动降级两种类型&#xff1a…

免费分享:1901-2020全球气候数据集(附下载办法)

长期的全球其后数据不仅能够揭示长期的气候趋势,还为农业、水资源管理、公共卫生等多个领域的决策提供科学依据,对于推动可持续发展具有重要意义。 数据集简介 CRU TS(Climatic Research Unit gridded Time Series)数据集&#…

【Kafka】SpringBoot整合Kafka详细介绍及代码示例

Kafka介绍 Apache Kafka是一个分布式流处理平台。它最初由LinkedIn开发,后来成为Apache软件基金会的一部分,并在开源社区中得到了广泛应用。Kafka的核心概念包括Producer、Consumer、Broker、Topic、Partition和Offset。 Producer:生产者&a…

车载android开发 carservice(一)

车载android开发 carservice是什么? 车载Android开发中的CarService是一个专门为汽车环境设计的系统服务。CarService通常是Android Automotive OS的一部分,提供一系列API和框架,允许开发人员构建与汽车相关的应用和服务。 以下是CarService的一些主要功能和作用: 车辆数…

宽睿数字平台兼容TDengine 等多种数据库,提供行情解决方案

小T导读:最近,涛思数据与宽睿金融宣布了一项重要合作。在此之前,宽睿金融对 TDengine 进行了性能测试,并根据测试报告的结果,决定将 TDengine 接入宽睿数字平台,以提升高密度行情处理效率。本文将详细介绍此…