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

线性回归训练报错:dtype='numeric'与字节/字符串数组不兼容

问题解决方法

错误根源

报错核心原因有三个:

  1. 手动将特征数组强制转为字符串类型(dtype=np.str),线性回归模型仅接受数值型输入,字符串无法被解析。
  2. 数据中存在NaN缺失值,线性回归模型无法直接处理含缺失值的数据集。
  3. 目标变量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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.25 13:35:12