绘制TSNE图时遇TypeError:必须是实数而非字符串,求解决
解决TSNE绘图时的TypeError: must be real number, not str错误
错误根源
TSNE的fit_transform方法要求输入的特征数据必须是纯数值类型(int/float),你的报错说明:要么特征矩阵X里包含字符串类型的列,要么标签列y存的是字符串格式的"0"/"1",而非数值型的0/1。
分步解决
1. 检查并转换特征矩阵X的类型
先查看数据列的类型,定位字符串列:
print(df_new.dtypes)
找到类型为object的列,按情况转换:
- 分类字符串列(比如"男"/"女"这类离散值):用标签编码转成数值
from sklearn.preprocessing import LabelEncoder le = LabelEncoder() # 遍历所有object类型的列,逐一编码 for col in X.columns[X.dtypes == 'object']: X[col] = le.fit_transform(X[col])
- 文本类字符串(无法用标签编码):需要先做文本特征提取(比如TF-IDF),再传入TSNE
2. 确保标签y是数值类型
检查y的类型和样本值,若为字符串则转换为整数:
# 先查看y的类型和取值 print(y.dtypes) print(y.unique()) # 转换为数值型 y = pd.to_numeric(y, errors='coerce') # 如果确定只有"0"/"1",也可以直接转int y = y.astype(int)
3. 优化代码中的索引逻辑(可选,更简洁不易错)
原代码用np.where的写法可以简化为布尔索引,避免维度问题:
def tsne_plot(x, y): sns.set(style="whitegrid") tsne = TSNE(n_components=2, random_state=0) X_transformed = tsne.fit_transform(x) plt.figure(figsize=(12, 8)) # 用布尔索引直接筛选样本 plt.scatter(X_transformed[y == 0, 0], X_transformed[y == 0, 1], marker='o', color='y', linewidth=1, alpha=0.8, label='Normal') plt.scatter(X_transformed[y == 1, 0], X_transformed[y == 1, 1], marker='o', color='k', linewidth=1, alpha=0.8, label='Abnormal') plt.legend(loc='best') plt.show()
内容的提问来源于stack exchange,提问作者Kudjoe Erik
相关产品推荐
相关产品推荐

