-
在进行数据分析项目、比赛中,一手数据往往是脏数据。提高数据质量即数据预处理成为首要步骤,也会影响后期模型的表现。在此对利用Python进行预处理数据做一个总结归纳。
-
首先是缺失值处理。
#读取数据
import pandas as pd
filepath= 'F:/...'#本地文件目录
df= pd.read_csv(train,sep=',')#df数据格式为DataFrame
查看缺失值
- 查看每一特征是否缺失及缺失值数量可能影响着处理缺失值的方法
df.isnull().sum() #查看每一列缺失值的数量
df.info() #查看每一列数据量和数据类型
删除缺失值
- 如果有些特征数据量很少,缺失值很多,则此类特征难以作为刻画样本形象的特征,考虑直接将该特征删除即删除该列。
- 对于极少量数据缺失例如10000个样本有1个缺失值,则不管删除与否影响并不大,可考虑删除。
df.dropna(axis=0,how='any',inplace = True)
# axis = 0,删除带有空值的行
# axis = 1,删除带有空值的列
# how = 'any',有空值即删
# how = 'all',全空才删
# inplace = True,在原有df上删除空值,return None
# inplace = False,返回删除空值后的df, return df
填补缺失值
- 个人认为在多数情况下,对于缺失值的处理则是能不删则不删,尤其是在比赛中,最好不要为了省事将含有缺失值的样本直接删除,这必然造成数据的浪费,影响模型精度。
(1)固定值填充
df['列名1'].fillna(value = 30,inplace=True)
# value = 30,用30填补空值
# value = df['列名1'].mean() 均值填充
# value = df['列名1'].median() 中位数填充
# value = df.Mer_min_distance.mode()[0] 众数填充
- 一方面,个人认为均值填充和中位数填充都很省事,差别不大,常常采用均值填充。众数填充也很少用到。
- 另一方面,单纯使用固定值填充往往不是很好,可以考虑采用按照类别均值填充。
(2)前(后)值填充
df['列名1'].fillna(method = 'pad',inplace=True)
method参数取值:{‘pad’, ‘ffill’,‘backfill’, ‘bfill’, None},使用过程中因为对ipad很熟悉,故常常用 'pad’填充
- ‘pad’ or ‘ffill’ : 用前一个非缺失值填充
- ‘backfill’ or ‘bfill’:用后一个非缺失值填充
- ‘None’ or default : 默认采用固定值填充
(3)用字典填充
dict = {'列名1': 0, '列名2': 1, '列名3': 2}
df.fillna(value = dict,inplace = True)
不同特征填补不同缺失值,用字典填充能很好解决。
(4)随机森林填充
- 利用随机森林回归预测填充缺失值,代码做了稍微总结,仅供参考
(借鉴:https://blog.csdn.net/Q2605894893/article/details/81327027)
from sklearn.ensemble import RandomForestRegressor
def fill_na_regression(df): # 利用随机森林回归填充
df_blank= df[['column1','column2', 'column3']]
# 假设column1为需要填充的列
df_train= df_blank[age_df.column1.notnull()].as_matrix()
df_test= df_blank[age_df.column11.isnull()].as_matrix()
# y为目标值
y = df_train[:, 0]
# X为特征属性值
X = df_train[:, 1:]
rfr = RandomForestRegressor(random_state=0, n_estimators=2000, n_jobs=-1)
rfr.fit(X, y)
# 用得到的模型进行预测未知列的值
result= rfr.predict(df_test[:, 1:])
# 用得到的预测结果填补原缺失数据
df.loc[ (df.column1.isnull()), 'column1' ] = result
return df
小结
- 此处归纳了部分常用处理缺失值的方法,多使用几次很容易掌握。
- 还有很多填补缺失值的方法,例如热卡填充、KNN填充、回归填充等等,个人在使用过程中暂时没有过多采用其他复杂的方法,而是把更多工作放到特征提取和模型构建当中。
- 填充过程中也可考虑特征之间的相关性,根据强相关性的其他特征来填充缺失特征值,需要具体情况具体分析了。