高维多类别数据集散点图绘制维度不匹配报错解决咨询
问题原因与解决方法
错误根源
plt.scatter() 要求前两个输入参数是长度相同的一维数组(分别对应散点图的x轴和y轴特征),但你传入的x是包含20个特征的二维数组(形状(100000, 20)),和一维的目标变量y(形状(100000,))维度不匹配,因此触发错误。
解决方案
根据你展示所有特征多类别分布的需求,提供三种实用方案:
方案1:绘制所有特征两两组合的散点图(适合特征数不多的情况)
用Seaborn的pairplot可以自动生成所有特征对的散点图,并按类别着色:
import seaborn as sns import matplotlib.pyplot as plt # 将特征与目标合并为一个DataFrame plot_df = train_df.copy() # 生成两两特征散点图,hue指定按目标类别着色 sns.pairplot(plot_df, hue='y', palette='tab10', plot_kws={'s': 10}) plt.show()
hue='y':按目标列的类别区分颜色plot_kws={'s':10}:设置散点大小,避免点过于密集
方案2:高维特征降维后绘制二维散点图(适合特征数较多的情况)
当特征数较多时,直接画两两组合图会过于繁琐,可以用PCA或t-SNE将20维特征压缩到二维,再绘制类别分布:
示例(PCA降维):
from sklearn.decomposition import PCA import matplotlib.pyplot as plt x = train_df.drop(['y'], axis=1) y = train_df['y'] # 将20维特征降为2维 pca = PCA(n_components=2) x_2d = pca.fit_transform(x) # 按类别分别绘制散点 unique_classes = y.unique() # 为5个类别分配不同颜色 color_list = ['red', 'green', 'blue', 'cyan', 'magenta'] for cls, color in zip(unique_classes, color_list): # 筛选当前类别的样本 class_mask = (y == cls) plt.scatter(x_2d[class_mask, 0], x_2d[class_mask, 1], s=10, label=f'类别 {cls}', color=color) plt.legend() plt.xlabel('PCA 第一主成分') plt.ylabel('PCA 第二主成分') plt.title('特征PCA降维后的类别分布') plt.show()
如果想更简洁,也可以直接用c=y让matplotlib自动映射颜色:
plt.scatter(x_2d[:, 0], x_2d[:, 1], c=y, s=10, cmap='tab10') plt.colorbar(ticks=y.unique(), label='类别') plt.xlabel('PCA 第一主成分') plt.ylabel('PCA 第二主成分') plt.show()
方案3:单独绘制某两个特征的散点图
如果你只想查看特定两个特征的类别分布,直接指定特征列即可:
plt.scatter(x.iloc[:, 0], x.iloc[:, 1], c=y, s=10, cmap='tab10') plt.xlabel('特征1') plt.ylabel('特征2') plt.colorbar(ticks=y.unique(), label='类别') plt.show()
内容的提问来源于stack exchange,提问作者Hana S
相关产品推荐
相关产品推荐

