目录
引言
一、缺失值填补 impute.SimpleImputer函数
1.1 Simplelmputer四个重要参数
1.2 用各个值填补演示
1.3 在这里我们使用中位数填补Age,用众数填补Embarked:
1.4 用Pandas和Numpy进行填补其实更加简单
引言
机器学习和数据挖掘中所使用的数据,永远不可能是完美的。很多特征,对于分析和建模来说意义非凡,但对于实际收集数据的人却不是如此,因此数据挖掘之中,常常会有重要的字段缺失值很多,但又不能舍弃字段的情况。因此,数据预处理中非常重要的一项就是处理缺失值。
我们采用从泰坦尼克号提取出来的数据,这个数据有三个特征,如下:
Age 数值型Sex 字符型Embarked 字符型
import pandas as pd#index_col=0是因为原数据中第1列本就是索引data = pd.read_csv(r"..\datasets\Narrativedata.csv",index_col=0)data.head()
一、缺失值填补 impute.SimpleImputer函数
class sklearn.impute.SimpleImputer(missing_values=nan,strategy="mean",fill_value=None,verbose=0,copy=True)
1.1 Simplelmputer四个重要参数
这个类是专门用来填充缺失值的。它包括四个重要参数:
>missing_values:告诉Simplelmputer,数据中的缺失值长什么样,默认空值np.nan
>strategy
我们填补缺失值的策略,默认均值
输入"mean"使用均值填补(仅对数值型特征可用)
输入"median"用中值填补(仅对数值型特征可用)
输入"most_frequent"用众数进行填补(对数值型和字符型特征都可用)
输入"constant"表示请参考参数"fill_value"中的值(对数值型和字符型特征都可用)
>fill_value
当参数startegy为"constant"的时候可用,可输入字符串或数字表示要填充的值,常用0
>copy
默认为True,将创建特征矩阵的副本,反之则会将缺失值填补到原本的特征矩阵中去
import pandas as pd#index_col=0是让计算机知道原数据中第一列样本是索引data=pd.read_csv((r"..\datasets\Narrativedata.csv",index_col=0)data.head()
data.info()#由运行结果可知Age和Embarked有缺失值"""<class 'pandas.core.frame.DataFrame'>Int64Index: 891 entries, 0 to 890Data columns (total 4 columns):# Column Non-Null Count Dtype --- ------ -------------- ----- 0 Age 714 non-null float641 Sex 891 non-null object 2 Embarked 889 non-null object 3 Survived 891 non-null object dtypes: float64(1), object(3)memory usage: 34.8+ KB"""
#查看数据
#查看数据Age=data.loc[:,"Age"].values.reshape(-1,1) #sklearn当中的矩阵必须是二维的Age[:20]"""array([[22.],[38.],[26.],[35.],[35.],[nan],[54.],[ 2.],[27.],[14.]])
1.2 用各个值填补演示
from sklearn.impute import SimpleImputerimport pandas as pddata=pd.read_csv((r"..\datasets\Narrativedata.csv",index_col=0)Age=data.loc[:,"Age"].values.reshape(-1,1) imp_median=SimpleImputer(strategy="median")#用中位数填补imp_median=imp_median.fit_transform(Age)#中值填补imp_0=SimpleImputer(strategy="constant",fill_value=0)#用零填补imp_0=imp_0.fit_transform(Age) #使用0填补imp_median[:10] #查看用中值填补后的前20条数据imp_0[:10] #查看用0填补后的前20条数据
1.3 在这里我们使用中位数填补Age,用众数填补Embarked:
from sklearn.impute import SimpleImputer#在这里我们使用中位数填补Agedata.loc[:,"Age"]=imp_median#使用众数填补EmbarkedEmbarked=data.loc[:,"Embarked"].value.reshape(-1,1)imp_mode=SimpleImputer(strategy="most_frequent")data.loc[:,"Embarked"]=imp_mode.fit_transform(Embarked)data.info() #由结果可知填补已经完成了"""<class 'pandas.core.frame.DataFrame'>Int64Index: 891 entries, 0 to 890Data columns (total 4 columns):# Column Non-Null Count Dtype --- ------ -------------- ----- 0 Age 891 non-null float641 Sex 891 non-null object 2 Embarked 891 non-null object 3 Survived 891 non-null object dtypes: float64(1), object(3)memory usage: 34.8+ KB"""# data.head(20) #显示填补后的前20条数据
1.4 用Pandas和Numpy进行填补其实更加简单
import pandas as pddata=pd.read_csv(r"数据地址")data.head()data.loc[:,"Age"]=data.loc[:,"Age"].fillna(data.loc[:,"Age"].median())#.fillna在DataFrame里面直接进行填补data.dropna(axis=0,inplace=True)#.dropna(axis=0)删除所有缺失值的行, .dropna(axis=1)删除所有缺失值的列#参数inplace,为True表示在原数据集上进行修改,为False表示生成一个复制对象,不修改原数据,默认为Flase