sklearn LinearRegression调用predict报无有效特征名解决方法
问题产生原因
这个警告是scikit-learn 1.0版本新增的特征一致性校验逻辑触发的,不属于代码逻辑错误,不会改变预测结果的数值。
你调用fit()训练模型时,传入的特征参数df[['year']]是pandas DataFrame对象,自带列名(即特征名year),模型训练完成后会留存训练时用到的特征名记录。但你调用predict()做预测时传入的是整数标量2020,既不满足模型要求的二维输入结构,也没有携带和训练阶段匹配的特征名信息,因此触发校验警告。
教学视频中代码运行无警告,是因为视频录制时使用的scikit-learn版本低于1.0,当时版本尚未加入特征名一致性检查的逻辑。
修复方案
核心修复逻辑是保证传入predict()的输入结构符合模型要求,和训练时的输入格式对齐即可,常用修复方式有三种:
- 传入带匹配特征名的DataFrame结构,完全对齐训练时的输入格式
reg.predict(pd.DataFrame([[2020]], columns=['year']))
- 传入二维格式的列表或NumPy数组,这类无特征名的输入结构会跳过特征名校验,不会触发警告
# 嵌套列表写法 reg.predict([[2020]]) # NumPy数组写法 import numpy as np reg.predict(np.array([[2020]]))
- 训练阶段就将输入转为无特征名的NumPy数组,从根源上跳过特征名记录逻辑,后续预测直接传二维数值结构即可
# 训练时取values转numpy数组,不保留特征名 reg.fit(df[['year']].values, df['per capita income (US$)'].values) reg.predict([[2020]])
补充说明:该警告仅做风险提示,不会中断代码运行,也不会导致预测结果偏差。如果确认传入的特征数值、顺序正确,即使暂不处理警告,得到的2020年加拿大人均收入预测值也是准确的。警告设计的初衷是避免用户在多特征场景下传错特征顺序、漏传特征,导致预测结果完全错误却无感知。
内容的提问来源于stack exchange,提问作者Mert Erişen
相关产品推荐
相关产品推荐

