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

时间:2018-08-16 05:42:34

标签: scikit-learn regression nan grid-search kaggle

我正在研究Kaggle数据集“ Santander价值预测挑战”

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之类的线性回归器会引发错误。

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

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

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

希望一个善良的灵魂可以帮助我!

干杯!

1 个答案:

答案 0 :(得分:0)

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

仅使用线性回归器(例如套索,脊和弹性网)会引发错误,而不会在基于树的回归器(例如XGB和lightGBM)中引发错误,因为lightgbm和XGB本身会处理缺失值。但是在线性回归sci-kit学习模型中,不能单独处理缺失值,  因此我们必须执行一些预处理任务。

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

要在sci-kit学习模型中添加此行,即可解决您的问题。

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