主要记录拉格朗日和随机森林处理缺失值
一、插值法
拉格朗日插值法
#自定义列向量插值函数
#s为列向量,n为被插值的位置,k为取前后的数据个数,默认为5
def ployinterp_column(s, n, k=5):
y = s.reindex(list(range(n-k, n)) + list(range(n+1, n+1+k)))
y = y[y.notnull()] #剔除空值
return lagrange(y.index, list(y))(n) #插值并返回拉格朗日插值结果
#逐个元素判断是否需要插值
for i in data.columns:
for j in range(len(data)):
if (data[i].isnull())[j]==True: #如果为空即插值。
# data[i][j] = ployinterp_column(data[i], j)
data.loc[j,i] = ployinterp_column(data[i], j)
插值前 插值后
二、随机森林插值
基本思想:我们将包含缺失值的列当做标签,如果有很多列都有缺失值,那么按照每一列的缺失值的从小到大来填补,当其他列作为特征时若存在缺失值,使用0先填充
from sklearn.impute import SimpleImputer
from sklearn.ensemble import RandomForestRegressor
data_copy=data.copy()
# 按照缺失量从小到大进行排序
sindex=np.argsort(data_copy.isnull().sum()).values
# 进行缺失值的填补,利用随机上呢了进行填补缺失值
for i in sindex:
if data_copy.iloc[:,i].isnull().sum()==0:
continue
df=data_copy
fillc=df.iloc[:,i]
#获取除待填充列的其他特征列
df=df.iloc[:,df.columns!=df.columns[i]]
# 使用0填充特征列df中的缺失值
df_0=SimpleImputer(missing_values=np.nan
,strategy='constant'
,fill_value=0
).fit_transform(df)
# 获取训练集的标签,待填补列非空数据作为训练集的标签
Ytrain=fillc[fillc.notnull()]
# 获取待预测的标签
Ytest=fillc[fillc.isnull()]
# 获取训练集的特征
Xtrain=df_0[Ytrain.index,:]
Xtest=df_0[Ytest.index,:]
# 使用随机森林算法进行缺失值填补
rfc=RandomForestRegressor()
rfc.fit(Xtrain,Ytrain)
Ypredict=rfc.predict(Xtest)
data_copy.loc[data_copy.iloc[:,i].isnull(),data_copy.columns[i]]=Ypredict