“输入包含 NaN、无穷大或对于 dtype('float32') 来说太大的值”当我训练 DecisionTreeClassifier [关闭]
Posted
技术标签:
【中文标题】“输入包含 NaN、无穷大或对于 dtype(\'float32\') 来说太大的值”当我训练 DecisionTreeClassifier [关闭]【英文标题】:"Input contains NaN, infinity or a value too large for dtype('float32')" when I train a DecisionTreeClassifier [closed]“输入包含 NaN、无穷大或对于 dtype('float32') 来说太大的值”当我训练 DecisionTreeClassifier [关闭] 【发布时间】:2022-01-16 17:44:28 【问题描述】:我正在尝试为系外行星目录中的数据编写决策树方法。这是我硕士学习课程之一的工作坊。 我在 Jupyter Notebook 上写了这个
import matplotlib.pyplot as plt
import numpy as np
import pandas as pd
import sklearn
data = pd.read_csv('exoplanet.eu_catalog_2021.12.15.csv')
data_new = data.select_dtypes(include=['float64'])#Select only dtype float64 data
data_new[~data_new.isin([np.nan, np.inf, -np.inf]).any(1)]
data_new_2 = data_new.loc[:,('mass', 'mass_error_min')]
data_new_2.dropna(subset =["mass_error_min"], inplace = True)
data_new_2.info()
print(data_new_2)
有了这个结果
<class 'pandas.core.frame.DataFrame'>
Int64Index: 1425 entries, 1 to 4892
Data columns (total 2 columns):
# Column Non-Null Count Dtype
--- ------ -------------- -----
0 mass 1425 non-null float64
1 mass_error_min 1425 non-null float64
dtypes: float64(2)
memory usage: 33.4 KB
如您所见,没有空单元格。此外,我写这个是为了将所有数字转换为 float64(以防万一!)
data_new_2['mass'] = data_new_2['mass'].astype(float)
data_new_2['mass_error_min'] = data_new_2['mass_error_min'].astype(float)
然后,我将数据拆分为训练和测试子集
from sklearn.model_selection import train_test_split
X = data_new_2.drop(["mass"], axis = 1)
y = data_new_2["mass"]
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size = .30, random_state = 42)
没有问题……直到这部分
from sklearn.tree import DecisionTreeClassifier
classifier = DecisionTreeClassifier()
classifier.fit(X_train, y_train_2)
因为我收到此错误消息
ValueError Traceback (most recent call last)
<ipython-input-327-7b81afce3234> in <module>
1 from sklearn.tree import DecisionTreeClassifier
2 classifier = DecisionTreeClassifier()
----> 3 classifier.fit(X_train, y_train_2)
.
.
.
~/.local/lib/python3.6/site-packages/sklearn/utils/validation.py in _assert_all_finite(X, allow_nan, msg_dtype)
104 msg_err.format
105 (type_err,
--> 106 msg_dtype if msg_dtype is not None else X.dtype)
107 )
108 # for object dtype data, we only check for NaNs (GH-13254)
ValueError: Input contains NaN, infinity or a value too large for dtype('float32').
我不明白为什么会出现此错误消息,因为我在 X_train 和 y_train 数据中没有 Nan、infitnity 或“太大”数据。
我能做什么?
【问题讨论】:
你能附上数据集的链接吗? 是的。我很抱歉没有分享数据集的链接drive.google.com/file/d/12xF8ZmEt0Ul9USzpl3fuTZsmoVsiXbu-/… 【参考方案1】:mass_error_min
列中有一些无限值:
data_new_2.describe()
mass mass_error_min
count 1425.000000 1425.0000
mean 6.060956 inf
std 13.568726 NaN
min 0.000002 0.0000
25% 0.054750 0.0116
50% 0.725000 0.0700
75% 3.213000 0.5300
max 135.300000 inf
所以,你必须用一些值填充这些 inf,使用以下代码:
value = data_new_2['mass_error_min'].quantile(0.98)
data_new_2 = data_new_2.replace(np.inf, value)
【讨论】:
谢谢!!!有效!!!!现在,问题是我收到一条新的错误消息: ValueError: Unknown label type: 'continuous' 我知道这是因为分类需要分类值,而不是数字。所以,在那种情况下,我应该使用de DecisionTreeRegressor,而不是DecisionTreeClassifier。好的。我将尝试使用回归器。再次感谢您的帮助!!! 对,我也试过了,你得用DecisionTreeRegressor
@Fabio 对于“我没有 Nan、无穷大或“太大”的数据” :( 对于未来,请注意口头断言不算数 - 你应该可以显示这个
@desertnaut 你是对的,我犯了一个错误。我这么说是因为这是我从“data_new_2.info()”行的结果中得出的结论。那是我的错。感谢您的指正。以上是关于“输入包含 NaN、无穷大或对于 dtype('float32') 来说太大的值”当我训练 DecisionTreeClassifier [关闭]的主要内容,如果未能解决你的问题,请参考以下文章