【问题标题】:input contains NaN when i'm trying to train model当我尝试训练模型时,输入包含 NaN
【发布时间】:2021-08-06 20:52:48
【问题描述】:

你能告诉我如何解决这个错误吗 我使用决策树来训练中风的模型。 数据集在 kaggle 上,但是.. 我不明白这个问题。

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
dataset = pd.read_csv("train.csv")
X = dataset.iloc[:,[0,12]].values
Y = dataset.iloc[:,13].values
from sklearn.preprocessing import StandardScaler
SC = StandardScaler()
X = SC.fit_transform(X)
from sklearn.tree import DecisionTreeClassifier
classifier = DecisionTreeClassifier(criterion = "entropy")
classifier.fit(X,Y)

这是错误:

我的 train.csv :https://www.kaggle.com/fedesoriano/stroke-prediction-dataset

【问题讨论】:

  • 您应该分析您的数据并删除或替换丢失的数据。像 X=X.fillna(X.median()) 这样的东西可以根据您的数据来解决问题。
  • 通过检查给定链接中的数据,我可以看到 bmi 列中存在缺失值。尝试用缺失值估算数据。

标签: python machine-learning google-colaboratory


【解决方案1】:

我不知道我在使用什么数据,但是要删除 Nan,请添加以下内容

x_train = x_train.dropna()

希望你能回答你的问题

【讨论】:

  • 看到空值时直接删除它们真的是最好的主意吗?这些空值中可能编码了有用的信息——这只是找到处理此类数据的最佳方法的问题。
  • 不是最好的主意...检查例如scikit-learn.org/stable/modules/impute.html
【解决方案2】:

许多 scikit-learn 估算器(例如您尝试使用的决策树模型)本身并不支持空 (np.nan) 类型。因此,在将数据集提供给估算器之前,您需要以某种方式处理这些 NaNs。您可以 1) 放弃任何存在空值的情况(不一定是最好的主意!),或 2) 应用某种插补方案来用一些合理的值填充这些空值。选项 2 通常是首选,因为您的数据集中可能有充分的理由出现空值(即,这些空值中可能包含有用的信息,您的模型可能会从中受益)。

有关插补和 scikit-learn 的更多信息,请阅读 this

值得注意的是,您可以“通过”StandardScaler 部分而不会出错,因为正如 here 所述:

NaN 被视为缺失值:在 fit 中忽略,在 transform 中保持。

因此,虽然在拟合缩放器时会忽略这些 NaN,但它们会在转换中保留。

有关是否在插补之前或之后进行缩放的详细信息,请阅读this。但是由于您使用的是基于树的模型并且缩放是单调变换(即它不会影响数据的排名),因此您根本不需要应用缩放。

最后,有 一些 scikit-learn 估计器可以原生处理 NaN(不需要插补),例如this.

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-01-26
    • 2020-12-24
    • 1970-01-01
    • 2018-09-25
    • 2022-01-16
    • 2020-10-02
    • 1970-01-01
    • 2020-01-19
    相关资源
    最近更新 更多