使用pandas开展多元线性回归时触发DataFrame真值歧义ValueError问题咨询
报错根因
- 直接触发当前报错的核心错误:scikit-learn的
LinearRegression类初始化时,根本不接受训练特征、标签作为入参。你在初始化模型时写的linear_model.LinearRegression(x,y),在早期版本的scikit-learn运行环境中,会把第一个传入的特征DataFrame赋值给本该接收布尔值的fit_intercept参数(用于控制是否计算模型截距),第二个传入的标签DataFrame赋值给后续的参数位。等到模型执行fit逻辑、对fit_intercept做真值判断时,就会因无法确定DataFrame的布尔值状态,抛出对应的ValueError。 - 后续运行必然触发的潜在问题:你选取的
City列是文本类分类变量,没有做编码转换的话,即使修好初始化参数的错误,模型也会因为无法识别字符串类型的特征值抛出类型不匹配错误。
修正后的实现代码
from sklearn import linear_model from sklearn.preprocessing import OneHotEncoder from sklearn.compose import ColumnTransformer import pandas as pd # 读取数据集 data = pd.read_csv('manydatas.csv') # 划分特征与标签 X = data[['Bedrooms', 'City', 'Age']] y = data['Selling Price'] # 对文本分类列City做独热编码,保留数值列原样输入模型 feature_processor = ColumnTransformer( transformers=[ ('city_encoder', OneHotEncoder(drop='first'), ['City']) ], remainder='passthrough' ) # 正确初始化模型:仅传入模型超参数,不传入训练数据 line = linear_model.LinearRegression() # 先完成特征编码,再将处理后的特征与标签传入fit方法 processed_X = feature_processor.fit_transform(X) line.fit(processed_X, y)
适配大规模数据集的优化提示
- 当数据集规模超出内存承载上限时,可以通过pandas的分块读取功能加载数据,逐批次传入
fit方法完成模型训练,不需要一次性将全量数据载入内存。 - 当样本量达到十万级以上,可换用基于随机梯度下降的
SGDRegressor替代普通线性回归,进一步降低大样本下的训练耗时。 - 训练完成后可直接通过
line.coef_、line.intercept_获取回归模型的系数与截距,对接后续预测逻辑开发。
内容的提问来源于stack exchange,提问作者dbzfan2012
相关产品推荐
相关产品推荐

