sklearn线性回归场景下np数组移除NaN值的索引报错如何解决
问题解决:NumPy数组NaN值过滤与线性回归正确实现
错误根源
- 你当前的mask逻辑完全错误:首先你定义的x是固定年份数组,本身不存在NaN值,缺失值仅出现在y数组中;其次
x[~pd.isna(x)]返回的是x的数值而非布尔掩码,两个数值数组做&运算得到的仍为数值类型,无法作为索引使用,因此抛出类型错误。 - sklearn的LinearRegression本身不会自动将NaN转为0,你遇到的0值问题大概率是读入CSV时空值被默认填充为0,或是提取y数组的过程中空值被转换为0。如果读入阶段空值就被转成0,后续过滤NaN的逻辑不会生效,需要先修正读入逻辑。
正确实现代码
import numpy as np import pandas as pd from sklearn.linear_model import LinearRegression munilist = ["Adjuntas", "Anasco", "Ciales", "Jayuya", "Lares", "LasMarias", "Maricao", "Mayaguez", "Orocovis", "Penuelas", "Ponce", "SabanaGrande", "SanGerman", "SanSebastian", "Utuado", "Yauco"] # 固定年份数组提前定义,无需放在循环内重复生成 x_all = np.array([1987, 1992, 1998, 2002, 2007, 2012]).reshape(-1, 1) for municipality in munilist: # 提取对应行政区的y值 y = np.array(df[df["Municipio"]==municipality].iloc[0, 1:7]).reshape(-1, 1) # 生成布尔掩码:保留y值非NaN的位置,flatten将二维布尔数组转为一维方便索引 mask = ~pd.isna(y).flatten() # 过滤得到有效样本对 x_valid = x_all[mask] y_valid = y[mask] # 可选判断:有效样本数≥2才能正常拟合线性回归,避免报错 if len(x_valid) < 2: # 可根据业务逻辑自行处理样本不足的情况,这里示例直接跳过 continue xlin = np.arange(1987, 2013, 1) # 待预测的年份区间 reg = LinearRegression(fit_intercept=True).fit(x_valid, y_valid) a0 = reg.intercept_ a1 = reg.coef_[0]
额外注意事项
- 读入CSV时要确保空值被正确识别为NaN,可在
pd.read_csv中指定参数:df = pd.read_csv("你的文件路径.csv", na_values=["", " "]),将空字符串、空格均识别为空值。 - 如果需要对缺失值做填充而非直接丢弃,可使用
df.fillna()等方法提前完成填充,再进行拟合。
内容的提问来源于stack exchange,提问作者Francis Russell
相关产品推荐
相关产品推荐

