【机器学习】sklearn对数据预处理

文章目录

  • 数据处理步骤
  • 观察数据
  • 数据无量纲化
  • 缺失值处理
  • 处理分类型特征
  • 处理连续型特征


数据处理步骤

  1. 数据无量纲化
  2. 缺失值处理
  3. 处理分类型特征:编码与哑变量
  4. 处理连续型特征:二值化与分段

观察数据

通过pandas读取数据,通过headinfo方法大致查看一下数据
在这里插入图片描述在这里插入图片描述结论:

  1. 暂时无需进行无量纲化处
  2. AgeEmbarked需要进行缺失值处理
  3. 处理分类型特征:SexEmbarkedSurvived这几个特征的数据只有几类可以转换为数值型变量。
  4. 处理连续型特征:Age连续型可以进行段处理成几类。

数据无量纲化

在机器学习算法实践中,我们往往有着将不同规格的数据转换到同一规格,或不同分布的数据转换到某个特定分布的需求,这种需求统称为将数据“无量纲化”。

无量纲化后可以加快求解速度。

数据的无量纲化可以是线性的,也可以是非线性的。
线性的无量纲化包括中心化(Zero-centered或者Meansubtraction)处理和缩放处理(Scale)。中心化的本质是让所有记录减去一个固定值,即让数据样本数据平移到某个位置。缩放的本质是通过除以一个固定值,将数据固定在某个范围之中,取对数也算是一种缩放处理。

由于上述无需该处理,这个进行构造数据进行操作:

  1. 归一化

当数据(x)按照最小值中心化后,再按极差(最大值 - 最小值)缩放,数据移动了最小值个单位,并且会被收敛到[0,1]之间,而这个过程,就叫做数据归一化(Normalization,又称Min-Max Scaling)。

x ∗ = x i − m i n ( x ) m a x ( x ) − m a x ( x ) x^*=\frac{ x_i-min(x)}{max(x)-max(x) } x=max(x)max(x)ximin(x)

preprocessing.MinMaxScaler
(1) 构造数据

from sklearn.preprocessing import MinMaxScaler
import pandas as pd
data = [[-1, 2], [-0.5, 6], [0, 10], [1, 18]]
pd.DataFrame(data)

在这里插入图片描述(2)归一化

scaler = MinMaxScaler() #实例化
result_ = scaler.fit_transform(data) #训练和导出结果一步达成
result_

在这里插入图片描述可以逆转,把归一化的数据变回原来数据

scaler.inverse_transform(result) #将归一化后的结果逆转

在这里插入图片描述

MinMaxScaler类有一个很重要的参数feature_range默认是元组(0,1):把数据压缩到的范围。

#使用MinMaxScaler的参数feature_range实现将数据归一化到[0,1]以外的范围中
data = [[-1, 2], [-0.5, 6], [0, 10], [1, 18]]
scaler = MinMaxScaler(feature_range=(5,10)) #依然实例化
result = scaler.fit_transform(data) #fit_transform一步导出结果
result

在这里插入图片描述当X中的特征数量非常多的时候,fit会报错并表示,数据量太大了我计算不了,此时使用partial_fit作为训练接口scaler = scaler.partial_fit(data)

  1. 数据标准化

当数据(x)按均值(μ)中心化后,再按标准差(σ)缩放,数据就会服从为均值为0,方差为1的正态分布(即标准正态分布),而这个过程,就叫做数据标准化(Standardization,又称Z-score normalization),公式如下:
x ∗ = x − μ σ x^*=\frac{ x-μ}{σ} x=σxμ

preprocessing.StandardScaler

from sklearn.preprocessing import StandardScaler
data = [[-1, 2], [-0.5, 6], [0, 10], [1, 18]]
scaler = StandardScaler() #实例化
x_std = scaler.fit_transform(data) 

在这里插入图片描述一样可以逆转:

scaler.inverse_transform(x_std)

在这里插入图片描述

  1. 总结
    对于StandardScalerMinMaxScaler来说,空值NaN会被当做是缺失值,在fit的时候忽略,在transform的时候保持缺失NaN的状态显示。并且,尽管去量纲化过程不是具体的算法,但在fit接口中,依然只允许导入至少二维数组,一维数组导入会报错。

大多数机器学习算法中,会选择StandardScaler来进行特征缩放,因为MinMaxScaler对异常值非常敏感。在PCA,聚类,逻辑回归,支持向量机,神经网络这些算法中,StandardScaler往往是最好的选择。
在这里插入图片描述


缺失值处理

sklearn库中处理缺失值的类是SimpleImputer,这个类的相关参数:

参数含义&输入
missing_values告诉SimpleImputer,数据中的缺失值长什么样,默认空值np.nan
strategy我们填补缺失值的策略,默认均值。
输入“mean”使用均值填补(仅对数值型特征可用)
输入“median"用中值填补(仅对数值型特征可用)
输入"most_frequent”用众数填补(对数值型和字符型特征都可用)
输入“constant"表示请参考参数“fill_value"中的值(对数值型和字符型特征都可用)
fill_value当参数startegy为”constant"的时候可用,可输入字符串或数字表示要填充的值,常用0
copy默认为True,将创建特征矩阵的副本,反之则会将缺失值填补到原本的特征矩阵中去。

在这里插入图片描述
AgeEmbarked需要进行缺失值处理:

(1)Age

Age = data.loc[:,"Age"].values.reshape(-1,1) #sklearn当中特征矩阵必须是二维

reshape方法将其由一维处理到二维,sklearn对特征的处理,必须二维,不然会报错。

from sklearn.impute import SimpleImputer
imp_mean = SimpleImputer() #实例化,默认均值填补
imp_median = SimpleImputer(strategy="median") #用中位数填补
imp_0 = SimpleImputer(strategy="constant",fill_value=0) #用0填补

实例化3种方式填充。

imp_mean = imp_mean.fit_transform(Age) #fit_transform一步完成调取结果
imp_median = imp_median.fit_transform(Age)
imp_0 = imp_0.fit_transform(Age)
#在这里我们使用中位数填补Age
data.loc[:,"Age"] = imp_median
data.info()

在这里插入图片描述

也可以一步完成:

data.loc[:,"Age"] = SimpleImputer().fit_transform(Age)

在这里插入图片描述(2)Embarked
这个特征只缺了2个数据,可以直接删掉,影响不大。但是如果面对缺失较多的文字型数据可以使用众数进行填充most_frequent

data.loc[:,"Embarked"] = SimpleImputer(strategy = "most_frequent").fit_transform(Embarked)

在这里插入图片描述
补:pandas填充更方便:

data.loc[:,"Age"] = data.loc[:,"Age"].fillna(data.loc[:,"Age"].median())

处理分类型特征

在机器学习中,大多数算法,譬如逻辑回归,支持向量机SVM,k近邻算法等都只能够处理数值型数据,不能处理文字,在sklearn当中,除了专用来处理文字的算法,其他算法在fit的时候全部要求输入数组或矩阵,也不能够导入文字型数据(其实手写决策树和普斯贝叶斯可以处理文字,但是sklearn中规定必须导入数值型)。

将文字型数据转换为数值型:

在这里插入图片描述

  1. 标签数据[Yes,No,Unkown]=>[0,1,2] ,LabelEncoder类专门处理标签,可以输入一维向量,特征类的必须是二维及以上。
from sklearn.preprocessing import LabelEncoder
y = data.iloc[:,-1] #要输入的是标签,不是特征矩阵,所以允许一维
le = LabelEncoder() #实例化
le = le.fit(y) #导入数据
label = le.transform(y) #transform接口调取结果

label就是我们处理后的数据:
在这里插入图片描述可以通过classes_看原有的类别:
在这里插入图片描述也和其他的一样,可以一步到位,或者逆转:
在这里插入图片描述

data.iloc[:,-1] = label #让标签等于我们运行出来的结果
data.head()

在这里插入图片描述一步到位:

from sklearn.preprocessing import LabelEncoder
data.iloc[:,-1] = LabelEncoder().fit_transform(data.iloc[:,-1])
  1. SexEmbarked特征变量处理:OrdinalEncoder
from sklearn.preprocessing import OrdinalEncoder
#接口categories_对应LabelEncoder的接口classes_,一模一样的功能
data_ = data.copy()
data_.head()
OrdinalEncoder().fit(data_.iloc[:,1:-1]).categories_

在这里插入图片描述

data_.iloc[:,1:-1] = OrdinalEncoder().fit_transform(data_.iloc[:,1:-1])
data_.head()

【这样做不太对,原本毫无关联的文字型变量,现在变成有数学含义的数字型,赋予了大小等其他数学含义】

直接pass掉OrdinalEncoder类处理特征数据,采用OneHotEncoder独热编码:
在这里插入图片描述由原本的一列变成变成多列,列数为类别数。

from sklearn.preprocessing import OneHotEncoder
X = data.iloc[:,1:-1]
enc = OneHotEncoder(categories='auto').fit(X)
result = enc.transform(X).toarray()
result

在这里插入图片描述可以查看每一列的含义:

enc.get_feature_names_out()

在这里插入图片描述也可以还原到原来的两列:
在这里插入图片描述然后需要做的就是,给原数据拼接上面的数据,删除独热编码之前的类,重命名索引名:

#axis=1,表示跨行进行合并,也就是将量表左右相连,如果是axis=0,就是将量表上下相连
newdata = pd.concat([data,pd.DataFrame(result)],axis=1)

在这里插入图片描述

newdata.drop(["Sex","Embarked"],axis=1,inplace=True)
newdata.columns =["Age","Survived","Female","Male","Embarked_C","Embarked_Q","Embarked_S"]

在这里插入图片描述

总结:
在这里插入图片描述


处理连续型特征

  1. 二值化:
    根据阈值将数据二值化(将特征值设置为0或1),用于处理连续型变量。大于阈值的值映射为1,而小于或等于阈值的值映射为0。默认阈值为0时,特征中所有的正值都映射到1。
from sklearn.preprocessing import Binarizer
X = data_2.iloc[:,0].values.reshape(-1,1) #类为特征专用,所以不能使用一维数组
transformer = Binarizer(threshold=30).fit_transform(X)
transformer

在这里插入图片描述

data_2.iloc[:,0] = transformer
  1. 分段:KBinsDiscretizer
    这是将连续型变量划分为分类变量的类,能够将连续型变量排序后按顺序分箱后编码。总共包含三个重要参数:
参数含义&输入
n_bins每个特征中分箱的个数,默认5,一次会被运用到所有导入的特征
encode编码的方式,默认“onehot”
onehot”:做哑变量,之后返回一个稀疏矩阵,每一列是一个特征中的一个类别,含有该类别的样本表示为1,不含的表示为0
ordinal”:每个特征的每个箱都被编码为一个整数,返回每一列是一个特征,每个特征下含有不同整数编码的箱的矩阵
onehot-dense”:做哑变量,之后返回一个密集数组。
strategy用来定义箱宽的方式,默认"quantile"
“uniform”:表示等宽分箱,即每个特征中的每个箱的最大值之间的差为(特征.max() - 特征.min())/(n_bins)
“quantile”:表示等位分箱,即每个特征中的每个箱内的样本数量都相同
“kmeans”:表示按聚类分箱,每个箱中的值到最近的一维k均值聚类的簇心得距离都相同
from sklearn.preprocessing import KBinsDiscretizer
X = data.iloc[:,0].values.reshape(-1,1)
est = KBinsDiscretizer(n_bins=3, encode='ordinal', strategy='uniform', subsample=None)
est.fit_transform(X)

在这里插入图片描述采用独热编码分成多列:

est = KBinsDiscretizer(n_bins=3, encode='onehot', strategy='uniform', subsample=None)
#查看转换后分的箱:变成了哑变量
est.fit_transform(X).toarray()

在这里插入图片描述


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

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

相关文章

【ppt技巧】ppt里的图片如何提取出来?

之前分享过如何将PPT文件导出成图片,今天继续分享PPT技巧,如何提取出PPT文件里面的图片。 首先,我们将PPT文件的后缀名,修改为rar,将文件改为压缩包文件 然后我们将压缩包文件进行解压 最好是以文件夹的形式解压出来…

数据结构与算法(三)

文章目录 数据结构与算法(三)9 链表及其相关面试题9.1 链表查找9.2 给定一个单链表的头节点head,请判断该链表是否为回文结构9.3 链表的分区9.4 链表的复制10 链表相关面试题(续)、二叉树的常见遍历10.1 判断链表相交10.2 链表删除10.3 二叉树先序、中序、后序的递归遍历和…

C++笔记之std::future的用法

C笔记之std::future的用法 code review! 文章目录 C笔记之std::future的用法1.C中std::future和std::async总是一起出现吗?2.主要特点和用法3.一个完整的例子4.std::future 存放的是一个结果吗?5.cppreference——std::future 1.C中std::future和std::a…

3D 生成重建007-Fantasia3D和Magic3d两阶段玩转文生3D

3D生成重建3D 生成重建007-Fantasia3D和magic3d 文章目录 0 论文工作1 论文方法1.1 magic3d1.2 Fantasia3D 2 效果2.1 magic3d2.2 fantasia3d 0 论文工作 两篇论文都是两阶段法进行文生3d,其中fantasia3D主要对形状和外表进行解耦,然后先对geometry进行…

048:mapboxGL本地上传geojson文件,在map上解析显示图形

第048个 点击查看专栏目录 本示例的目的是介绍演示如何在vue+mapbox中本地上传geojson文件,通过mapbox加载geojson数据的方法解析,在地图上显示图形。 直接复制下面的 vue+mapbox源代码,操作2分钟即可运行实现效果 文章目录 示例效果配置方式示例源代码(共112行)相关API…

华为云云耀云服务器L实例评测|华为云耀云服务器L实例评测包管理工具安装软件(六)

七、华为云耀云服务器L实例评测包管理工具安装软件: 根据企业级项目架构图所示,本章主要是安装公司企业项目的基本环境LNMP,相关的包管理器Composer、Node、Npm、Yarn安装,评测一下包管理工具安装软件是否存在问题,如果…

[论文分享] EnBinDiff: Identifying Data-Only Patches for Binaries

EnBinDiff: Identifying Data-Only Patches for Binaries [TDSC 2021] 在本文中,我们将重点介绍纯数据补丁,这是一种不会引起任何结构更改的特定类型的安全补丁。作为导致假阴性的最重要原因之一,纯数据补丁成为影响所有最先进的二进制差分方…

代码生成器实现

代码生成器实现 实现封装元数据的工具类实现代码生成器的代码编写掌握模板创建的 构造数据模型 需求分析 借助Freemarker机制可以方便的根据模板生成文件,同时也是组成代码生成器的核心部分。对于Freemarker而 言,其强调 数据模型 模板 文件 的思…

Java idea查看自定义注解的调用地方

Java idea查看自定义注解的调用地方

学信息系统项目管理师第4版系列27_项目集管理和项目组合管理

1. 项目集发起人 1.1. 负责承诺将组织的资源应用于项目集,并致力于使项目集取得成功的人 1.2. 典型职责 1.2.1. 为项目集提供资金,确保项目集目标与战略愿景保持一致; 1.2.2. 使效益实现交付 1.2.3. 消除项目集管理与交付的困难和障碍 …

Qt 布局(QLayout 类QStackedWidget 类) 总结

一、QLayout类(基本布局) QLayout类是Qt框架中用于管理和排列QWidget控件的布局类。它提供了一种方便而灵活的方式来自动布局QWidget控件。QLayout类允许您以一种简单的方式指定如何安排控件,并能够自动处理控件的位置和大小,以使其适应更改的父窗口的大…

排序优化:如何实现一个通用的、高性能的排序函数?

文章来源于极客时间前google工程师−王争专栏。 几乎所有的编程语言都会提供排序函数,比如java中的Collections.sort()。在平时的开发中,我们都是直接使用,这些排序函数是如何实现的?底层都利用了哪种排序算法呢? 问题…

WPF DataGrid详细列表手动显示与隐藏

设置显示序号与折叠显示样式 <DataTemplate x:Key"dtNum"><Button BorderBrush"Transparent" Style"{x:Null}" Click"BtnRowDetail_ShowHideClick" FontSize"16" Background"Transparent"><Stack…

【ELK 使用指南】ELK + Filebeat 分布式日志管理平台部署

ELK和EFLK 一、前言1.1 日志分析的作用1.2 需要收集的日志1.3 完整日志系统的基本特征 二、ELK概述2.1 ELK简介2.2 为什么要用ELK?2.3 ELK的组件 三、ELK组件详解3.1 Logstash3.1.1 简介3.1.2 Logstash命令常用选项3.1.3 Logstash 的输入和输出流3.1.4 Logstash配置文件 3.2 E…

零代码编程:用ChatGPT批量采集bookroo网页上的英文书目列表

bookroo网页上有很多不错的英文图书书目。比如这个关于儿童花样滑冰的书单&#xff1a; https://bookroo.com/explore/books/topics/ice-skating 怎么批量下载下来呢&#xff1f; 这个网页是动态网页&#xff0c;要爬取下来比较麻烦&#xff0c;可以先查看源代码&#xff0c;…

Leetcode622.设计循环队列

本专栏内容为&#xff1a;leetcode刷题专栏&#xff0c;记录了leetcode热门题目以及重难点题目的详细记录 &#x1f493;博主csdn个人主页&#xff1a;小小unicorn ⏩专栏分类&#xff1a;Leetcode &#x1f69a;代码仓库&#xff1a;小小unicorn的代码仓库&#x1f69a; &…

第五十六章 学习常用技能 - 执行 SQL 查询

文章目录 第五十六章 学习常用技能 - 执行 SQL 查询执行 SQL 查询检查对象属性 第五十六章 学习常用技能 - 执行 SQL 查询 执行 SQL 查询 要运行 SQL 查询&#xff0c;请在管理门户中执行以下操作&#xff1a; 选择系统资源管理器 > SQL。如果需要&#xff0c;请选择标题…

苹果修复了旧款iPhone上的iOS内核零日漏洞

导语 近日&#xff0c;苹果发布了针对旧款iPhone和iPad的安全更新&#xff0c;回溯了一周前发布的补丁&#xff0c;解决了两个被攻击利用的零日漏洞。这些漏洞可能导致攻击者在受影响的设备上提升权限或执行任意代码。本文将介绍这些漏洞的修复情况以及苹果在修复漏洞方面的持续…

创邻科技Galaxybase—激活数据要素的核心引擎

10月11日下午&#xff0c;创邻科技创始人张晨博士受杭州电子科技大学邀请&#xff0c;前往杭电校园开展交流分享。交流会中&#xff0c;张晨博士为现场的师生带来一场题为《图数据库——激活数据要素的新基建》的精彩分享&#xff0c;探讨数字经济时代底层技术的创新价值与图技…

【Java学习之道】线程的概念与作用

引言 今天我们将探索多线程编程的基础概念和作用。对于初学者来说&#xff0c;掌握多线程编程是迈向Java高级技能的重要一步。通过本章的学习&#xff0c;你将了解线程是什么以及它在程序开发中的重要性&#xff0c;为你进一步深入学习和实际工作打下坚实的基础。让我们一起来…