下面列举一些数据预处理的函数,方便以后查看,本人菜鸟一枚,如有不正之处请予以更正。
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