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

线性回归模型训练因变量传递异常:ValueError('could not convert string to float: yes')问题排查

问题分析与解决方案

首先明确:你遇到的报错不是来自Y_train,而是你的X矩阵中仍然存在未处理的字符串值,导致scikit-learn无法将其转换为浮点数用于模型训练。下面一步步拆解问题并给出修正方案:

问题1:X的列选择错误,混入了因变量列

你提到自变量是0-31列,因变量是32列,但你的代码中:

X = data.iloc[:, 1:33].values
Y = data.iloc[:, 32].values

data.iloc[:,1:33]会选取第1列到第32列(iloc是左闭右开区间),这意味着你把因变量列(32列)也包含进X里了,完全不符合你的建模逻辑。

问题2:X的第0列未被处理(缺失值填充+编码)

看你的缺失值处理代码:

imputer.fit(X[:, 1:33])
X[:, 1:33] = imputer.transform(X[:, 1:33])

这里X[:,1:33]是选取X的第1列到最后一列(因为X只有32列,索引0-31,所以1:33等价于1:32),也就是说X的第0列完全没做缺失值填充。

再看独热编码的代码:

ct = ColumnTransformer(transformers=[('encoder', OneHotEncoder(), [1, 2, ..., 31])], remainder='passthrough')

你只对X的第1到31列做独热编码,但第0列还是原始的字符串类型,没有被编码。这就是报错的根源——X中存在未转换的字符串,当模型尝试训练时,无法将这些字符串转为浮点数,所以抛出ValueError: could not convert string to float: 'yes'。

问题3:模型选择错误

你用LinearRegression处理二分类任务(YES/NO)是不合适的:线性回归用于回归任务(预测连续值),而你的任务是分类,应该用逻辑回归(LogisticRegression)。


完整修正方案

以下是修正后的代码,同时优化了冗余步骤:

import numpy as np
from sklearn.impute import SimpleImputer
from sklearn.compose import ColumnTransformer
from sklearn.preprocessing import OneHotEncoder, LabelEncoder
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LogisticRegression

# 加载数据
data = psyco.read_into_pandas()

# 正确选择自变量和因变量:0-31列是自变量,32列是因变量
X = data.iloc[:, 0:32].values
Y = data.iloc[:, 32].values

# 缺失值填充:对所有自变量列处理(因为都是字符串类型,用众数填充)
imputer = SimpleImputer(missing_values=np.nan, strategy='most_frequent', add_indicator=True)
X = imputer.fit_transform(X)

# 独热编码:对所有自变量列做编码(无需手动列索引,直接取所有列)
ct = ColumnTransformer(
    transformers=[('encoder', OneHotEncoder(sparse_output=False), range(X.shape[1]))],
    remainder='passthrough'
)
X = np.array(ct.fit_transform(X))

# 标签编码因变量(YES/NO转0/1)
le = LabelEncoder()
Y = le.fit_transform(Y)

# 划分训练集和测试集
X_train, X_test, Y_train, Y_test = train_test_split(X, Y, test_size=0.2, random_state=0)

# 使用逻辑回归训练(替换LinearRegression,增大max_iter避免高维特征下收敛问题)
lr = LogisticRegression(max_iter=1000)
lr.fit(X_train, Y_train)

额外说明

  • 为什么打印Y_train是整数却报错?因为错误提示里的'yes'来自X,不是Y。scikit-learn的报错信息中的字符串是来自无法转换的特征列,而非目标变量列。
  • 独热编码时添加sparse_output=False是为了输出密集数组,避免后续可能的兼容性问题。
  • 逻辑回归设置max_iter=1000是因为独热编码后特征维度可能很高,默认迭代次数可能不够导致不收敛。

内容的提问来源于stack exchange,提问作者Metadata

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.28 22:19:08