数据预处理函数
下面列举一些数据预处理的函数,方便以后查看,本人菜鸟一枚,如有不正之处请予以更正。
1 train.head(5) #显示前5行数据 2 train.tail(5) #显示后5行 3 train.columns #查看列名 4 train.info() #查看各字段的信息 5 train.shape #查看数据集行列分布,几行几列 6 train.describe() #查看数据的大体情况
输出每个列丢失值也即值为NaN的数据和,并从多到少排序:
1 total = train.isnull().sum().sort_values(ascending=False) 2 print(total) 3 结果: 4 Cabin 687 5 Age 177 6 Embarked 2 7 Fare 0 8 Ticket 0 9 Parch 0 10 SibSp 0
对缺失数据的处理有很多方法,如《机器学习实战》里提到:
使用可用特征的均值来填补缺失值;
使用特殊值来填补缺失值,如-1;
忽略有缺失值的样本;
使用相似样本的均值添补缺失值;
使用另外的机器学习算法预测缺失值。
1 #使用中位数填补 2 train[\'Fare\'] = train[\'Fare\'].fillna(train[\'Fare\'].median()) 3 4 使用平均数填补 5 train[\'Age\'] = train[\'Age\'].fillna(train[\'Age\'].mean()) 6 7 #使用出现次数最多的值填补 8 train.product_type[train.product_type.isnull()]=train.product_type.dropna().mode().values 9 10 #去掉一列 11 train = train.drop([\'Cabin\'], axis = 1) 12 13 #去掉这个特征为空的行 14 #当然后面可以加上inplace=True表示直接就在内存中替换了不用再赋值个train_new,但是本人多次删除掉几个行,发现有问题时又需要重新建立已经分析好的train,很浪费时间,个人认为还是重新开辟一个比较好 15 train_new = train.drop(train[train[\'Embarked\'].isnull()].index) 16 17 #返回已经去掉重复行的数据集 18 train.drop_duplicates()
1 #统计某一列中各个元素值出现的次数 2 train[\'MSSubClass\'].value_counts() 3 # 4 #列出数据的偏斜度 5 train[\'MSSubClass\'].skew() 6 7 #列出数据的峰度 8 train[\'MSSubClass\'].kurt() 9 10 #计算两个列的相关度 11 train[\'LotFrontage\'].corr(train[\'LotArea\']) 12 13 #观察两个列的值的二维图 14 x = \'GrLivArea\';y = \'SalePrice\' 15 data = pd.concat([train[y], train[x]], axis=1) 16 data.plot.scatter(x=x, y=y, ylim=(0,800000));#这里800000为y的最大值 17 18 #计算所有特征值每两个之间的相关系数,并作图表示。 19 corrmat = train.corr()#得到相关系数 20 f,ax = plt.subplots(figsize = (12,9)) 21 sns.heatmap(corrmat, vmax = .8, square = True)#热点图 22 23 #取出相关性最大的前十个,做出热点图表示 24 k = 10 #number of variables for heatmap 25 cols = corrmat.nlargest(k, \'SalePrice\')[\'SalePrice\'].index 26 cm = np.corrcoef(train[cols].values.T) 27 sns.set(font_scale=1.25) 28 hm = sns.heatmap(cm, cbar=True, annot=True, square=True, fmt=\'.2f\', annot_kws={\'size\': 10}, yticklabels=cols.values, xticklabels=cols.values) 29 plt.show()
1 #浮点型数值转换为整型 2 train[\'Age\']=train[\'Age\'].astype(int) 3 4 #字符串的替换--映射 5 train[\'MSZoning\']=train[\'MSZoning\'].map({\'RL\':1,\'RM\':2,\'RR\':3,}).astype(int) 6 train[\'Embarked\'] = train[\'Embarked\'].map( {\'S\': 0, \'C\': 1, \'Q\': 2} ).astype(int) 7 #一般建议将map拿出来 8 title_mapping = {"Mr": 1, "Miss": 2, "Mrs": 3, "Master": 4, "Rare": 5} 9 train[\'Title\'] = train[\'Title\'].map(title_mapping) 10 train[\'Title\'] = train[\'Title\'].fillna(0) 11 12 #将字符串特征列中的内容分别提出来作为新的特征出现,表现为0、1。 13 train= pd.get_dummies(houseprice) 14 15 #将连续型特征值分块,每一块用数字标识 16 train.loc[ train[\'Fare\'] <= 7.91, \'Fare\'] = 0 17 train.loc[(train[\'Fare\'] > 7.91) & (train[\'Fare\'] <= 14.454), \'Fare\'] = 1 18 train.loc[(train[\'Fare\'] > 14.454) & (train[\'Fare\'] <= 31), \'Fare\'] = 2 19 train.loc[ train[\'Fare\'] > 31, \'Fare\'] = 3 20 train[\'Fare\'] = train[\'Fare\'].astype(int)
1 下面这个数值转换是将数值进行log计算,使分布的数值显常态 2 train[\'SalePrice\'] = np.log(train[\'SalePrice\']) 3 4 而有时这样的log不可行,就需要使用log(x+1)来 处理,至于原因请点击链接 5 train["SalePrice"] = np.log1p(train["SalePrice"]) 6 7 #将偏斜度大于0.75的数值列log转换,使之尽量符合正态分布。 8 skewed_feats = train[numeric_feats].apply(lambda x: skew(x.dropna())) #compute skewness 9 skewed_feats = skewed_feats[skewed_feats > 0.75] 10 skewed_feats = skewed_feats.index 11 all_data[skewed_feats] = np.log1p(all_data[skewed_feats])
标准化归一化概念不再赘述,实际使用时最主要的还是要了解什么时候需要标准化,什么时候用归一化,还需要清楚当前数据适合什么标准化方式等等。
在sklearn.preprocessing 介绍的标准化方式有:
1 1. preprocessing.scale()、preprocessing.StandardScaler(),使数据集呈现标准正态分布,即mean = 0,且标准差std = 1。 2 2. MinMaxScaler 、MaxAbsScaler,前者使数据集分布在[0,1],后者分布在[-1,1]。这种方式通常在(1) 特征的标准差较小 (2) 可以使稀疏数据集中的0值继续为0,这两种情况下使用。 3 3. preprocessing.QuantileTransformer(),将数据映射到[0,1]之间均匀分布,会破坏原数据之间的相关特性。 4 4. 归一化方式:preprocessing.normalize(),将样本缩放成单位向量,(1)需要使用二次方程,比如点积或者其他核方法计算样本对之间的相似性(2)常用于文本分类和内容聚类的向量空间模型的基础。
删除特别大的‘血糖’异常值
1 train.drop(train.index[[i for i in train.index if train.iloc[i,columns-1]>30]],inplace=True) 2 合并数据集 3 train2 = pd.concat([train, test], axis=0)
参考:https://blog.csdn.net/weixin_42029738/article/details/80257888
版权声明:本文为51python原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。