【问题标题】:Fitting model with NaN values in the features在特征中使用 NaN 值拟合模型
【发布时间】:2021-07-22 19:03:09
【问题描述】:

我会知道是否有一种方法可以拟合模型,即使某些特征包含一些 NaN 值。

X

    Feature1    Feature2    Feature3    Feature4    Feature5
0   0.1         NaN         0.3         NaN         4.0
1   4.0         6.0         6.6         99.0        2.0
2   11.0        15.0        2.2         3.3         NaN
3   1.0         6.0         2.0         2.5         4.0
4   5.0         11.2        NaN         3.0         NaN

代码

model = LogisticRegression()
model.fit(X_train, y_train)

错误ValueError: Input contains NaN, infinity or a value too large for dtype('float64').

【问题讨论】:

    标签: python machine-learning scikit-learn


    【解决方案1】:

    通常,基于树的分类器可以处理NaNs,因为它们只是根据特征值拆分数据集。当然也要看算法是怎么实现的。

    我不确定 sklearn 但如果你真的想在保留 NaN 值的同时对它们进行分类,你最好的选择是使用 XGBoost。它不在 sklearn 上,但有非常好的库,而且它们也很容易使用。它也是最强大的分类器之一,所以你一定要试试! https://xgboost.readthedocs.io/en/latest/python/python_intro.html

    【讨论】:

      【解决方案2】:

      您可以使用SimpleImputer()nan 替换为平均值或拟合模型之前的常数。查看documentation 以找到适合您用例的正确策略。

      在您的情况下,如果您希望仍然拥有 nan 值并将它们排除在等式之外,您可以使用 SimpleImputer(strategy='constant', fill_value=0)nan 简单地替换为 0

      如下:

      from sklearn.impute import SimpleImputer
      from sklearn.linear_model import LinearRegression
      
      model = make_pipeline(
          SimpleImputer(strategy='constant', fill_value=0),
          LinearRegression()
      )
      model.fit(X, y)
      

      注意:我在这里使用了一个一次性完成所有步骤的管道。

      【讨论】:

      • 我不想摆脱它们,我想保留 NaN 值。
      • 保留 NaN 有什么意义? @luka
      • 我会用我拥有但不近似值的某些特征拟合模型,例如其他特征的平均值,或者去掉它们。
      • @luka,我编辑了我的答案。通过将nan 值设置为0,您可以将它们从等式中剔除,而不会摆脱它们。
      • @AntoineDubuis 但是这样模型会将0 视为价值?事实上,这些功能的价值不是0
      猜你喜欢
      • 2023-01-23
      • 2014-11-26
      • 2018-10-31
      • 2019-08-18
      • 2021-07-28
      • 2016-08-03
      • 2017-01-24
      • 2020-11-03
      • 2014-12-10
      相关资源
      最近更新 更多