【发布时间】: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 对我有用。
标签: python pandas dataframe scikit-learn nan