输入包含 NaN、无穷大或值太大。使用 gridsearchcv 时,scoring = 'neg_mean_squared_log_error'
Input contains NaN, infinity or a value too large.. when using gridsearchcv, scoring = 'neg_mean_squared_log_error'
我正在研究 Kaggle 数据集 'Santander Value Prediction Challenge'
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').
所有列都是 float 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
。
• 在使用 基于树的回归器 时未发现错误,例如 XGB
和 lightGBM
。
• 我的训练集在应用 PCA 后大约有 4600 行和 1900 个变量,当我分别用 1 到 500、500 到 100、1000 到 1500 和 1500 到 1900 的变量拟合 GridSearchCV 时,没有发现错误。
试了这么多还是没找到报错的原因,请问有没有人遇到过类似情况,知道为什么?
希望好心人能帮帮我!
干杯!
您可以通过添加此行来解决此错误。我也是Kaggler,也面临着类似的问题。
只有使用 lasso、ridge 和 elasticnet 等线性回归器才会引发错误,而不会在 XGB 和 lightGBM 等基于树的回归器中引发错误,因为 lightgbm 和 XGB 会自行处理缺失值。但是在线性回归 sci-kit 学习模型中并不能自行处理缺失值,
所以我们必须执行一些预处理任务。
您的数据集可能包含空值、缺失值、inf 值。所以,我们必须填补缺失值并将无限值限制在某个范围内。
在 sci-kit 学习模型中添加这一行可以解决您的问题。
df = df.fillna(df.median()).clip(-1e11,1e11)
我正在研究 Kaggle 数据集 'Santander Value Prediction Challenge'
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').
所有列都是 float 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
。
• 在使用 基于树的回归器 时未发现错误,例如 XGB
和 lightGBM
。
• 我的训练集在应用 PCA 后大约有 4600 行和 1900 个变量,当我分别用 1 到 500、500 到 100、1000 到 1500 和 1500 到 1900 的变量拟合 GridSearchCV 时,没有发现错误。
试了这么多还是没找到报错的原因,请问有没有人遇到过类似情况,知道为什么?
希望好心人能帮帮我!
干杯!
您可以通过添加此行来解决此错误。我也是Kaggler,也面临着类似的问题。
只有使用 lasso、ridge 和 elasticnet 等线性回归器才会引发错误,而不会在 XGB 和 lightGBM 等基于树的回归器中引发错误,因为 lightgbm 和 XGB 会自行处理缺失值。但是在线性回归 sci-kit 学习模型中并不能自行处理缺失值, 所以我们必须执行一些预处理任务。
您的数据集可能包含空值、缺失值、inf 值。所以,我们必须填补缺失值并将无限值限制在某个范围内。
在 sci-kit 学习模型中添加这一行可以解决您的问题。
df = df.fillna(df.median()).clip(-1e11,1e11)