输入包含 NaN、无穷大或值太大.. 使用 gridsearchcv 时,评分 = 'neg_mean_squared_log_error'

Posted

技术标签:

【中文标题】输入包含 NaN、无穷大或值太大.. 使用 gridsearchcv 时,评分 = \'neg_mean_squared_log_error\'【英文标题】:Input contains NaN, infinity or a value too large.. when using gridsearchcv, scoring = 'neg_mean_squared_log_error'输入包含 NaN、无穷大或值太大.. 使用 gridsearchcv 时,评分 = 'neg_mean_squared_log_error' 【发布时间】:2019-01-23 00:21:01 【问题描述】:

我正在研究一个 Kaggle 数据集“桑坦德价值预测挑战”

lasso = Lasso()
lasso_para = 'alpha' :[0.001,0.01,0.02]
gs = GridSearchCV(estimator = lasso, 
                 param_grid = lasso_para,
                 cv = 10,
                 scoring = 'neg_mean_squared_log_error',
                 verbose = 2)
gs.fit(train,df_y)

当我尝试使用 GridSearchCV 来拟合训练集时出现错误。

File "C:\Users\HP\Anaconda3\lib\site-packages\sklearn\utils\validation.py", line 44, in _assert_all_finite
    " or a value too large for %r." % X.dtype)

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

所有列都是浮点数 64:

train.info()
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 4459 entries, 0 to 4458
Columns: 1894 entries, 0 to 1893
dtypes: float64(1894)
memory usage: 64.4 MB

df_y.info()
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 4459 entries, 0 to 4458
Data columns (total 1 columns):
target    4459 non-null float64
dtypes: float64(1)
memory usage: 34.9 KB

• 我使用sum(dataset.isnull().sum()) 检查了训练集和 y 值,两个输出均为 0。

sum(train.isnull().sum())
Out[46]: 0

sum(df_y.isnull().sum())
Out[47]: 0

• 此错误仅在我设置 scoring = 'neg_mean_squared_log_error' 时发生,但在使用 MSE 时工作正常。

• 如果我在没有 k 折交叉验证的情况下拟合整个训练集,则不会发现错误。

lasso.fit(train,df_y)
Out[48]: 
Lasso(alpha=1.0, copy_X=True, fit_intercept=True, max_iter=1000,
   normalize=False, positive=False, precompute=False, random_state=None,
   selection='cyclic', tol=0.0001, warm_start=False)

• 在使用基于整个训练集的预测函数时,所有y pred 均为正数。

y_pred_las = lasso.predict(train)
min(y_pred_las)
Out[50]: 26.871339344757036
np.isnan(y_pred_las).any()
Out[59]: False

• 只有使用 线性回归器(例如 lasso, ridge and elasticnet)才会引发错误。

• 使用基于树的回归器(例如XGBlightGBM)时未发现错误。

• 应用 PCA 后,我的训练集大约有 4600 行和 1900 个变量,当我分别用 1 到 500、500 到 100、1000 到 1500 和 1500 到 1900 的变量拟合 GridSearchCV 时,没有发现错误。

经过这么多尝试,我仍然无法找出错误的原因,以前有没有人遇到过类似的情况并知道为什么?

希望好心人能帮帮我!

干杯!

【问题讨论】:

请发布您的完整代码。 我更新了我的帖子!再次感谢您的帮助! 【参考方案1】:

您可以通过添加此行来解决此错误。我也是 Kaggler,也面临类似的问题。

只有使用线性回归器(如 lasso、ridge 和 elasticnet)才会引发错误,而不是基于树的回归器(如 XGB 和 lightGBM),因为 lightgbm 和 XGB 会自行处理缺失值。但是在线性回归 sci-kit 学习模型中不能自己处理缺失值, 所以我们必须执行一些预处理任务。

您的数据集可能包含空值、缺失值、inf 值。因此,我们必须填充缺失值并将无限值裁剪到某个范围。

在 sci-kit 学习模型中添加这一行来解决您的问题。

df = df.fillna(df.median()).clip(-1e11,1e11)

【讨论】:

原来是因为我的预测值太高导致这个问题。无论如何,我都会感谢你的帮助!

以上是关于输入包含 NaN、无穷大或值太大.. 使用 gridsearchcv 时,评分 = 'neg_mean_squared_log_error'的主要内容,如果未能解决你的问题,请参考以下文章

Python - 输入包含 NaN、无穷大或对于 dtype('float64') 来说太大的值

Jupiter Notebook:输入包含 NaN、无穷大或对于 dtype('float64') 来说太大的值

在使用管道进行预处理后,如何解决“输入包含 NaN、无穷大或对于 dtype('float64') 而言太大的值”?

Scikit-learn:输入包含 NaN、无穷大或对于 dtype 来说太大的值('float64')

ValueError:输入包含 NaN、无穷大或对于 dtype 来说太大的值

GridSearchCV():ValueError:输入包含 NaN、无穷大或对于 dtype('float64') 来说太大的值