Python线性回归拟合报错求助:ValueError: Input contains NaN
解决LinearRegression拟合时的ValueError: Input contains NaN问题
问题原因
sklearn的线性回归模型要求输入的特征矩阵X或目标变量Y不能包含缺失值(NaN),你的报错就是因为X或Y中存在未处理的缺失值。
步骤1:定位NaN位置
先确认缺失值出现在X还是Y中,用以下代码检查:
# 若X、Y是pandas DataFrame/Series import pandas as pd print("X中的缺失值数量:\n", X.isnull().sum()) print("Y中的缺失值数量:\n", Y.isnull().sum()) # 若X、Y是numpy数组 import numpy as np print("X是否存在NaN:", np.isnan(X).any()) print("Y是否存在NaN:", np.isnan(Y).any())
步骤2:处理缺失值
以下是两种常用的解决方法:
方法一:删除含缺失值的样本
直接移除包含NaN的行,注意要同步删除X和Y中对应的样本,保证数据对齐:
# 用pandas合并后统一处理 data = pd.concat([X, Y], axis=1) data_clean = data.dropna(axis=0) X_clean = data_clean.iloc[:, :-1] # 假设Y是最后一列 Y_clean = data_clean.iloc[:, -1] # 训练模型 LR = LinearRegression(normalize=True) LR.fit(X_clean, Y_clean) y_predict = LR.predict(X_test)
方法二:填充缺失值(更推荐,避免丢失数据)
用均值、中位数或众数填充缺失值,也可以用sklearn的SimpleImputer工具:
# 方式1:用pandas直接填充 X.fillna(X.mean(), inplace=True) # 用特征列的均值填充 Y.fillna(Y.mean(), inplace=True) # 若Y有缺失值,用目标变量均值填充 # 方式2:用sklearn的SimpleImputer(适合后续构建机器学习流水线) from sklearn.impute import SimpleImputer imputer = SimpleImputer(strategy='mean') # 可选策略:median、most_frequent X_clean = imputer.fit_transform(X) # 若Y是一维数组,需先转二维再填充 Y_clean = imputer.fit_transform(Y.values.reshape(-1, 1)).flatten() # 训练模型 LR = LinearRegression(normalize=True) LR.fit(X_clean, Y_clean) y_predict = LR.predict(X_test)
关键注意事项
处理测试集X_test时,必须复用训练集的缺失值处理逻辑(比如用训练集计算的均值填充),避免数据泄露:
# 测试集处理示例(用训练集的imputer) X_test_clean = imputer.transform(X_test)
内容的提问来源于stack exchange,提问作者UDAY Gupta
相关产品推荐
相关产品推荐

