我有一个包含我的标签的熊猫系列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
在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)。
如果有人了解这里发生了什么,我很感兴趣。
答案 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)的形式告知我们。