使用KNN预测多分类标签遇低准确率及混淆矩阵报错求助
问题分析与解决
一、混淆矩阵报错的直接原因
代码里变量名大小写不匹配:
Matrix = confusion_matrix(y_test, y_pred) print(matrix) # 此处用了小写的matrix,但定义的变量是大写的Matrix
Python是大小写敏感语言,把print(matrix)改成print(Matrix)即可解决该报错。
二、模型准确率仅13%的核心问题
多个逻辑错误叠加导致模型完全失效,具体问题如下:
1. 标签处理逻辑错误:多分类标签无需One-Hot编码
KNeighborsClassifier处理多分类任务时,不需要对标签做One-Hot编码,它期望的标签是一维类别数组(比如原始的very expensive/expensive字符串,或用LabelEncoder转成的整数)。你用pd.get_dummies把标签转成4列二维矩阵后,模型会错误地将其识别为多标签分类任务(即每个样本可同时属于多个类别),而非你需要的单标签多分类任务,这直接导致训练逻辑完全偏离预期。
2. 特征缩放逻辑错误:测试集不能重新拟合Scaler
特征缩放时,测试集必须复用训练集拟合好的Scaler做转换,不能对测试集调用fit_transform(这会用测试集自身的min/max值缩放,属于数据泄露,破坏训练与测试的独立性)。正确写法:
scaler = preprocessing.MinMaxScaler() X_train_scaled = scaler.fit_transform(X_train) # 仅在训练集上执行fit X_test_scaled = scaler.transform(X_test) # 测试集直接用训练集的Scaler做转换
3. 训练测试集拆分的变量名错误
你在步骤2中拆分时,将未缩放的特征变量命名为X_train_scaled和X_test_scaled,后续步骤3里的X_train和X_test根本未定义,实际运行会抛出NameError。正确拆分应先得到未缩放的训练测试集:
X_train, X_test, y_train, y_test = train_test_split(X, Y, test_size=0.30)
三、修正后的完整代码示例
# 1. 直接使用原始标签,无需One-Hot编码 Y = df['costrange'] # 2. 拆分训练测试集(先得到未缩放的特征) X_train, X_test, y_train, y_test = train_test_split(X, Y, test_size=0.30, random_state=42) # 加random_state保证结果可复现 # 3. 特征缩放:训练集fit,测试集复用Scaler scaler = preprocessing.MinMaxScaler() X_train_scaled = scaler.fit_transform(X_train) X_test_scaled = scaler.transform(X_test) # 4. 训练KNN模型 knn = KNeighborsClassifier(n_neighbors=4, weights='uniform') knn.fit(X_train_scaled, y_train) y_pred = knn.predict(X_test_scaled) # 5. 模型评估 print(metrics.accuracy_score(y_test, y_pred)) print(knn.score(X_test_scaled, y_test)) # 混淆矩阵(变量名大小写保持一致) confusion_matrix_result = confusion_matrix(y_test, y_pred) print(confusion_matrix_result)
额外优化建议
- 多分类任务除了准确率,可通过
metrics.classification_report(y_test, y_pred)查看每个类别的精确率、召回率,更全面评估模型性能。 - KNN的
n_neighbors参数可通过交叉验证(如GridSearchCV)筛选最优值,进一步提升模型效果。
内容的提问来源于stack exchange,提问作者Jason
相关产品推荐
相关产品推荐

