训练时的scikit-learn:RandomForestRegressor:ValueError

时间:2019-04-02 08:59:52

标签: python pandas scikit-learn

我有一个包含我的标签的熊猫系列s和一个包含我的数据的熊猫DataFrame df。 我想使用sklearn RandomForestRegressor生成标签的预测。

model = RandomForestRegressor(n_estimators=1000, max_depth= 30 , random_state=31415)
model.fit(df, s)

但是,当我这样做时,.fit()会引发以下异常:

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

我真的不明白为什么会有这个错误。我的标签以及DataFrame的所有列都是数字:

print(s.describe(), header=True)

count      1168.000000
mean     181193.444349
std       81756.636708
min       34900.000000
25%      129000.000000
50%      160000.000000
75%      214600.000000
max      755000.000000
Name: Label, dtype: float64

print(df.describe())

            Field1       Field2       Field3       Field4       Field5       Field6       Field7        Field8
count  1168.000000  1168.000000  1168.000000  1168.000000  1168.000000  1168.000000  1168.000000   1168.000000 
mean      6.080479  1519.982877     1.749144  1057.800514     0.973459     1.556507  1970.724315   1984.442637 
std       1.392363   540.953069     0.760811   444.809832     0.160807     0.554077    29.939059     20.626356 
min       1.000000   334.000000     0.000000     0.000000     0.000000     0.000000  1872.000000   1950.000000 
25%       5.000000  1123.750000     1.000000   795.750000     1.000000     1.000000  1953.750000   1966.000000 
50%       6.000000  1465.000000     2.000000   990.000000     1.000000     2.000000  1972.000000   1993.000000 
75%       7.000000  1786.000000     2.000000  1291.500000     1.000000     2.000000  2000.000000   2003.000000 
max      10.000000  5642.000000     4.000000  6110.000000     1.000000     3.000000  2010.000000   2010.000000 

sdf中也没有空值:

print(np.isnan(s).unique())

[False]


print(df.isnull().sum().sort_values(ascending=False))

Field8     0
Field7     0
Field5     0
Field5     0
Field4     0
Field3     0
Field2     0
Field1     0
dtype: int64

我什至手动检查了我的数据,但没有看到任何奇怪的值。

什么可能导致此错误?

编辑:

尝试了多种方法之后,我找到了解决方案(即使我不太了解为什么这可以解决我的问题)。

就我而言,添加

df.reset_index(drop=True)

.fit()调用解决问题之前(如拟议的here)。 如果有人了解这里发生了什么,我很感兴趣。

2 个答案:

答案 0 :(得分:0)

这可能是由于数据的巨大差异(例如,字段1的范围是〜1至〜10,字段2的范围是〜300至〜5000)

尝试应用特征缩放,然后拟合模型。

scaler = MinMaxScaler()

df = scaler.fit_transform(df)

答案 1 :(得分:0)

听起来缺少值。也可能是某些数据点没有被 isnan / isnull 函数视为 NaN ,因为它具有空格或此类字符,而ML模型不能接受,因此必须只能是数值。

请使用以下代码行检查数据框列的数据类型:

df.dtypes

我还需要您将特征数据框(df)和目标数据框(s)的形式告知我们。