scikit-learn报”ValueError: Input contains NaN, infinity or a value too large for dtype(‘float64’) “的原因以及解决办法

  • Post category:Python

scikit-learn是Python中一个流行的机器学习库。当我们在使用它时,有时会遇到”ValueError: Input contains NaN, infinity or a value too large for dtype(‘float64’)”的报错。这个错误通常发生在输入数据中包含NaN、无穷大的值或者数据类型过大的值时。

对于这个错误,有以下几种解决办法:

  1. 检查数据:首先我们需要检查数据中是否存在NaN或者无穷大的值,如果存在就需要进行处理。可以使用pandas库中的 dropna()命令,去除含有缺失值的行或列。或者使用fillna()命令,将NaN的值替换成指定的值。

  2. 数据预处理:另一种解决方法就是使用数据预处理的技术,比如归一化、标准化等。这些技术可以在保证数据信息不丢失的情况下,尽可能的降低数据的复杂度。使用sklearn库中的preprocessing模块可以很容易的实现数据预处理。

  3. 更改数据类型:有时候,数据类型过大也会导致这个错误。可以试着使用astype()函数改变数据类型。比如将float64改为float32等。

下面是一些针对不同情况的具体代码解决方法:

  1. 使用pandas库中的dropna()函数:
import pandas as pd
df = pd.read_csv('data.csv')
df = df.dropna()
  1. 使用sklearn库中的Imputer类补全丢失值:
from sklearn.preprocessing import Imputer
imp = Imputer(missing_values='NaN', strategy='mean', axis=0)
imp.fit(X_train)
X_train = imp.transform(X_train)
  1. 使用sklearn中的MinMaxScaler()进行归一化处理:
from sklearn.preprocessing import MinMaxScaler
scaler = MinMaxScaler()
X_train = scaler.fit_transform(X_train) 
  1. 将数据类型从float64改为float32:
X_train = X_train.astype('float32')

通过以上方式,可以有效地解决”ValueError: Input contains NaN, infinity or a value too large for dtype(‘float64’)”的问题。