-
2021-02-06 20:17:41
机器学习-数据预处理
1.概述
1.1数据挖掘的五大流程
- 获取数据
- 数据预处理:从数据中检测,纠正或删除损坏,不准确或不适用于模型的记录的过程 可能面对的问题有:数据类型不同,比如有的是文字,有的是数字,有的含时间序列,有的连续,有的间断。也可能,数据的质量不行,有噪声,有异常,有缺失,数据出错,量纲不一,有重复,数据是偏态,数据量太大或太小
数据预处理的目的:让数据适应模型,匹配模型的需求 - 特征工程 特征工程是将原始数据转换为更能代表预测模型的潜在问题的特征的过程,可以通过挑选最相关的特征,提取特征以及创造特征来实现。其中创造特征又经常以降维算法的方式实现。可能面对的问题有:特征之间有相关性,特征和标签无关,特征太多或太小,或者干脆就无法表现出应有的数据现象或无法展示数据的真实面貌
特征工程的目的:1) 降低计算成本,2) 提升模型上限 - 建模,测试模型并预测出结果
- 上线,验证模型效果
1.2 sklearn中的数据预处理和特征工程
sklearn中包含众多数据预处理和特征工程相关的模块
- 模块preprocessing:几乎包含数据预处理的所有内容模块
- Impute:填补缺失值专用模块
- featureselection:包含特征选择的各种方法的实践
- 模块decomposition:包含降维算法
2 数据预处理 Preprocessing & Impute
2.1 数据无量纲化
在机器学习算法实践中,我们往往有着将不同规格的数据转换到同一规格,或不同分布的数据转换到某个特定分布的需求,这种需求统称为将数据“无量纲化”。
譬如梯度和矩阵为核心的算法中,譬如逻辑回归,支持向量机,神经网络,无量纲化可以加快求解速度;而在距离类模型,譬如K近邻,K-Means聚类中,无量纲化可以帮我们提升模型精度,避免某一个取值范围特别大的特征对距离计算造成影响。(一个特例是决策树和树的集成算法们,对决策树我们不需要无量纲化,决策树可以把任意数据都处理得很好。)
数据的无量纲化可以是线性的,也可以是非线性的。线性的无量纲化包括中心化(Zero-centered或者Mean-subtraction)处理和缩放处理(Scale)。中心化的本质是让所有记录减去一个固定值,即让数据样本数据平移到某个位置。缩放的本质是通过除以一个固定值,将数据固定在某个范围之中,取对数也算是一种缩放处理。
- preprocessing.MinMaxScaler
当数据(x)按照最小值中心化后,再按极差(最大值 - 最小值)缩放,数据移动了最小值个单位,并且会被收敛到[0,1]之间,而这个过程,就叫做数据归一化(Normalization,又称Min-Max Scaling)。
注意,Normalization是归一化,不是正则化,真正的正则化regularization,不是数据预处理的一种手段。归一化之后的数据服从正态分布,公式如下:在sklearn当中,我们使用preprocessing.MinMaxScaler来实现这个功能。MinMaxScaler有一个重要参数,feature_range,控制我们希望把数据压缩到的范围,默认是[0,1],也可以自己设置。
代码实现:
# _*_ coding:utf-8 _*_ # 开发团队:皮卡丘 # 开发人员:******** # 开发时间:2021/2/4 23:46 # 文件名称:1归一化.py # 开发工具:PyCharm from sklearn.preprocessing import MinMaxScaler import pandas as pd data=[[-1,2],[-0.5,6],[0,10],[1,18]] frame=pd.DataFrame(data) print(frame) #实现归一化 scaler=MinMaxScaler()#实例化 scaler=scaler.fit(data)#fit 在这里本质是生成min(x)和max(x) result=scaler.transform(data)#通过接口导出结果 print(result) #第二种一步出结果 result1=scaler.fit_transform(data) print(result1) #把归一化的数据逆转为原始数据 data=scaler.inverse_transform(result1) print(data) #数据归一化到指定范围[5,10] scaler=MinMaxScaler(feature_range=[5,10])#实例化 scaler=scaler.fit(data)#fit 在这里本质是生成min(x)和max(x) result=scaler.transform(data)#通过接口导出结果 print(result)
BONUS:使用numpy实现归一化
import numpy as np X=np.array([[-1,2],[-0.5,6],[0,10],[1,18]]) #归一化 X_nor=(X-X.min(axis=0))/(X.max(axis=0)-X.min(axis=0)) print(X_nor) #逆转归一化 X_returned=X_nor*(X.max(axis=0)-X.min(axis=0))+X.min(axis=0) print(X_returned)
- preprocessing.StandardScaler
当数据(x)按均值(μ)中心化后,再按标准差(σ)缩放,数据就会服从为均值为0,方差为1的正态分布(即标准正态分布),而这个过程,就叫做数据标准化(Standardization,又称Z-score normalization),公式如下:
代码实现:
from sklearn.preprocessing import StandardScaler import pandas as pd data=[[-1,2],[-0.5,6],[0,10],[1,18]] frame=pd.DataFrame(data) print(frame) #实现标准化 scaler=StandardScaler()#实例化 scaler.fit(data)#生成均值和方差 print(scaler.mean_)#查看每列均值的属性mean print(scaler.var_)#查看每列方差属性var_ X_std=scaler.transform(data)#通过接口导出结果 print(X_std) #查看标准化数据是否为均值为0,方差为1 print(X_std.mean())#均值为0.0 print(X_std.std())#方差为1 #方法二一度达成结果 print(scaler.fit_transform(data)) #标准化后的矩阵逆转为原始数据 data=scaler.inverse_transform(X_std) print(data)
对于StandardScaler和MinMaxScaler来说,空值NaN会被当做是缺失值,在fit的时候忽略,在transform的时候保持缺失NaN的状态显示。并且,尽管去量纲化过程不是具体的算法,但在fit接口中,依然只允许导入至少二维数组,一维数组导入会报错。通常来说,我们输入的X会是我们的特征矩阵,现实案例中特征矩阵不太可能是一维所以不会存在这个问题。
- StandardScaler和MinMaxScaler选择
大多数机器学习算法中,会选择StandardScaler来进行特征缩放,因为MinMaxScaler对异常值非常敏感。在PCA,聚类,逻辑回归,支持向量机,神经网络这些算法中,StandardScaler往往是最好的选择
MinMaxScaler在不涉及距离度量、梯度、协方差计算以及数据需要被压缩到特定区间时使用广泛,比如数字图像处理中量化像素强度时,都会使用MinMaxScaler将数据压缩于[0,1]区间之中
2.2 缺失值
机器学习和数据挖掘中所使用的数据,永远不可能是完美的。很多特征,对于分析和建模来说意义非凡,但对于实际收集数据的人却不是如此,因此数据挖掘之中,常常会有重要的字段缺失值很多,但又不能舍弃字段的情况。因此,数据预处理中非常重要的一项就是处理缺失值。
- impute.SimpleImputer
class sklearn.impute.SimpleImputer (missing_values=nan, strategy=’mean’, fill_value=None, verbose=0,copy=True)
参数 含义&输入 missing_values 告诉SimpleImputer,数据中的缺失值长什么样,默认空值np.nan strategy 我们填补缺失值的策略,默认均值。
输入“mean”使用均值填补(仅对数值型特征可用)
输入“median"用中值填补(仅对数值型特征可用)
输入"most_frequent”用众数填补(对数值型和字符型特征都可用)
输入“constant"表示请参考参数“fill_value"中的值(对数值型和字符型特征都可用)fill_value 随机森林分类 copy 默认为True,将创建特征矩阵的副本,反之则会将缺失值填补到原本的特征矩阵中去。 案例数据地址 提取码:2021 ,利用泰坦尼克号的信息预测乘客能否存活。代码实现:
import pandas as pd from sklearn.impute import SimpleImputer data=pd.read_csv('datasets/Narrativedata.csv',index_col=0)#数据已有索引,所有加上index_col=0 print(data.head())#查看数据前5行信息 print(data.info())
可以看见Age和Embarked两列有缺失值,并且Age这一列缺失值比较严重,接着对缺失值进行处理:
#填补年龄 Age=data.loc[:,"Age"].values.reshape(-1,1) imp_mean=SimpleImputer()#实例化默认均值填补 imp_median=SimpleImputer(strategy="median")#中位数填补 imp_0=SimpleImputer(strategy="constant",fill_value=0)#用0填补 imp_mean=imp_mean.fit_transform(Age)#一步完成调取结果 imp_median=imp_median.fit_transform(Age) imp_0=imp_0.fit_transform(Age) #打印查看用不同值填充前20行的效果 print(imp_mean[:20]) print(imp_median[:20]) print(imp_0[:20])
再来处理舱门Embarked的缺失值:
#使用众数填补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[:20]) print(data.info())
缺失值处理end...................
Bonus:用Pandas和Numpy进行其实更加简单哈哈,下面上代码:
import pandas as pd data=pd.read_csv("datasets/Narrativedata.csv",index_col=0) print(data.info()) data.loc[:,"Age"]=data.loc[:,"Age"].fillna(data.loc[:,"Age"].median())#Age添加中位数 data.dropna(axis=0,inplace=True)#删除有缺失值的哪一行(axis=0),列(axis=1),inplace=True在原数据进行修改,False生成复制对象,不修改原数据 print(data.info())
年龄Age列添加了中位数,然后对于舱门Embarked处理,哪行有缺失值就删除所在行。
2.3 处理分类型特征:编码与哑变量
再ML中,大多数算法,譬如逻辑回归,SVM,K近邻都只能处理数值型数据,不能处理文字,在sklearn中,除了专用来处理文字的算法,其他算法在fit的时候全部要求输入数组或矩阵,并且是数字。但现实中,许多标签和特征在数据收集完毕的时候,都不是数字来表现的。比如学历:大学,高中,小学,付费方式:花呗,现金,微信等等。这种情况下为了让数据适应算法和库,必须给数据进行编码,简单的说就是把文字型数据转换为数值型数据。
- preprocessing.LabelEncoder:标签专用,将分类转换为分类数值
############转换成数值型数据----标签分类专用 from sklearn.preprocessing import LabelEncoder data=pd.read_csv('datasets/Narrativedata.csv',index_col=0)#数据已有索引,所有加上index_col=0 data.iloc[:,-1]=LabelEncoder().fit_transform(data.iloc[:,-1]) print(data.head())#Survived里面的['No' 'Unknown' 'Yes']-->[,0,1,2]
- preprocessing.OrdinalEncoder:特征专用,能够将分类特征转换为分类数值
#######################转换成数值型数据----特征专用 from sklearn.preprocessing import OrdinalEncoder data_=data.copy()#上面操作的数据 print(data_.head()) print(OrdinalEncoder().fit(data_.iloc[:,1:-1]).categories_)#第二列Sex,最后一列Embarked特征处理 #查看特征的类别 [array(['female', 'male'], dtype=object), array(['C', 'Q', 'S'], dtype=object)] data_.iloc[:,1:-1]=OrdinalEncoder().fit_transform(data_.iloc[:,1:-1]) print(data_.head())
- preprocessing.OneHotEncoder:独热编码,创建哑变量
刚刚已经把分类变量Sex和Embarked都转换为数字对应的类别了。但把用[0,1,2]代表舱门,这种转换是正确的吗?
1) 舱门(S,Q, C)三种取值,S,Q,C相互独立,彼此之间安全没有联系。这是名义变量。
2)学历 (小学,初中,高中)三种取值不是完全独立的,我们知道学历上高中>初中>小学,学历有高低,但是又不能说小学+某个取值=初中。这是有序变量。
3)体重(>45kg,>90kg,>135kg)这三个取值是有关系的,我们可以知道135kg-90kg=45kg,他们之间可以相互转换。这是有距变量。
在对这些特征进行编码的时候,三种分类数据会被我们转换为[0 1 2],这三个数字在算法看来,且连续可以计算的。也就是说舱门,学历这样的分类特征会被误会成体重这样的分类特征,但这其实会忽略自带的数学性质,给算法传达不准确的信息,影响建模。对于名义变量,我们只有使用哑变量的方式来处理,才能够尽量向算法传达最准确的信息。
代码实现:
####################名义变量 独热编码,创建哑变量 from sklearn.preprocessing import OneHotEncoder X=data.iloc[:,1:-1]#Sex性别列,舱门Embarked列 result=OneHotEncoder(categories='auto').fit_transform(X).toarray() print(result) #[[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.]] ... #查看哑变量列特征标题 print(enc.get_feature_names())#['x0_female' 'x0_male' 'x1_C' 'x1_Q' 'x1_S'] #查看哑变量形状 print(result.shape)#(891, 5) #哑变量加入数据表 newdata=pd.concat([data,pd.DataFrame(result)],axis=1)#concat将两个表左右相连,axis=0表示垂直相连 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())
到这的话数据已经处理的够好了,已经可以拿去训练了。但有时候会有一些特殊需求,比如下面,,,,,,,,,,,
2.4 处理连续型特征:二值化与分段
- sklearn.preprocessing.Binarizer
根据阈值将数据二值化(将特征值设置为0或1),用于处理连续型变量。大于阈值的值映射为1,而小于或等于阈值的值映射为0。默认阈值为0时,特征中所有的正值都映射到1。二值化是对文本计数数据的常见操作,分析人员可以决定仅考虑某种现象的存在与否。它还可以用作考虑布尔随机变量的估计器的预处理步骤(例如,使用贝叶斯设置中的伯努利分布建模)。代码实现:
#####################处理连续型特征---二值化################## from sklearn.preprocessing import Binarizer data_2=data.copy() X=data_2.iloc[:,0].values.reshape(-1,1)#类为特征专用,必须使用二维数组 transformer=Binarizer(threshold=30).fit_transform(X)#30为界限 print(transformer)#Age就变成0 or 1了 print('+++++++++++++++++++++++++')
- preprocessing.KBinsDiscretizer
这是将连续型变量划分为分类变量的类,能够将连续型变量排序后按顺序分箱后编码。总共包含三个重要参数:
from sklearn.preprocessing import KBinsDiscretizer data=pd.read_csv('datasets/Narrativedata.csv',index_col=0)#数据已有索引,所有加上index_col=0 X=data.iloc[:,0].values.reshape(-1,1) est=KBinsDiscretizer(n_bins=3,encode='ordinal',strategy='uniform')#分3箱,编码方式有序,策略. transformer=est.fit_transform(X)[:20] print(transformer) #查看转换后分的箱,变成一列中的三箱 set(est.fit_transform(X).ravel())#{0,1,2} #创建哑变量 est=KBinsDiscretizer(n_bins=3,encode='onehot',strategy='uniform') print(est.fit_transform(X).toarray()) #然后处理方式就和前面的哑变量处理一模一样了..........
原版视频请参看 【技术干货】菜菜的机器学习sklearn【全85集】Python进阶,个人为学习过后的分享者。
更多相关内容 -
机器学习——数据集预处理(数据查看和空值处理)
2022-03-31 15:16:45来源:本数据集的来源是实验获得的数据。 特点:特征维度高,数据量大。 数据集查看 1.查看数据集的基本信息(列名、行数、数据类型等) import pandas as pd data = pd.read_csv('数据集.csv') #替换自己文件...目录
前言
目的:本数据集是为了分析炉丝功率和炉膛温度以及样品盒内部温度之间的关系,分析温场的分布等。
来源:本数据集的来源是实验获得的数据。
特点:特征维度高,数据量大。
数据集查看
1.查看数据集的基本信息(列名、行数、数据类型等)
import pandas as pd data = pd.read_csv('数据集.csv') #替换自己文件实际位置 info = data.info() print(info)
注:python中默认info显示100列的数据信息,若数据列超过100列,就会出现折叠显示的情况。
此时若需要查看某一列的空值数和类型数,可以通过以下语句将info默认显示的数据列值改大一些。
pd.options.display.max_info_columns = 350 # 设置info中信息显示数量为350
改完之后再运行info函数,可以展开显示更多的数据列了。
2.显示前5行数据
head = data.head() print(head)
3.查看数据集的统计信息
des = data.describe() print(des)
4.检测某一列空值的数目
df.isnull().sum()
5.直接原地删除有空值的行
df.dropna(inplace=True)
-
python机器学习:数据预处理
2021-07-19 16:13:47(1)定义:数据预处理是从数据中检测,纠正或删除损坏,不准确或不适用于模型的记录的过程 (2)可能面对的问题有:数据类型不同,比如有的是文字,有的是数字,有的含时间序列,有的连续,有的间断。也可能,数据...一、概述
1.1数据预处理和特征工程
1、数据挖掘五大流程:
- 获取数据
- 数据预处理
(1)定义:数据预处理是从数据中检测,纠正或删除损坏,不准确或不适用于模型的记录的过程
(2)可能面对的问题有:数据类型不同,比如有的是文字,有的是数字,有的含时间序列,有的连续,有的间断。也可能,数据的质量不行,有噪声,有异常,有缺失,数据出错,量纲不一,有重复,数据是偏态,数据量太大或太小
(3)数据预处理的目的:让数据适应模型,匹配模型的需求 - 特征工程:
(1)定义:特征工程是将原始数据转换为更能代表预测模型的潜在问题的特征的过程,可以通过挑选最相关的特征,提取特征以及创造特征来实现。其中创造特征又经常以降维算法的方式实现。
(2)可能面对的问题有:特征之间有相关性,特征和标签无关,特征太多或太小,或者干脆就无法表现出应有的数据现象或无法展示数据的真实面貌
(3)特征工程的目的:降低计算成本,提升模型上限 - 建模,测试模型并预测出结果
- 上线,验证模型效果
1.2sklearn中数据预处理和特征工程
- 模块preprocessing:几乎包含数据预处理的所有内容
- 模块Impute:填补缺失值专用
- 模块feature_selection:包含特征选择的各种方法的实践
- 模块decomposition:包含降维算法
二、数据预处理
2.1数据无量纲化
1、定义:我们往往有着将不同规格的数据转换到同一规格,或不同分布的数据转换到某个特定分布
的需求,这种需求统称为将数据“无量纲化”。
注意:树的算法不需要无量纲化,树可以将任意数据处理的非常好。2、分类:线性和非线性。
线性的无量纲化包括中心化和缩放处理。- 中心化的本质是让所有记录减去一个固定值,即让数据样本数据平移到某个位置。
- 缩放的本质是通过除以一个固定值,将数据固定在某个范围之中,取对数也算是一种缩放处理。
3、sklearn中的函数
(1)preprocessing.MinMaxScaler- 定义:当数据(x)按照最小值中心化后,再按极差(最大值 - 最小值)缩放,数据移动了最小值个单位,并且会被收敛到[0,1]之间,而这个过程,就叫做数据归一化。
- 在sklearn当中,我们使用preprocessing.MinMaxScaler来实现这个功能。MinMaxScaler有一个重要参数,feature_range,控制我们希望把数据压缩到的范围,默认是[0,1]。
from sklearn.preprocessing import MinMaxScaler import pandas as pd data=[[-1,2], [-0.5,6] ,[0,10] ,[1,18]] pd.DataFrame(data) #归一化1 scaler=MinMaxScaler()#实例化 scaler=scaler.fit(data)#生成min(x)和max(x) result=scaler.transform(data)#通过接口导出结果 print(result) result_=scaler.fit_transform(data)#一步达成 scaler.inverse_transform(result)#将归一化的结果逆转 #归一化2 scaler1=MinMaxScaler(feature_range=[5,10]) result1=scaler1.fit_transform(data) print(result1)
(2)preprocessing.StandardScaler
- 当数据(x)按均值(μ)中心化后,再按标准差(σ)缩放,数据就会服从为均值为0,方差为1的正态分布(即标准正态分布),而这个过程,就叫做数据标准化
#标准化 from sklearn.preprocessing import StandardScaler data = [[-1, 2], [-0.5, 6], [0, 10], [1, 18]] scaler = StandardScaler() #实例化 scaler.fit(data) #fit,本质是生成均值和方差 scaler.mean_ #查看均值的属性mean_ scaler.var_ #查看方差的属性var_ x_std = scaler.transform(data) #通过接口导出结果 x_std.mean() #导出的结果是一个数组,用mean()查看均值 x_std.std() #用std()查看方差 scaler.fit_transform(data) #使用fit_transform(data)一步达成结果 scaler.inverse_transform(x_std) #使用inverse_transform逆转标准化
(3)如何选择标准化和归一化
标准化:在PCA,聚类,逻辑回归,支持向量机,神经网络。
归一化:对异常值敏感,数字图像处理中量化像素强度
(4)其他数据无量纲方法
2.2缺失值
在这里我们使用titanic的部分数据进行。
1、读入数据import pandas as pd data=pd.read_csv("E:/21国赛/Titannic/Narrativedata.csv",index_col=0) data.info() data.head()
年龄和舱门具有缺失值。
2、填补缺失值:impute.SimpleImputer
(1)格式:class sklearn.impute.SimpleImputer (missing_values=nan, strategy=’mean’, fill_value=None, verbose=0, copy=True)
(2)参数
参数 含义 missing_values 告诉SimpleImputer,数据中的缺失值长什么样,默认空值np.nan strategy 我们填补缺失值的策略,默认均值。输入“mean”使用均值填补(仅对数值型特征可用;输入“median"用中值填补(仅对数值型特征可用;输入"most_frequent”用众数填补(对数值型和字符型特征都可用);输入“constant"表示请参考参数“fill_value"中的值(对数值型和字符型特征都可用 fill_value 当参数startegy为”constant"的时候可用,可输入字符串或数字表示要填充的值,常用0 copy 默认为True,将创建特征矩阵的副本,反之则会将缺失值填补到原本的特征矩阵中去。 #填补年龄 Age=data.loc[:,"Age"].values.reshape(-1,1) #print(Age[:20]) imp_mean=SimpleImputer()#均值 imp_median=SimpleImputer(strategy='median')#中位数 imp_0=SimpleImputer(strategy='constant',fill_value=0)#0 imp_mean=imp_mean.fit_transform(Age) imp_median=imp_median.fit_transform(Age) imp_0=imp_0.fit_transform(Age) data.loc[:,"Age"]=imp_median data.info()
输出结果:
同理对Embarked进行填补Embarked=data.loc[:,"Embarked"].values.reshape(-1,1) imp_mode=SimpleImputer(strategy='most_frequent') imp_mode=imp_mode.fit_transform(Embarked) data.loc[:,"Embarked"]=imp_mode data.info()
输出结果:
3、处理分类特征:编码和哑变量
编码:将文字型数据转换为数值型。preprocessing.LabelEncoder:标签专用,能够将分类转换为分类数值
#分类变量 y=data.iloc[:,-1] le=LabelEncoder() le=le.fit(y)#导入数据 label=le.transform(y) le.classes_ label #le.fit_transform(y) 一步到位 data.iloc[:,-1] = label
输出结果
preprocessing.OrdinalEncoder:特征专用,能够将分类特征转换为分类数值#分类变量:专为特征分类 from sklearn.preprocessing import OrdinalEncoder data_=data.copy() data_.head() OrdinalEncoder().fit(data_.iloc[:,1:-1]).categories_ data_.iloc[:,1:-1]=OrdinalEncoder().fit_transform(data_.iloc[:,1:-1]) print(data_.head())
preprocessing.OneHotEncoder:独热编码,创建哑变量。
三种分类数据:- 三种取值S,C,Q是相互独立的,彼此之间完全没有联系,表达的是S≠C≠Q的概念。这是名义变量
- 三种取值不是完全独立的,举例:在性质上可以有高中>初中>小学这样的联系,学历有高低,但是学历取值之间却不是可以计算的,我们不能说小学 + 某个取值 = 初中。这是有序变量
- 各个取值之间有联系,且是可以互相计算的,比如体重(>45kg,>90kg,>135kg),其中120kg - 45kg = 90kg,分类之间可以通过数学计算互相转换。这是有距变量
对于名义变量我们需要使用哑变量进行变换。
#独热编码 from sklearn.preprocessing import OneHotEncoder X=data.iloc[:,1:-1] enc=OneHotEncoder(categories='auto').fit(X) result=enc.transform(X).toarray() #print(result) print(enc.get_feature_names()) #合并 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())
输出结果:
总结:
-
闲扯淡之机器学习——数据预处理
2018-07-03 17:11:38有一天你的boss找到你说:XX听说你对ML很熟悉啊,正好我们公司有很多**方面的数据,你看看能不能搞一个ML项目为我们公司提供一些决策参考。你听到这里是高兴还是悲伤,具体因人而异(要是小弟听到了,绝对会很高兴)...
上篇文章我们针对ML闲扯了一番,并在最后又借鉴Data Mining的CRISP-DM模型分析了一个ML项目的开发过程。
今天说点什么呢?我犹豫了,我迷茫了!先给大家讲个故事吧!
有一天你的boss找到你说:XX听说你对ML很熟悉啊,正好我们公司有很多**方面的数据,你看看能不能搞一个ML项目为我们公司提供一些决策参考。你听到这里是高兴还是悲伤,具体因人而异(要是小弟听到了,绝对会很高兴)。我这里假设你很高兴,接到boss的圣旨以后你就屁颠屁颠的找公司的相关数据。毕竟手持boss的圣旨,所以数据获取应该不是太难,拿到数据你就开始疯狂的想使用什么模型呢?逻辑回归,GBDT,随机森林,SVM、贝叶斯等等模型(别急,后面都会提到),你通过“认真”思考后选择了一个模型,迫不及待的把数据往里面喂(亲爱的张嘴)。当你信心满满的点击run后,你会看到下面一行,一行,一行的红色字体,大体意思是这里数字无效,那里数据为空……这时候就问你崩溃吗?
故事说完了,正事还是要干的,今天在网上浪了一番,发现一个妹子(CSDN的账户名为Charlotte77)根据自己的实际情况总结了一个ML项目的流程,如下图所示(此图纯属盗图,妹子不会怪罪我的吧):
其实,我盗用妹子的图是有目的的,对,你没有听错,我是带着目的来的,现在话不多说——开干。根据妹子的图,我的思绪回到了扯上一篇文章的时候,突然发现上一篇没有什么干货,全文都是我在扯淡。其实,我上一篇的目的性很明确就是让大家了解一下什么叫ML以及在一个ML项目开始前我们需要做或者准备的东西,这对一个ML项目来说至关重要的。这一篇我打算说一下关于数据预处理的问题,在ML中有数据、好数据才是王道。无论对于数据挖掘,还是ML,还是DL,数据都占据很重要的地位,例如(臭不要脸的又盗图Jim Liang的图):
上图来自美帝的“纽约时报”的一篇报道,其实就是说数据科学家在他们的时间中有50%到80%的时间花费在收集和准备不规则数据的更为平凡的任务中,然后才能探索有用的金块。就看上图,不用我多废话大家就会明白数据预处理的重要性(臭不要脸的谁让你废话的,滚!)。说到数据预处理,我们就说一些稍微正式的,何为数据处理?(老毛病,先说定义吧)数据预处理主要是指在对数据主要处理以前对数据进行的一些处理(就问你是不是我的回答简单易懂)。数据预处理有四个任务,数据清洗、数据集成、数据变换和数据规约。各位大佬,各位看官,请听说继续扯:
从惯性思维来讲,如果一件事情放到第一位就说明这件事情很重要,例如软件开发中的需求分析,所以数据清洗在数据预处理中占据很重要的地位(谁让人家是老大呢)。各位大佬,各位看官,如果你已经对ML有一定的了解,你就会发现有几个数据集(例如,iris数据集,房价数据,电影评分数据集)已经被数据挖掘、ML等领域的人玩烂了。这些数据集毕竟是为学习的人提供练手的玩物(看到这两个字是不是,我邪恶了),所以这些数据的质量都相对较好。然而,在我们实际项目中的数据往往是混乱的,也可以说杂乱无章的(这里说乱主要是指数据不完整、数据重复、数据值为空等)。如果你想要你的努力获得效果(模型获得更好的预测),你就必须对你的数据做预处理。其实,我听很多高机器学习的朋友告诉我,机器学习数据时王道,较好的数据经过不同的模型训练后,其预测结果差距不是太大(这是真的你没有听错)。在真实数据中,我们拿到的数据可能包含了大量的缺失值,可能包含大量的噪音,也可能因为人工录入错误(比如,医生的就医记录)导致有异常点存在,对我们挖据出有效信息造成了一定的困扰,所以我们需要通过一些方法,尽量提高数据的质量。
数据清洗是检测和去除数据集中的噪声数据和无关数据,处理遗漏数据,去除空白数据域和知识背景下的白噪声。数据清洗分为有监督清洗和无监督清洗两类(参考CSDN昵称:树先生海浪):
- 有监督清洗:在对应领域专家的指导下,收集分析数据,手工去除明显的噪声数据和重复记录,填补缺值数据等清洗动作
- 无监督清洗:根据一定的业务规则,预先定义好数据清洗算法,由计算机自动执行算法,对数据集进行清洗,然后产生清洗报告
在实际项目中,完全有监督的清洗估计不太可能(你让去人工清洗数以万计的数据你愿意吗?反正我是不干),因此,一般是先进行无监督清洗并产生相应的清洗报告,然后再让专家根据清晰报告对清洗的结果进行人工整理。在数据清理前,我们需要分析数据的特点并定义数据清洗规则,清洗结束后为了保证清洗的质量,我们还需要验证清洗结果。数据的分析是根据相关的业务知识和相应的技术,如统计学,数据挖掘的方法,分析出数据源中数据的特点,为定义数据清洗规则奠定基础。常用的清洗规则主要包括:空值的检查和处理;非法值的检测和处理;不一致数据的检测和处理;相似重复记录的检测和处理。执行数据清洗规则时需要检查拼写错误,去掉重复的(duplicate)记录,补上不完全的(incomplete)记录,解决不一致的(inconsistent)记录,用测试查询来验证数据,最后需要生成数据清晰报告。在清洗结果验证中,需要对定义的清洗转换规则的正确性和效率进行验证和评估,当不满足清洗要求时要对清洗规则或系统参数进行调整和改进,数据清洗过程中往往需要多次迭代的进行分析,设计和验证。
杂乱无章的数据,问题多如麻,因此针对数据中存在的不同问题,有不同的处理方法:
空值数据的处理方法
- 删除包含空值的记录,这种方式主要是针对包含空值的数据占总体比例较低,删除这些数据对于数据整体影响不大。
- 自动补全方法,这种方法通过统计学原理,根据数据集中记录的取值分布情况来对一个空值进行自动填充,可以用平均值,最大值,最小值等基于统计学的客观知识来填充字段。
- 手工的补全缺失值,这种方法仅适用于数据量比较小的情况,对于大数据量只能说no way,并且对空值不正确的填充往往将新的噪声引入数据中,使知识获取产生错误的结果。
不一致数据处理的基本方法
清洗方法主要在分析不一致产生原因的基础上,利用各种变换函数,格式化函数,汇总分解函数去实现清洗。
噪声数据的基本处理方法
- 分箱:将存储的值分布到一些箱中,用箱中的数据值来局部平滑存储数据的值,包括按箱平均值平滑,按箱中值平滑和按箱边界值平滑。
- 回归:找到恰当的回归函数来平滑数据。线性回归要找出适合两个变量的“最佳”直线,使得一个变量能预测另一个。多线性回归涉及多个变量,数据要适合一个多维面。
- 计算机检查和人工检查相结合:可以通过计算机将被判定数据与已知的正常值比较,将差异程度大于某个阈值的模式输出到一个表中,人工审核后识别出噪声数据。
- 聚类:将类似的值组成群或“聚类”,落在聚类集合之外的值被视为孤立点。孤立点可能是垃圾数据,也可能是提供信息的重要数据。垃圾数据将清除。
哔哔半天了,来点实际的吧!
我们经常用来学习的数据比较完整不适合这里的闲扯淡,所以我特意从kaggle找了一个数据。这个数据集分为训练数据集和测试数据集,训练数据集的大小为(1272, 161),总计161个特征,数据存储格式为csv格式。我们这里选择使用pandas(pandas教程,这个教程基本上是按照官网翻译的,如果你想看看官方文档可以在这里下载,一个积分哦)处理数据。下面为大家展示一下这个数据集的数据分布情况(由于特征比较多,我只是简单展示了部分特征):
首先,我们来看一下csv文件里面的数据,在使用pandas之前导入使用到的模块:import numpy as np import pandas as pd
打开数据,显示前2条数据:
df = pd.read_csv('./learn/2016 School Explorer.csv') df.head(2) #df.describe() 如果数据主体为数字,这里也可以使用df.describe()显示更具体的情况
由于数据主要是使用字符串保存,并且里面有6个特征包含%,不方便处理数据。这里我们写一个方法,用于处理这些数据生成float数据:
def p2f(x): return float(x.strip('%'))/100
写完函数了,进一步处理数据:
# astype(type)是将数据转换成制定的type类型 # apply(function)将会在DataFrame中行或列中的数据应用function函数 df['Percent of Students Chronically Absent']=df['Percent of Students Chronically Absent'].astype(str).apply(p2f) df['Rigorous Instruction %'] = df['Rigorous Instruction %'].astype(str).apply(p2f) df['Collaborative Teachers %'] = df['Collaborative Teachers %'].astype(str).apply(p2f) df['Supportive Environment %'] = df['Supportive Environment %'].astype(str).apply(p2f) df['Effective School Leadership %'] = df['Effective School Leadership %'].astype(str).apply(p2f) df['Strong Family-Community Ties %'] = df['Strong Family-Community Ties %'].astype(str).apply(p2f) df['Trust %'] = df['Trust %'].astype(str).apply(p2f)
下面我们通过df[‘School Income Estimate’]来看一下School Income Estimate特征的值:
0 $31,141.72 1 $56,462.88 2 $44,342.61 3 $31,454.00 4 $46,435.59 5 $39,415.45 6 $43,706.73 7 $28,820.67 8 $34,889.24 9 $35,545.10 10 $40,809.90 11 $27,881.59 12 NaN 13 NaN 14 $63,760.00 15 NaN 16 $62,519.57 17 $57,504.48 18 $56,787.20 19 NaN 20 NaN 21 $76,833.96 22 NaN 23 $32,817.79 24 $26,114.78
有没有发现这个数据里面不仅有NaN,而且还有$$(其实是一个刀了,如果不写成两个,就显不出来),不便于我们计算,下面我们先将数据中的$,英文“,”以及空格替换掉,并将数据转换成float(NaN后面在处理):
df['School Income Estimate'] = df['School Income Estimate'].str.replace(',', '') df['School Income Estimate'] = df['School Income Estimate'].str.replace('$', '') df['School Income Estimate'] = df['School Income Estimate'].str.replace(' ', '') df['School Income Estimate'] = df['School Income Estimate'].astype(float)
处理后的结果(是不是很好了):
0 31141.72 1 56462.88 2 44342.61 3 31454.00 4 46435.59 5 39415.45 6 43706.73 7 28820.67 8 34889.24 9 35545.10 10 40809.90 11 27881.59 12 NaN 13 NaN 14 63760.00 15 NaN 16 62519.57 17 57504.48 18 56787.20 19 NaN 20 NaN 21 76833.96 22 NaN 23 32817.79 24 26114.78
下面我们使用matplotlib和pandas一起显示部分特征分布信息,同样首先导入matplotlib模块:
import matplotlib.pyplot as plt
画图如下(画图内容就是使用不同的特征表示图中的不同信息,其他的我就不废话了):
df.plot(kind="scatter", x="Longitude", y="Latitude", s=df['School Income Estimate']/1210, c="Economic Need Index", cmap=plt.get_cmap("jet"), label='Schools', title='New York School Population Map',colorbar=True, alpha=0.4, figsize=(15,7)) plt.legend() plt.show()
data = [ { 'x': df["Longitude"], 'y': df["Latitude"], 'text': df["School Name"], 'mode': 'markers', 'marker': { 'color': df["Economic Need Index"], 'size': df["School Income Estimate"]/4500, 'showscale': True, 'colorscale':'Portland' } } ] layout= go.Layout( title= 'New York School Population (Economic Need Index)', xaxis= dict( title= 'Longitude' ), yaxis=dict( title='Latitude' ) ) fig = go.Figure(data=data, layout=layout) iplot(fig, filename='scatter_hover_labels')
对于数据,将字符转化成float:df['Percent Asian'] = df['Percent Asian'].apply(p2f) df['Percent Black'] = df['Percent Black'].apply(p2f) df['Percent Hispanic'] = df['Percent Hispanic'].apply(p2f) df['Percent White'] = df['Percent White'].apply(p2f) df['Percent Black / Hispanic'] = df['Percent Black / Hispanic'].apply(p2f)
再画一个图:
data = [ { 'x': df["Longitude"], 'y': df["Latitude"], 'text': df["School Name"], 'mode': 'markers', 'marker': { 'color': df["Percent Black"], 'size': df["School Income Estimate"]/4500, 'showscale': True, 'colorscale':'Portland' } } ] layout= go.Layout( title= 'New York Black Student Ratio Of School', xaxis= dict( title= 'Longitude' ), yaxis=dict( title='Latitude' ) ) fig = go.Figure(data=data, layout=layout) iplot(fig, filename='scatter_hover_labels')
再画一个图:f, axes = plt.subplots(2, 2, figsize=(19, 9), sharex=True) sns.despine(left=True) sns.regplot(x=df["Economic Need Index"], y=df["Percent Asian"], color='purple', ax=axes[0, 0], line_kws={"color": "black"}) sns.regplot(x=df["Economic Need Index"], y=df["Percent White"], color='g', ax=axes[0, 1], line_kws={"color": "black"}) sns.regplot(x=df["Economic Need Index"], y=df["Percent Black"], color='b', ax=axes[1, 0], line_kws={"color": "black"}) sns.regplot(x=df["Economic Need Index"], y=df["Percent Hispanic"], color='r', ax=axes[1, 1], line_kws={"color": "black"}) axes[0,0].set_title('Ecnomic Need Index (Asian)') axes[0,1].set_title('Ecnomic Need Index (White)') axes[1,0].set_title('Ecnomic Need Index (Black)') axes[1,1].set_title('Ecnomic Need Index (Hispanic)') plt.subplots_adjust(hspace=0.4)
就说到这里吧,下次继续扯!
参考文献:
https://blog.csdn.net/qq_38360675/article/details/78284329
https://www.cnblogs.com/charlotte77/p/5606926.html
好像还有,忘了……
(如果发现出现引用,并未标注的请联系本文作者。) -
机器学习之理解数据预处理
2020-09-07 23:33:19在机器学习中,无论什么模型,在建模训练之前都需要对训练数据进行预处理。在现实工作中,我们获取到的数据,总是会出现各种问题,比如数据缺失、数据异常、数据分布不均等等。所以,若不进行数据预处理,模型训练将... -
机器学习——数据的预处理(总结大全)
2022-04-05 23:56:56一、为什么要特征数据缩放? 有特征的取值范围变化大,影响到其他的特征取值范围较小的,那么,根据欧氏距离公式,整个距离将被取值范围较大的那个特征所主导。 为避免发生这种情况,一般对各个特征进行缩放,... -
机器学习总结之数据预处理与特征工程
2021-11-03 20:56:29当然,数据分析是一个比较宽泛的概念,其包含很多板块,我们这里着重以如何让数据变得有”智慧“的机器学习开始谈起! 数据固然是企业宝贵的财富,但如果不懂得如何使用这笔财富,那它也只能沉睡在垃圾桶里。要想... -
机器学习数据预处理代码汇总(最新更新20年3月1日)
2019-04-13 16:56:57这篇博客用一个pandas的DataFrame类型的数据为例,字段名为了不与任何第三方库混淆,我们叫他 dataframe 这篇博客没有长篇大论,就是希望能够让大家直接复制代码,然后把dataframe变量改为自己的dataframe变量后... -
机器学习之数据预处理——数据清洗(缺失值、异常值和重复值的处理)
2021-12-07 23:45:09机器学习之数据预处理——数据清洗缺失值、异常值和重复值的处理基础知识数据列缺失的4种处理方法丢弃补全真值转换法不处理 基础知识 在数据清洗过程中,主要处理的是缺失值,异常值和重复值。所谓清洗,是对数据... -
机器学习之数据预处理&特征选择
2021-06-18 16:32:01在机器学习过程中,数据预处理和特征工程十分重要。数据不给力,再高级的算法都没有用。依旧是根据菜菜的视频做的笔记。 1. 数据预处理 1.1 数据无量纲化 数据的无量纲化指的是样本特征的量纲不同时会导致不同的特征... -
机器学习里数据预处理及特征工程总结(超详细)
2017-11-30 11:58:11机器学习里有一句名言:数据和特征决定了机器学习的上限,而模型和算法的应用只是让我们逼近这个上限。这个说法形象且深刻的提出前期数据处理和特征分析的重要性。这一点从我们往往用整个数据挖掘全流程60%以上的... -
《菜菜的机器学习sklearn课堂》数据预处理和特征工程
2021-02-12 14:59:44数据预处理和特征工程数据预处理和特征工程 - 概述数据预处理 Preprocessing & Impute数据无量纲化数据归一化 preprocessing.MinMaxScaler数据标准化 preprocessing.StandardScalerStandardScaler 和 ... -
数据预处理之空值与异常值处理
2021-02-05 17:22:09在大部分的数据分析里面,直接获取的数据都会存在一些问题,比如缺失值,异常值等,在进行深度分析前都需要对这些数据进行预处理。 读取并初步查看数据 读取数据后查看数据特征列, 首先筛选出分析所需要的列,然后... -
机器学习-数据预处理与特征工程
2021-01-25 21:38:51数据预处理是从数据中检测,纠正或删除损坏,不准确或不适用于模型的记录的过程 可能面对的问题有:数据类型不同,比如有的是文字,有的是数字,有的含时间序列,有的连续,有的间断。也可能,数据的质量不行,有... -
【python】数据预处理:删除缺失值/空值
2022-05-17 14:06:28读入的数据表格中有很多缺失值,由于数据量很大,不需要对缺失值进行中值填充、均值填充,直接删除即可。每一条数据都有很多特征。。。 像这样:x1,x2,x3,x4,nan,x6,x7,y x表示特征值,y表示该条数据的标签,nan表示... -
在机器学习中,如何用Python进行数据预处理?
2019-05-16 22:35:46近期学习了机器学习中的数据预处理章节,在此进行分享,欢迎大家讨论指正。 顺便说一下,这里我使用的软件是Anacnoda 3中已经安装好的Spyder 3,这个软件用起来很爽,适合用来做数据分析,缺点就是不好进行调试以及... -
机器学习 — 数据预处理:标准化/归一化
2020-02-22 20:31:16机器学习之数据预处理-标准化 -
【机器学习(6)】数据预处理:预处理、标准化和数据纠偏
2020-03-05 10:46:36概念:数据预处理与特征工程泛指对训练数据集进行特征增加、删除、变换的方法 目标:通过对训练数据的处理变换,提高模型训练表现和泛化能力 类别: 特征变换:预处理、标准化... -
机器学习笔记六——特征工程之数据预处理
2020-06-12 17:49:27特征工程之数据预处理1 处理缺失值2 处理异常值2.1 异常值检测2.2异常值处理3 处理类别不平衡问题4 图片数据扩充5 数据的特征表示 数据预处理 首先需要对数据进行预处理,一般常用的两种数据类型: 结构化数据。 ... -
【机器学习】数据预处理类型总结
2021-12-04 16:41:47数据预处理总结基于sklearn包1、标准化:去均值和方差按比例缩放(scale,StandardScaler)1.1将特征缩放至特定范围内(MinMaxScaler,MaxAbsScaler)1.2缩放稀疏矩阵数据2.归一化(Normalizer)3.类别特征编码(OneHot... -
机器学习sklearn-特征过程及数据预处理
2022-01-12 11:36:16可能面对的问题有:特征之间有相关性,特征和标签无关,特征太多或太小,或者干脆就无法表现出应有的数据现象或无法展示数据的真实面貌 特征工程的目的:1) 降低计算成本,2) 提升模型上限 1.1 sklearn中的的... -
机器学习-特征工程中的数据预处理
2020-07-20 15:33:38对于一个机器学习问题,数据和特征决定了机器学习的上限,而模型和算法只是逼近这个上限。由此可见,数据和特征在模型的整个开发过程中是比较重要。特征工程,顾名思义,是对原始数据进行一系列工程处理,将其提炼为... -
数据挖掘——1 数据预处理
2021-12-31 14:27:541.2 缺失值1.3 离群点1.4 重复数据二、Data Transformation 数据转变换2.1 为什么要进行数据变换2.2 数据类型2.3 采样三、Data Description 数据描述与可视化3.1 数据归一化3.2 经典统计量3.3 数据间的相关性3.3.1 ... -
sklearn机器学习之数据预处理(Preprocessing & Impute)
2021-03-08 15:22:25这些数据集都是一些经过处理被验证为对机器学习很友好的数据集,而现实生活中我们往往数据集并不是那么友好,所以需要对其进行一些预处理,下面我们利用sklearn对数据进行一些预处理。 1.数据无量纲化 在机器... -
数据预处理--归一化和标准化《菜菜机器学习sklearn笔记》
2022-02-28 10:33:54因此,我们有必要学习一下建模之前的流程,数据预处理和特征工程。 数据预处理和特征工程 数据挖掘的五大流程: 1.获取数据 2.数据预处理 数据预处理是从数据中检测,纠正或删除损坏,不准确或不适用于模型的... -
python进行机器学习(一)之数据预处理
2020-11-27 22:06:15一、加载数据houseprice=pd.read_csv('../input/train.csv') #加载后放入dataframe里all_data=pd.read_csv('a.csv', header=0,parse_dates=['time'],usecols=['time','LotArea','price']) #可以选择加载哪几列house... -
机器学习-Sklearn-03(数据预处理和特征工程)
2022-02-23 13:42:47机器学习-Sklearn-03(数据预处理和特征工程) -
关于数据分析之空值处理
2021-10-19 01:23:15空值是数据分析中经常遇到的情况,让人无所适从,是当垃圾数据一样抛弃,还是置一些缺省值,尚未定论。就本人而言如果是文本型的一般会填充某个从未遇到的缺省值来替代,如果是数值,一般用加权平均代替... -
数据挖掘:数据预处理相关概念
2020-02-19 19:26:18一般我们得到的数据会存在有缺失值、重复值等,在使用之前需要进行数据预处理。它是一系列对数据操作的统称。 数据预处理没有标准的流程,通常针对不同的任务和数据集属性的不同而不同。数据预处理的常用流程为: ... -
python机器学习库sklearn——数据预处理
2018-04-07 22:01:15缩放有离群值的数据 核矩阵的中心化 非线性转换 归一化 二值化 特征二值化 分类特征编码 缺失值插补 生成多项式特征 直接上代码,大家可以运行代码,打印输出各种结果来理解预处理的处理过程。from sklearn import