【问题标题】:How can to ignore a Nan in a .csv file in python?如何在 python 中忽略 .csv 文件中的 Nan?
【发布时间】:2021-04-27 19:57:01
【问题描述】:

我在读取 .csv 文件的列时遇到问题。我有这个代码:

# Importing the libraries
import numpy as np
import matplotlib.pyplot as plt
import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import confusion_matrix
from sklearn.metrics import classification_report
from sklearn.ensemble import RandomForestClassifier
from sklearn.svm import SVC
from sklearn.pipeline import make_pipeline
from sklearn.preprocessing import StandardScaler


# Importing the dataset
dataset = pd.read_csv('D:/CTU/ateroskleroza/development/results_output6.csv')
print(dataset.head())


X = dataset.iloc[:, 2:16].values
y = dataset.iloc[:, 0].values


# Splitting the dataset into the Training set and Test set

X_train, X_test, y_train, y_test = train_test_split(X, y, test_size = 0.25)

classifier = make_pipeline(StandardScaler(), SVC(gamma='auto'))
classifier.fit(X_train, y_train)

y_pred = classifier.predict(X_test)

# Making the Confusion Matrix

cm = confusion_matrix(y_test, y_pred)
print(cm)
# Generating accuracy, precision, recall and f1-score

target_names = ['Progressive','Stable']
print(classification_report(y_test, y_pred, target_names=target_names))

.csv 看起来像这样:

根据图片的名称,它们有一些列,另一些则与 Nan。问题是当我尝试执行此代码时出现此错误:

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

那么我怎样才能忽略 Nan 而只使用数字呢? (我不想删除空列,执行时忽略 Nan)。

【问题讨论】:

  • 你需要为它制定一个策略,可以是df.fillna(0.0)左右。
  • @simpleApp 但是我的结果会改变,对吧?因为我给 Nan 赋值,如果我用这个结果进行训练,它们会影响最终结果
  • 是或否。只要有 nan 值,就需要一些攻击计划。如果它太稀疏,你要么删除它,要么用某个值替换它。

标签: python scikit-learn missing-data


【解决方案1】:

我是根据个人经验写这个答案的。如果您想要更详细的答案,请考虑使用我们可以使用的数据集更新您的帖子,说明模型应该预测什么并描述特征。

@simpleApp 建议在缩放数据和拟合模型之前用零替换空值。在 cmets 中,您似乎担心将 null 值归入最终模型的影响。

在处理缺失数据时,您必须权衡估算值的利弊。如果您决定忽略具有空值的观察(通过删除列或整个观察),您可能会错过一些非常重要的信息,并且您将无法对新观察进行预测,除非它们的数据完全完整。同样,如果您不小心将空值插入到某个随机值中,您可能会在模型中引入偏差。

如果您正确估算值,您的模型将能够处理丢失的数据,而不会影响其准确性。但遗憾的是,估算值更像是一门艺术,而不是一门硬科学。

我不知道您的数据意味着什么,但可以将年龄视为预测心脏病风险的独立变量。问问自己:如果缺少某个值,我是否最好忽略观察结果,或者我是否可以用一个平均而言与未观察到的患者实际年龄相差不太远的值来填补空白?

如果你决定用一些值来填充缺失的信息,我会建议四种非常简单的方法:

# Fill with minimum value
df = df.fillna(df.mean(), axis=1)

# Fill with median value
df = df.fillna(df.median(), axis=0)

# Fill with mean value
df = df.fillna(df.mean(), axis=0)

# Fill with maximum value
df = df.fillna(df.max(), axis=0)

您的下一步应该是对生成的模型进行评分,并选择最能概括未知数据的模型。

在其他常见的插补技术中,您可以使用零 (df.fillna(0))、最常见的值(检查 SimpleImputer)或更复杂的插补技术(例如 nearest neighbors)填充空值。

最后,您会发现,当您测试模型在看不见的数据上的性能时,将空值归入是否是正确的做法。

作为一般经验法则,您应该考虑删除所有缺失值超过 20% 的列。

【讨论】:

  • 非常感谢!!我真的很感谢你的回答。关键是我不想填充 NaN,我只想忽略它们。不可能吗?
  • 不,这是不可能的,尤其是对于 SVC 模型。您可以 i) 删除带有 NaN 的行,ii) 删除这些列或 iii) 填写空值。如果您考虑一下,不传递值本身就是信息。所以你永远不能真正“忽略” NaN。我们只是填充它们以避免数据类型冲突。
猜你喜欢
  • 1970-01-01
  • 2018-06-22
  • 2018-10-18
  • 2014-08-14
  • 2019-12-01
  • 2013-09-14
  • 2015-07-12
  • 2017-08-12
  • 2014-05-08
相关资源
最近更新 更多