问题原因
该报错常常是由于数据存在缺失值 (NaN) 或者数据超出了 float64 数据类型的范围 (如出现了过大或过小的值) 导致的。scikit-learn 中很多算法都要求输入的数据不含缺失值,因此需要对缺失值进行处理。
解决方法
检查数据中是否存在缺失值 (NaN)。
可以使用 pandas 库中的 .isnull() 或 .notnull() 函数:
import pandas as pd
data = pd.read_csv("data.csv")
print(data.isnull().sum()) # 统计每一列的缺失值数量
如果输出结果中存在不为 0 的数,则说明数据中存在缺失值。可以考虑删除含有缺失值的行或者使用合适的填充方法来处理缺失值。
对可能会导致数据溢出的数据进行预处理,去除过大或过小的值。
可以使用 numpy 库中的 .seterr() 函数:
import numpy as np
np.seterr(all='ignore') # 忽略所有错误
或者使用数据的上下界进行截断缩放:
from sklearn.preprocessing import MinMaxScaler
scaler = MinMaxScaler(feature_range=(0, 1)) # 设置数据范围为0-1
scaled_data = scaler.fit_transform(data) # 对数据进行缩放
对发生错误的数据直接进行删除处理。
删除缺失值、nan、inf 或 large 的行:
import numpy as np
data = data[~np.isnan(data).any(axis=1)] # 删除含有 nan 的行
data = data[~np.isinf(data).any(axis=1)] # 删除含有 inf 的行
data = data[np.abs(data) < large].reshape(-1,1) # 删除过大或过小的行
使用 KNN 或者均值、中位数等方法进行填充。
使用 impute 模块中的 SimpleImputer() 函数来填充缺失值:
from sklearn.impute import SimpleImputer
filler = SimpleImputer(strategy="mean") # 求出每列的平均值,并使用其进行填充
data = filler.fit_transform(data)