You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于ML的笔记本价格预测应用报错:无法将字符串转为浮点数

解决笔记本价格预测模型中的ValueError:无法将字符串转为浮点数

问题原因

你的代码中,ColumnTransformer仅对指定的[0,1,7,10,11]列做了独热编码,但训练数据中还有其他包含字符串的列(比如出现'Intel'的CPU品牌列)。由于设置了remainder='passthrough',这些未处理的字符串列会直接传递给后续的线性回归模型,而线性回归只能处理数值型数据,因此触发ValueError。

解决方案

需要确保所有字符串类型的特征列都被编码为数值型,以下是两种可靠实现方式:

方式1:手动指定所有字符串列的索引

  1. 先查看所有特征列的数据类型,找出所有object类型(字符串)的列:
print(X_train.dtypes)
  1. 将所有字符串列的索引加入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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.25 03:33:21