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

使用UCI心脏病数据集结合前向特征选择与KNN时遇InvalidIndexError

InvalidIndexError 错误原因及解决办法

这个错误本质是数据索引方式不匹配,大概率是你在处理Pandas DataFrame和Numpy数组时混用了索引规则,或者特征选择过程中数据维度出了问题。下面是几种常见场景和修复方案:

1. 误用DataFrame的索引方式

如果你的特征矩阵X是Pandas DataFrame,直接用Numpy的[:, [0]]切片会触发错误——DataFrame不支持这种二维数组式的索引。

  • 错误写法:
    X_selected = X[:, [0]]  # DataFrame不接受这种索引
    
  • 正确写法:
    • 按列位置索引:用iloc
      X_selected = X.iloc[:, [0]]  # 选择第0列,返回二维DataFrame
      
    • 按列名索引:直接传入列名字符串列表
      X_selected = X[['age']]  # 假设第0列是age
      

2. 特征选择后数据维度不匹配

当你只选择了一个特征时,数据可能变成一维数组(形状为(n_samples,)),但KNN的fit和predict方法要求输入是二维数组(形状为(n_samples, n_features))。

  • 错误场景:
    selected_features = [0]
    X_train_subset = X_train.iloc[:, selected_features].values.ravel()  # 转成了一维数组
    knn.fit(X_train_subset, y_train)  # 报错
    
  • 修复方案:用reshape转成二维
    X_train_subset = X_train.iloc[:, selected_features].values.reshape(-1, 1)
    knn.fit(X_train_subset, y_train)
    

3. 特征列表维护错误

前向选择过程中,如果不小心把特征索引写成了嵌套列表(比如[[0]]而非[0]),索引时会触发维度错误。

  • 错误写法:
    selected_features = []
    selected_features.append([0])  # 变成了嵌套列表[[0]]
    X_selected = X_train.iloc[:, selected_features]  # 索引错误
    
  • 正确写法:
    selected_features.append(0)  # 保持一维列表[0]
    

修正后的代码片段示例

import pandas as pd
from sklearn.neighbors import KNeighborsClassifier
from sklearn.model_selection import train_test_split

# 加载UCI心脏病数据集
data = pd.read_csv('heart.csv')
X = data.drop('target', axis=1)
y = data['target']
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

# 前向特征选择流程
selected_features = []
best_acc = 0

# 遍历所有特征,逐一尝试添加
for col in X_train.columns:
    temp_features = selected_features + [col]
    # 提取特征子集(始终保持二维)
    X_train_temp = X_train[temp_features]
    X_test_temp = X_test[temp_features]
    
    # 训练KNN并评估
    knn = KNeighborsClassifier(n_neighbors=5)
    knn.fit(X_train_temp, y_train)
    current_acc = knn.score(X_test_temp, y_test)
    
    # 更新最优特征集合
    if current_acc > best_acc:
        best_acc = current_acc
        selected_features = temp_features

# 最终模型训练与预测
final_knn = KNeighborsClassifier(n_neighbors=5)
final_knn.fit(X_train[selected_features], y_train)
y_pred = final_knn.predict(X_test[selected_features])

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.10 02:32:44