基于ML的笔记本价格预测应用报错:无法将字符串转为浮点数
解决笔记本价格预测模型中的ValueError:无法将字符串转为浮点数
问题原因
你的代码中,ColumnTransformer仅对指定的[0,1,7,10,11]列做了独热编码,但训练数据中还有其他包含字符串的列(比如出现'Intel'的CPU品牌列)。由于设置了remainder='passthrough',这些未处理的字符串列会直接传递给后续的线性回归模型,而线性回归只能处理数值型数据,因此触发ValueError。
解决方案
需要确保所有字符串类型的特征列都被编码为数值型,以下是两种可靠实现方式:
方式1:手动指定所有字符串列的索引
- 先查看所有特征列的数据类型,找出所有
object类型(字符串)的列:
print(X_train.dtypes)
- 将所有字符串列的索引加入
OneHotEncoder的处理列表,比如假设额外的字符串列索引是2,修改后的代码:
step1 = ColumnTransformer(transformers=[ ('col_tnf', OneHotEncoder(sparse=False, drop='first'), [0,1,2,7,10,11]) # 包含所有字符串列索引 ], remainder='passthrough') step2 = LinearRegression() pipe = Pipeline([ ('step1', step1), ('step2', step2) ]) pipe.fit(X_train, y_train) y_pred = pipe.predict(X_test) print('R2 score', r2_score(y_test, y_pred)) print('MAE', mean_absolute_error(y_test, y_pred))
方式2:自动选择字符串列(更灵活)
使用make_column_selector自动识别所有字符串列,无需手动写索引,适合特征列较多的场景:
from sklearn.compose import make_column_selector step1 = ColumnTransformer(transformers=[ ('cat_encoder', OneHotEncoder(sparse=False, drop='first'), make_column_selector(dtype_include=object)), ('num_passthrough', 'passthrough', make_column_selector(dtype_exclude=object)) ]) step2 = LinearRegression() pipe = Pipeline([ ('step1', step1), ('step2', step2) ]) pipe.fit(X_train, y_train) y_pred = pipe.predict(X_test) print('R2 score', r2_score(y_test, y_pred)) print('MAE', mean_absolute_error(y_test, y_pred))
补充说明
- 如果某些字符串列是有序分类特征(比如屏幕分辨率等级:1080p < 2K < 4K),可以用
OrdinalEncoder替代OneHotEncoder,避免特征维度爆炸。 - 独热编码的
drop='first'参数可以避免多重共线性,适合线性回归模型。
内容的提问来源于stack exchange,提问作者nesly
相关产品推荐
相关产品推荐

