线性回归训练报错:dtype='numeric'与字节/字符串数组不兼容
问题解决方法
错误根源
报错核心原因有三个:
- 手动将特征数组强制转为字符串类型(
dtype=np.str),线性回归模型仅接受数值型输入,字符串无法被解析。 - 数据中存在
NaN缺失值,线性回归模型无法直接处理含缺失值的数据集。 - 目标变量
Purchased是分类类型(Yes/No),用线性回归模型适配性差,应改用逻辑回归处理分类任务。
分步解决方案
1. 移除错误的字符串转换
ColumnTransformer处理后的输出本身就是数值型矩阵,无需转成字符串,删除dtype=np.str相关代码:
from sklearn.compose import ColumnTransformer from sklearn.preprocessing import OneHotEncoder import numpy as np import pandas as pd # 加载数据集(假设已用pandas读取,示例中直接构造数据) data = { 'Country': ['France', 'Spain', 'Germany', 'Spain', 'Germany', 'France', 'Spain', 'France', 'Germany', 'France'], 'Age': [44.0, 27.0, 30.0, 38.0, 40.0, 35.0, np.nan, 48.0, 50.0, 37.0], 'Salary': [72000.0, 48000.0, 54000.0, 61000.0, np.nan, 58000.0, 52000.0, 79000.0, 83000.0, 67000.0], 'Purchased': ['No', 'Yes', 'No', 'No', 'Yes', 'Yes', 'No', 'Yes', 'No', 'Yes'] } df = pd.DataFrame(data) X = df.iloc[:, :-1].values y = df.iloc[:, -1].values # 独热编码处理Country列,保留其余列 ct = ColumnTransformer(transformers=[('encoder', OneHotEncoder(), [0])], remainder='passthrough') X = ct.fit_transform(X) # 此处无需转字符串
2. 处理缺失值
用均值填充数值型缺失值,适配线性/逻辑回归模型要求:
from sklearn.impute import SimpleImputer # 用均值填充Age、Salary列的NaN imputer = SimpleImputer(missing_values=np.nan, strategy='mean') # 独热编码后前3列是国家编码,后2列是Age和Salary,处理索引3及之后的列 X[:, 3:] = imputer.fit_transform(X[:, 3:])
3. 替换模型为逻辑回归(适配分类任务)
因为目标变量是分类类型,替换线性回归为逻辑回归:
from sklearn.model_selection import train_test_split from sklearn.linear_model import LogisticRegression # 划分训练集和测试集 X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=1) # 初始化逻辑回归模型 regressor = LogisticRegression() regressor.fit(X_train, y_train)
4. (可选)目标变量编码
若模型训练仍报错,将Yes/No转为数值型:
from sklearn.preprocessing import LabelEncoder le = LabelEncoder() y = le.fit_transform(y) # No→0,Yes→1
完整可运行代码
import numpy as np import pandas as pd from sklearn.compose import ColumnTransformer from sklearn.preprocessing import OneHotEncoder, LabelEncoder from sklearn.impute import SimpleImputer from sklearn.model_selection import train_test_split from sklearn.linear_model import LogisticRegression # 构造数据集 data = { 'Country': ['France', 'Spain', 'Germany', 'Spain', 'Germany', 'France', 'Spain', 'France', 'Germany', 'France'], 'Age': [44.0, 27.0, 30.0, 38.0, 40.0, 35.0, np.nan, 48.0, 50.0, 37.0], 'Salary': [72000.0, 48000.0, 54000.0, 61000.0, np.nan, 58000.0, 52000.0, 79000.0, 83000.0, 67000.0], 'Purchased': ['No', 'Yes', 'No', 'No', 'Yes', 'Yes', 'No', 'Yes', 'No', 'Yes'] } df = pd.DataFrame(data) # 拆分特征与目标变量 X = df.iloc[:, :-1].values y = df.iloc[:, -1].values # 独热编码 ct = ColumnTransformer(transformers=[('encoder', OneHotEncoder(), [0])], remainder='passthrough') X = ct.fit_transform(X) # 填充缺失值 imputer = SimpleImputer(missing_values=np.nan, strategy='mean') X[:, 3:] = imputer.fit_transform(X[:, 3:]) # 编码目标变量 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=1) # 训练模型 regressor = LogisticRegression() regressor.fit(X_train, y_train) # 查看预测结果 y_pred = regressor.predict(X_test) print(np.concatenate((y_pred.reshape(len(y_pred),1), y_test.reshape(len(y_test),1)),1))
内容的提问来源于stack exchange,提问作者Yajulu
相关产品推荐
相关产品推荐

