首页 > 解决方案 > 具有从数据框 pandas 中的两列构建的线性回归模型的 fillna

问题描述

我有如下所示的数据框:

    sepal length    sepal width   petal length  petal width     target
0      4.9              3.5            1.4          0.2         setosa
1      4.9              3.0            1.4          0.2         setosa
2      4.7              3.2            1.3          0.2         setosa
3      4.6              3.1            1.5          0.2         setosa
4      5.0              3.6            1.4          NaN         setosa
      ...   

我使用花瓣宽度和花瓣长度创建了 LinearRegression() 模型。现在我想使用我训练过的线性回归模型来填充 NaN 值。

这是我尝试过的,它有效,但是我很想知道是否有更有效的方法。

def fillna_linear_reg(length, width):
    if pd.isna(length):
        pred_length = lin_reg.predict([[width]]) 
        return pred_length[0][0]
    else:
        return length

iris_df["petal length (cm)"] = iris_df.apply(lambda x: fillna_linear_reg(x["petal length (cm)"], x["petal width (cm)"]), axis=1)

提前致谢!

标签: pythonpandas

解决方案


是的,有一种更有效的方法。您可以一次使用预测并分配所有缺失值。df.apply尽可能避免使用。它会破坏性能,尤其是与其他可矢量化函数一起使用时,例如predict(或什至已经矢量化的)(我假设如此)sklearn模型的方法。

def fillna_linear_reg(lin_reg, length, width):
    nan_mask = length.isna()
    pred_length = lin_reg.predict(width.loc[nan_mask])
    length.loc[nan_mask] = pred_length

fillna_linear_reg(
    lin_reg, iris_df.loc[:, "petal length (cm)"], iris_df.loc[:, "petal width (cm)"]
)

根据您用于训练的机器学习模块,您可能需要将 x 数据predict作为二维数组传递给该方法,然后再压缩回一维数组。如果是这样,您可以将包含预测的行替换为:

pred_length = np.squeeze(lin_reg.predict(np.atleast_2d(width.loc[nan_mask])))

如果您添加明确的形状信息,这当然可以简化。


推荐阅读