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

绘制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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.30 00:23:29