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

基于流失数据集构建KMeans聚类模型绘图时报x与y尺寸不匹配报错

问题场景

基于客户流失数据集搭建KMeans聚类模型,生成聚类结果可视化时触发ValueError: x and y must be the same size报错,初步怀疑问题出在聚类中心坐标提取代码段,对应可疑代码:

x=kmeans.cluster_centers_[:,0]
                , y=kmeans.cluster_centers_[:,1]
核心报错原因定位
  • 你一开始怀疑的聚类中心坐标提取代码本身没有问题:二维训练输入下,kmeans.cluster_centers_的形状固定为(n_clusters, 2),两个维度切片结果长度完全一致,不会触发同大小校验报错
  • 列名拼写不匹配:调用绘图函数时传入的y_title='MonthlyCharges',代码内部按规则拼接列名得到MonthlyCharges_norm,但实际传入拟合的数据集里对应列是MonthlyCharge_norm(无末尾s)。第一次散点图调用plt.scatter时,因找不到对应y轴列,会把传入的字符串直接作为单一y值,长度远短于x轴对应列的样本数,直接触发维度不匹配报错
  • 重复冗余调用拟合逻辑:函数内先执行kmeans.fit(data)完成聚类计算,后续return语句中又通过fit_predict对同一模型重新执行全流程拟合,冗余且易导致模型参数前后不一致
  • 索引赋值逻辑错误:代码使用iloc配合布尔掩码给Cluster列赋值,iloc仅支持整数位置索引,不支持布尔条件匹配,会导致赋值错位、长度不匹配问题
修正后可运行代码
def Create_kmeans_cluster_graph(df_final, data, n_clusters, x_col_name, y_col_name, chart_title, random_state=42):
    """ Display K-means cluster based on data """
    # 初始化并一次性完成拟合,避免重复计算
    kmeans = KMeans(n_clusters=n_clusters, random_state=random_state)
    kmeans.fit(data)
    kmean_colors = [plotColor[c] for c in kmeans.labels_]

    fig = plt.figure(figsize=(12,8))
    # 直接从传入的数据集提取x/y轴数组,避免列名拼接错误
    plt.scatter(
        x=data[x_col_name],
        y=data[y_col_name],
        color=kmean_colors,
        alpha=0.25
    )

    plt.xlabel(x_col_name.replace('_norm', ''))
    plt.ylabel(y_col_name.replace('_norm', ''))

    # 直接提取已拟合完成的聚类中心坐标
    plt.scatter(
        x=kmeans.cluster_centers_[:,0],
        y=kmeans.cluster_centers_[:,1],
        color='black',
        marker='X',
        s=100
    )
    
    plt.title(chart_title, fontsize=15)
    plt.show()
    
    # 直接对已拟合模型执行预测,不再重复fit
    return kmeans.predict(data)


# 初始化聚类列
df_final['Cluster'] = -1 
# 使用loc完成布尔条件赋值,替换错误的iloc用法
df_final.loc[
    df_final.Churn == 1,
    'Cluster'
] = Create_kmeans_cluster_graph(
    df_final,
    df_final[df_final.Churn==1][['Tenure_norm','MonthlyCharge_norm']],
    n_clusters=3,
    x_col_name='Tenure_norm',
    y_col_name='MonthlyCharge_norm',
    chart_title="Tenure vs Monthlycharges : Churn customer cluster"
)

df_final['Cluster'].unique()

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.28 12:15:04