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
相关产品推荐
相关产品推荐

