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

Google Colab泰坦尼克号ML项目报错:无法将字节/字符串转数值类型

解决ValueError: Unable to convert array of bytes/strings into decimal numbers with dtype='numeric'错误

错误原因

GaussianNB(高斯朴素贝叶斯)模型仅支持数值型输入特征,你的训练集特征label_train中存在字符串/字节类型的列,模型无法自动将这类非数值数据转换为可计算的数值,因此触发该错误。

解决步骤

1. 定位非数值列

先检查哪些特征是字符串类型:

print(label_train.dtypes)

输出结果中,dtype为object的列就是需要处理的非数值列。

2. 转换非数值特征

根据特征类型选择合适的编码方式:

方式一:独热编码(适合无序类别特征,如性别、舱位等级)

用pandas.get_dummies自动处理所有类别型特征:

# 替换原特征集为编码后的版本
label_train = pd.get_dummies(label_train)

# 后续训练代码保持不变
x_train, x_test, y_train, y_test = train_test_split(label_train, feature_train, test_size=0.2)
clf.fit(x_train, np.ravel(y_train))
方式二:标签编码(适合有序类别特征,如学历等级、会员等级)

用sklearn.preprocessing.LabelEncoder对每一列字符串特征编码:

from sklearn.preprocessing import LabelEncoder

le = LabelEncoder()
for col in label_train.columns:
    if label_train[col].dtype == 'object':
        # 注意:若列存在空字符串,先转为NaN再处理
        label_train[col] = label_train[col].replace('', np.nan)
        label_train[col] = le.fit_transform(label_train[col].astype(str))

3. 额外检查:处理隐性缺失值

部分数据中可能存在空字符串(而非NaN),这类值也会被识别为字符串类型,需要先转换为NaN再处理:

# 将所有空字符串替换为NaN
label_train = label_train.replace('', np.nan)
# 再删除含缺失值的行(或用fillna填充)
label_train = label_train.dropna()

修正后的完整代码示例

import pandas as pd
import numpy as np
from sklearn.naive_bayes import GaussianNB
from sklearn.model_selection import train_test_split, cross_val_score, cross_val_predict
from sklearn.metrics import confusion_matrix
import seaborn as sns
import matplotlib.pyplot as plt

# Data to be predicted
X_to_be_predicted = my_df[my_df.Survived.isnull()]
X_to_be_predicted = X_to_be_predicted.drop(['Survived'], axis = 1)
# X_to_be_predicted[X_to_be_predicted.Age.isnull()]
# X_to_be_predicted.dropna(inplace = True) # 417 x 27

#Training data
train_data = my_df
train_data = train_data.dropna()
feature_train = train_data['Survived']
label_train = train_data.drop(['Survived'], axis = 1)

# --- 新增特征编码步骤 ---
# 用独热编码处理类别特征
label_train = pd.get_dummies(label_train)

##Gaussian
clf = GaussianNB()
x_train, x_test, y_train, y_test = train_test_split(label_train, feature_train, test_size=0.2)
clf.fit(x_train, np.ravel(y_train))
print("NB Accuracy: " + repr(round(clf.score(x_test, y_test) * 100, 2)) + "%")
result_rf = cross_val_score(clf, x_train, y_train, cv=10, scoring = 'accuracy')
print('The cross validated score for GaussianNB is:', round(result_rf.mean()*100,2))
y_pred = cross_val_predict(clf,x_train, y_train, cv=10)
sns.heatmap(confusion_matrix(y_train, y_pred), annot=True, fmt = '3.0f', cmap = "summer")
plt.title('Confusion_matrix for NB', y=1.05, size=15)
plt.show()

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 11:05:18