线性回归模型训练因变量传递异常: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
相关产品推荐
相关产品推荐

