NaN 在 scikit-learn 中产生问题

Posted

技术标签:

【中文标题】NaN 在 scikit-learn 中产生问题【英文标题】:NaNs create problems in scikit-learn 【发布时间】:2022-01-11 02:19:39 【问题描述】:

我的数据框如下所示:

  testId    wordNumber_no    difficulty    containsPhoto     complicatedWords     Verdict
0     t1              140           NaN                0         7.653800e+06        Easy
1     t2              300           NaN                1         7.645800e+06        Hard
2     t3              394  7.653800e+06                0                  NaN        Hard
...

为了预测Verdict,我轻松地使用了 XGBoost,它运行良好。我也想试试 AdaBoost

import pandas as pd
from sklearn import model_selection
from sklearn.ensemble import AdaBoostClassifier
from sklearn.model_selection import train_test_split
from sklearn import metrics

cols_to_drop = ['testId'] 
df.drop(cols_to_drop, axis=1, inplace=True)
X = df.drop('Verdict', axis=1)
y = df['Verdict']

X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.20, random_state=5) #not sure if random_state is needed, it fails both with and without it

abc = AdaBoostClassifier(n_estimators=50, learning_rate=1)
model = abc.fit(X_train, y_train)
y_pred = model.predict(X_test)

但是在拟合模型时我得到ValueError: Input contains NaN, infinity or a value too large for dtype('float64')

我做了什么:

由于df.isnull().any() 返回Trues,我做了df = df.fillna(method='ffill'),但错误仍然存​​在。然后我尝试了df = df.fillna(lambda x: x.median()),但由于 lambda 函数,我得到了TypeError: float() argument must be a string or a number, not 'function'。有什么解决方法吗?

【问题讨论】:

ffill 不一定会填充所有的 NaN。我认为如果在列的开头有 NaN(即,在它们之前没有非 NaN 可以填充),它们将保持 nan。 代替df.fillna(method='ffill'),试试这个:df.ffill().bfill() @user17242583 你是对的,我检查了它并没有删除所有这些。但是某些列充满了 NaN... @user17242583 我试过了,它删除的 NaN 更少:)) 真的吗?复制和粘贴你的 df 并像这样使用 bfill+ffill 对我有用。 【参考方案1】:

    您可以删除所有包含 NaN 的行

     df.dropna()
    

    用列平均值替换 NaN。将其用于所有列

     df[col].fillna(df[col].mean())
    

确保首先从初始数据集中删除所有 NaN,然后​​从中制作训练和测试样本。

【讨论】:

谢谢你的建议,我试试看。但是,我有几列包含大量 NaN(奇怪的是,我可以在 XGBoost 中逃脱),这会影响我的模型吗? df.dropna() 返回一个 0 行的数据帧,哎呀。 它与df=df.fillna(df.mean()) 合作。

以上是关于NaN 在 scikit-learn 中产生问题的主要内容,如果未能解决你的问题,请参考以下文章

附加列在 pandas DataFrame 中产生 NaN

当任何数学运算在 .net 4 中产生“NaN”时,如何强制 C# 编译器抛出异常?

MATLAB中NaN是怎么产生的,又如何具体的去解决?

c ++:在数学错误中创建实际错误而不是nan

在 C++ 中产生一组整数的排列。获取分段错误

在 R 中转换 POSIXct 会在 3.5.0 版中产生 NA [重复]