首页 > 解决方案 > scikit-learn:RandomForestRegressor:训练时的ValueError

问题描述

我有一个s包含我的标签的 pandas 系列和一个df包含我的数据的 pandas DataFrame。我想使用 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 

s我在和中也没有空值df

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)。如果有人了解这里发生了什么,我很感兴趣。

标签: pythonpandasscikit-learn

解决方案


这可能是由于数据的巨大差异(例如,字段 1 在范围内:~1 到 ~10 和字段 2 在范围内:~300 到 ~5000)

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

缩放器 = MinMaxScaler()

df = scaler.fit_transform(df)


推荐阅读