数据预处理清洗方法总结(一)
以house price为例
1. Train_df.head(n)
通过查看表格头部几行元素来观察数据的大致组成。
2. prices = pd.DataFrame({“price”:train_df[“SalePrice”],”log(price+1)”:np.log1p(train_df[“SalePrice”])})
Prices.hist()
price即数据的label本身不是平滑的,通常为了分类器学习的准确性,会首先把label“平滑化”,即呈现正态分布。在这里通常使用log1p,即log(x+1),避免了负值的问题。
最后也要把预测的平滑数据给变回去,需要使用expm1()
3. 合并操作:
all_df = pd.concat((train_df,test_df), axis = 0 )
4. 在house price prediction中MSSubClass的值其实应该是category,使用DF的时候,这类数字符号会被默认记成数字。因此我们需要把它变回string。
Input >> all_df[‘MSSubClass’].dtypes
Output >> dtype(‘int64’)
因此进行操作:
all_df[‘MSSubClass’] = all_df[‘MSSubClass’].astype(str)
5. 把category的变量转换成numerical表达形式
当我们用numerical来表达category 时要注意,数字本身有大小的含义,所以使用数字会给以后的模型学习带来困难,于是我们可以用One-Hot向量表示category。
一键One-Hot的方法:
all_dummy_df = pd.get_dummies(all_df))
6. 缺失值的处理:
(1)查看有哪些特征有缺失值
all_dummy_df.isnull().sum().sort_values(ascending=False).head(10)
处理这些缺失的信息,一般来说,数据集的描述里会写的很清楚,这些缺失都代表着什么。否则我们根据自己的选择来填充缺失值
(2)在这里,我们用平均值来填满这些空缺。
mean_cols = all_dummy_df.mean()
all_dummy_df = all_dummy_df.fillna(mean_cols)
7. 标准化numerical数据
这一步并不是必要,但要看你想用的分类器是什么。一般来说regression的分类器最好把源数据放在一个标准分布内,不要让数据间的差距过大。
这里,不需要把One-Hot的数据标准化,应该把本来就是numerical的数据标准化。
首先,判断哪些时numerical的数据:
numeric = all_df.columns[all_df.types != ‘object’]
然后计算标准分布:(X-X’)/s,让我们的数据点更加平滑,便于计算。
注意这里可以继续使用loc的。
Numeric_col_means = all_dummy_df.loc[:,numeric_cols].mean()
Numeric_col_std = all_dummy_df.loc[:,numeric_cols].std()
All_dummy_df.loc[:,numeric_cols] = (all_dummy_df.loc[:, numeric_cols] - numeric_col_means)/ numeric_col_std