scikit-learn机器学习八 (数据预处理)
sk-learn机器学习之特征工程和数据预处理
- 特征工程和数据预处理的重要性
- 数据无量纲化
- 归一化
- 标准化
- 处理缺失值
- 分类特征处理:编码,哑变量
- 标签处理(LabelEncoder)
- 特征处理(OrdinalEncoder)
- 独热编码,哑变量
- 处理连续性特征:二值化与分段
特征工程和数据预处理的重要性
我们在学习机器学习时,很多用来练习的数据都是非常完美的,特别是sk-learn库中的数据,都是非常非常好的数据——但是!!!
这在实际的数据应用中几乎不可能出现!
没有经过处理的数据直接放在模型里跑,很多时候结果都不尽人意,有一句话说得好:
数据和特征决定了机器学习的上限,而模型和算法只是逼近这个上限而已
可见数据预处理和特征工程有多么重要!!!
可见数据预处理和特征工程有多么重要!!!
可见数据预处理和特征工程有多么重要!!!
一直有种感觉,大数据跟人工智能是不分家的,没有数据的挖掘和处理,那么机器学习和深度学习的性能会大大下降!!!
这里简单的介绍数据挖掘和处理的五大流程:
- 获取原始数据
- 数据预处理:让数据适应,匹配模型
- 特征工程:将原始数据转换为更能代表预测模型的潜在问题的特征的过程,可以提取特征,创造特征(降维算法)
- 建模
- 测试模型性能
下面就开始详细介绍数据预处理(篇幅原因特征工程放在下一篇博文)
数据预处理(Preprocessing impute)
数据无量纲化
将不同规格的数据转换到同一规格,或者将分布不同的数据转换到某个特定分布我们称为数据无量纲化
但是对于决策树和随机森林,我们不需要无量纲化,决策树可以把任意数据很好的处理
一般我们用两种方法:归一化和标准化
归一化
简单来说就是将数据收敛到[0, 1]之间,归一化的数据服从正态分布
我们使用MinMaxScaler来完成归一化:
from sklearn.preprocessing import MinMaxScalerdata = [[1, 2], [3, 6],[0, 5], [2, 10]]scaler = MinMaxScaler()re = scaler.fit_transform(data)print(re)print(scaler.inverse_transform(re))
# 还原数据scaler = MinMaxScaler(feature_range=[2, 5])
# 将数据缩放到特定区间re = scaler.fit_transform(data)print(re)# 当数据过大时,使用scaler.partial_fit
输出结果:
[[0.33333333 0. ][1. 0.5 ][0. 0.375 ][0.66666667 1. ]]# 收敛到0, 1
[[ 1. 2.][ 3. 6.][ 0. 5.][ 2. 10.]]# 还原数据
[[3. 2. ][5. 3.5 ][2. 3.125][4. 5. ]]# 收敛到2, 5
当然熟悉numpy的小伙伴也可以使用numpy实现归一化哟!
标准化
将数据变成均值为0, 方差为1的服从正态分布的过程叫做标准化
from sklearn.preprocessing import StandardScalerdata = [[1, 2], [3, 6],[0, 5], [2, 10]]scaler = StandardScaler()scaler.fit(data)
# fit,本质是生成均值和方差print(scaler.mean_)
# 查看均值的属性x_std = scaler.transform(data)print(x_std.mean())
# 导出的结果是一个数组,用mean()查看均值print(x_std.std())
# 用std()查看方差re = scaler.fit_transform(data) # 使用fit_transform(data)一步达成结果
print(re)re = scaler.inverse_transform(x_std) # 使用inverse_transform逆转标准化
print(re)
输出结果:
[1.5 5.75] # 原本的均值和方差0.0 # 均值1.0 # 方差[[-0.4472136 -1.31055608][ 1.34164079 0.08737041][-1.34164079 -0.26211122][ 0.4472136 1.4852969 ]] # 标准化的矩阵[[ 1. 2.][ 3. 6.][ 0. 5.][ 2. 10.]] # 还原
处理缺失值
我们使用sklearn.impute.SimpleImputer来进行简单的处理
这里我们使用泰坦尼克号的数据进行操作,首先我们读入数据
import pandas as pddata = pd.read_csv(r"C:\Users\Eddie\Desktop\sk-learn\Narrativedata.csv",index_col=0)# 注意到最后这个参数index_col,#是让编译器读入时不生成索引的,因为该数据原本就带有索引
SimpleImputer()有四个参数:
- missing_values : 数据的缺失值
- strategy : 填补策略:(默认均值)
mean: 均值填补
median: 中值填补
most_frequent: 众数填补
constant: 参考flii_value的值 - fill_value:可输入字符串或者数字表示填补的值
- copy:默认True,创建特征矩阵的副本,反之之间将值填补到原本数据中
这里将年龄和登舱门的数据补充完整:
Age = data.loc[:, "Age"].values.reshape(-1, 1)
# sklearn当中特征矩阵必须是二维
# 这行代码的意思是将所有Age下的值取出来变成二维矩阵from sklearn.impute import SimpleImputerimp_median = SimpleImputer(strategy="median")
#用中位数填补# fit_transform一步完成调取结果
imp_median = imp_median.fit_transform(Age)# 在这里我们使用中位数填补Age
data.loc[:, "Age"] = imp_median# 使用众数填补Embarked
Embarked = data.loc[:, "Embarked"].values.reshape(-1, 1)imp_mode = SimpleImputer(strategy="most_frequent")data.loc[:, "Embarked"] = imp_mode.fit_transform(Embarked)print(data.info())
我们就将数据补充完整了
分类特征处理:编码,哑变量
上面我们都是对数值型数据进行处理,我们知道除了专门处理文字的算法,大多数算法,向前面提到的SVM,K-均值算法,回归算法等都不能处理文本信息。所以我们应当将文字转换为数值,这样的工作我们称之为编码
标签处理(LabelEncoder)
我们处理标签(存活状态)
from sklearn.preprocessing import LabelEncodery = data.iloc[:, -1]
# 要输入的是标签,不是特征矩阵,所以允许一维le = LabelEncoder()
# 实例化label = le.fit_transform(y)
# 导入数据print(label.classes_)
# 属性.classes_查看标签中究竟有多少类别print(label[:20])
# 查看获取的结果label前20个
我们将三种状态:存活,死亡,未知编码为0, 1, 2
输出结果:
['No' 'Unknown' 'Yes']
[0 2 2 2 0 0 0 0 2 2 1 2 0 0 0 1 0 2 0 2]
特征处理(OrdinalEncoder)
基本操作是一样的,我们将性别和登舱门这两个特征也进行编码:
from sklearn.preprocessing import OrdinalEncoderdata_ = data.copy()
# 创建副本print(OrdinalEncoder().fit(data_.iloc[:, 1:-1]).categories_)
# 与上面的class_相似data_.iloc[:, 1:-1] = OrdinalEncoder().fit_transform(data_.iloc[:, 1:-1])print(data_.head())
我们可以看到这样的结果:
[array(['female', 'male'], dtype=object), array(['C', 'Q', 'S'], dtype=object)]Age Sex Embarked Survived
0 22.0 1.0 2.0 No
1 38.0 0.0 0.0 Yes
2 26.0 0.0 2.0 Yes
3 35.0 0.0 2.0 Yes
4 35.0 1.0 2.0 No
性别和登舱门也被编码了
独热编码,哑变量
上面的编码方式会不会有什么问题呢?
我们把舱门的编号转换为0, 1, 2
原本舱门的取值是S,C,Q之间是没有联系的,是名义变量,是不可以用来比较大小或者计算的
但是我们编码为0, 1, 2后我们带入模型学习时,机器可能会认为他们之间会带有数学的性质和联系——给我们建模带来了不准确的信息,这是我们应该避免的
所以对于这种不相干的名义变量,我们使用哑变量,独热编码的方式处理
所以性别和舱门这两个特征都应该使用独热编码将其变为哑变量
from sklearn.preprocessing import OneHotEncoderX = data.iloc[:, 1:-1]
# 选取两个特征
encod = OneHotEncoder(categories='auto').fit(X)result = encod.transform(X).toarray()
# 转换为矩阵
print(result)
print("\n")
print(encod.get_feature_names())
print("\n")# axis=1,表示跨行进行合并,也就是将量表左右相连,如果是axis=0,就是将量表上下相连
newdata = pd.concat([data, pd.DataFrame(result)], axis=1)
print(newdata.head())newdata.drop(["Sex", "Embarked"], axis=1, inplace=True)newdata.columns = ["Age", "Survived", "Female", "Male", "Embarked_C", "Embarked_Q", "Embarked_S"]
# 设置表头print(newdata.head())
输出结果:
[[0. 1. 0. 0. 1.][1. 0. 1. 0. 0.][1. 0. 0. 0. 1.]...[1. 0. 0. 0. 1.][0. 1. 1. 0. 0.][0. 1. 0. 1. 0.]]
# 独热编码后的两个特征,有五个数字是因为五个名义变量['x0_female' 'x0_male' 'x1_C' 'x1_Q' 'x1_S']# 新表Age Sex Embarked Survived 0 1 2 3 4
0 22.0 male S 0 0.0 1.0 0.0 0.0 1.0
1 38.0 female C 2 1.0 0.0 1.0 0.0 0.0
2 26.0 female S 2 1.0 0.0 0.0 0.0 1.0
3 35.0 female S 2 1.0 0.0 0.0 0.0 1.0
4 35.0 male S 0 0.0 1.0 0.0 0.0 1.0Age Survived Female Male Embarked_C Embarked_Q Embarked_S
0 22.0 0 0.0 1.0 0.0 0.0 1.0
1 38.0 2 1.0 0.0 1.0 0.0 0.0
2 26.0 2 1.0 0.0 0.0 0.0 1.0
3 35.0 2 1.0 0.0 0.0 0.0 1.0
4 35.0 0 0.0 1.0 0.0 0.0 1.0
至此我们对于这个数据集的预处理基本完成我们就可以那这个数据去模型中训练啦!
处理连续性特征:二值化与分段
二值化
将数据二值化(0, 1),设置阈值,大于它为1,其余为0
二值化的类:sklearn.preprocessing.Binarizer
一个重要参数:threshold : 规定阈值
分段
将连续性变量划分为分类变量的类,排序分箱
sklearn.preprocessing.KBinsDiscretizer
原型:
KBinsDiscretizer(n_bins=5, encode="onehot", strategy="quantile")
这里列了三个重要参数,第一个是分类的个数,第二个是编码的格式, 第三个是分类的方式
encode
“onehot”:做哑变量,之后返回一个稀疏矩阵,每一列是一个特征中的一个类别,含有该 类别的样本表示为1,不含的表示为0
“ordinal”:每个特征的每个箱都被编码为一个整数,返回每一列是一个特征,每个特征下含 有不同整数编码的箱的矩阵
strategy
用来定义箱宽的方式
“quantile” “uniform”:表示等宽分箱,即每个特征中的每个箱的最大值之间的差为 (特征.max() - 特征.min())/(n_bins)
“quantile”:表示等位分箱,即每个特征中的每个箱内的样本数量都相同
“kmeans”:表示按聚类分箱,每个箱中的值到最近的一维k均值聚类的簇心得距离都相等
特征工程写出来啦!!!
scikit-learn机器学习 九(特征工程)
都看到这里了点个赞呗
scikit-learn机器学习八 (数据预处理)相关推荐
- 机器学习PAL数据预处理
机器学习PAL数据预处理 本文介绍如何对原始数据进行数据预处理,得到模型训练集和模型预测集. 前提条件 完成数据准备,详情请参见准备数据. 操作步骤 登录PAI控制台. 在左侧导航栏,选择模型开发和训 ...
- 机器学习之数据预处理——归一化,标准化
机器学习之数据预处理--归一化,标准化 基础知识 1.什么是特征预处理 2.预处理方法 : 3.预处理API: 数据的标准化(normalization)和归一化 数据的标准化 数据归一化 1 把数变 ...
- 机器学习之数据预处理——数据清洗(缺失值、异常值和重复值的处理)
机器学习之数据预处理--数据清洗缺失值.异常值和重复值的处理 基础知识 技术点总结 数据列缺失的处理方法 1.丢弃(缺失值处理) 1.生成一份随机数据 2.查看哪些值缺失 3.获得含有NA的列 4.获 ...
- 机器学习之数据预处理——特征编码(标签编码,独热编码)
机器学习之数据预处理--特征编码 数据预处理--特征编码 离散数据的编码 标签编码 sklearn LabelEncoder(使用fit_transform函数) sklearn LabelEncod ...
- 机器学习之数据预处理
在sklearn之数据分析中总结了数据分析常用方法,接下来对数据预处理进行总结 当我们拿到数据集后一般需要进行以下步骤: (1)明确有数据集有多少特征,哪些是连续的,哪些是类别的 (2)检查有没有缺失 ...
- 负数如何归一化处理_机器学习之数据预处理
第一节:前言 数据和特征决定了机器学习的上限,而模型和算法只是逼近这个上限而已.由此可见,特征工程在机器学习中占有相当重要的地位. 特征工程:利用数据领域的相关知识来创建能够使机器学习算法达到最佳性能 ...
- [机器学习-sklearn]数据预处理要点总结
数据预处理要点总结 1. 为什么要数据预处理 2. 数据中存在缺失值 2.1 查看数据的完整性(missingno) 2.2 简单删除法 2.3 人工填写(filling manually) 2.4 ...
- 数据标准化处理方法_机器学习系列-数据预处理-数据标准化(归一化)-理论
在做一个具体的机器学习项目中,拿到收集到的数据后,一般都是需要做数据预处理,而标准化(暂时不考虑标准化和归一化的主要区别)是数据预处理中一个比较重要的环节,那么为什么需要对数据进行标准化处理呢? 数据 ...
- 机器学习中数据预处理——标准化/归一化方法(scaler)
由于工作问题比较忙,有两周没有总结一下工作学习中遇到的问题. 这篇主要是关于机器学习中的数据预处理的scaler变化. 工作中遇到的问题是:流量预测问题,拿到的数据差距非常大,凌晨的通话流量很少几乎为 ...
- 深入浅出Python机器学习9——数据预处理、降维、特征提取及聚类
数据预处理 使用 StandScaler 进行数据预处理 首先手工生成一些数据: 用make_blobs 函数时,指定了样本数量 n_samples 为 40,分类 centers 为 ...
最新文章
- 从YARN迁移到k8s,滴滴机器学习平台二次开发是这样做的
- 2012年2月16日
- 20本最好的Linux免费书籍
- Mysql命令行修改字段类型
- 使用docker的mysql镜像
- 关于 android listview 加载数据错位(错乱)问题
- Python的正则表达式笔记
- Abp太重了?轻量化Abp框架
- 后端学习 - SpringBoot
- Linux C高级编程——网络编程之包裹函数
- 网络采集库NCrawler
- AE开发 创建Feature后,需要进行拓扑检查
- Entity Framework 学习总结之三:架构组成介绍
- SAP License:ERP的价格管控
- 电脑脱机状态怎么解除_win7系统如何解除脱机工作 win7系统解除脱机工作步骤【介绍】...
- linux系统windows模拟器下载,Linux开源模拟器Wine 0.9.54版下载
- 如何在 Mac 上格式化 SD 卡?
- 【推荐系统】Criteo数据集介绍
- 互联网的行业都有哪些岗位?
- SVN the working copy needs to be upgraded svn 解决办法
热门文章
- 《多基因病的遗传》学习笔记
- DSP28335软件实验研究--DA_AD模块功能详解
- get_sequencer的用法总结
- JedisNoReachableClusterNodeException: No reachable node in cluster
- php模拟IP请求,如何在php中利用curl对ip进行模拟
- java电商项目搭建-------分布式文件存储系统(fastDFS)
- 2015年京胜杯删数!删数
- 吴乙己的数仓指南_2维度建模核心思想
- 数字逻辑·逻辑代数【运算、函数】
- 电脑误删的文件怎么恢复?分享90%的人都会的这2招