python - 具有从数据框 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)
提前致谢!
解决方案
是的,有一种更有效的方法。您可以一次使用预测并分配所有缺失值。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])))
如果您添加明确的形状信息,这当然可以简化。
推荐阅读
- c# - UWP 自定义控件事件订阅需要错误类型
- sql - UNION 的第五列在 SAS 中具有不同的数据类型
- c - 为什么要提前声明?
- android - 我在测试邮件中苦苦挣扎?
- node.js - 使用 mongoose 从 Cloud Function 复制到 Compute Engine 中的 mongo 连接
- azure-devops - 使用变量语法的 Azure DevOPs 管道变量
- paddle-paddle - 以下错误的原因是什么?
- apache-flink - Flink:在时间窗口中合并所有键的结果
- excel - 粘贴到最后一个空行
- python - 在 django 中存储持续时间的正确方法