在KNN算法中拟合多输入列时出现ValueError问题求助
KNN拟合报错:ValueError: setting an array element with a sequence
问题背景
输入包含两列:第一列为二元数据(0或1),第二列为100维特征向量;目标列经OneHot编码后得到15列。将数据输入KNN模型拟合时,触发如下错误:
ValueError: setting an array element with a sequence.
相关代码片段
X_level1 = np.asarray(dfCopy[['inputColumn1','inputColumn2']]) y_level1 = np.asarray(dfCopy[['OneHotEncodingColumn1','OneHotEncodingColumn2','OneHotEncodingColumn3',...,'OneHotEncodingColumn15']]) X_train1, X_val1, y_train1, y_val1 = train_test_split(X_level1, y_level1, test_size = 0.2, random_state=20)
数据示例
输入数据(X_level1):
array([[array([ 0.41164917, 0.33110523, ..., 0.55093 , 1.0682331 ], dtype=float32), 1], ...], dtype=object)
输出数据(y_level1):
array([[0, 0, 0, ..., 0, 0, 0], ..., [0, 0, 0, ..., 0, 1, 0]], dtype=uint8)
错误原因
当前X_level1是object类型的嵌套数组,每个样本的特征是一个包含「100维数组+二元值」的嵌套结构,而非KNN模型要求的扁平二维数值数组(每一行对应一个样本,每一列对应一个特征维度)。这种嵌套结构会导致模型无法正确解析特征维度,触发序列赋值错误。
解决方案
需要将二元列与100维向量列合并为一个101维的扁平特征矩阵,具体步骤如下:
import numpy as np from sklearn.model_selection import train_test_split from sklearn.neighbors import KNeighborsClassifier # 1. 提取并转换二元特征列:转为(n_samples, 1)的二维数组 col_binary = dfCopy['inputColumn1'].values.reshape(-1, 1) # 2. 展开100维向量列:将每个样本的向量转为一行,得到(n_samples, 100)的二维数组 col_vector = np.vstack(dfCopy['inputColumn2'].values) # 3. 合并特征矩阵:得到(n_samples, 101)的扁平数值数组 X_level1 = np.hstack([col_binary, col_vector]) # 4. 目标列保持原格式即可 y_level1 = dfCopy[['OneHotEncodingColumn1', ..., 'OneHotEncodingColumn15']].values # 5. 拆分数据集并拟合模型 X_train1, X_val1, y_train1, y_val1 = train_test_split(X_level1, y_level1, test_size=0.2, random_state=20) knn = KNeighborsClassifier() knn.fit(X_train1, y_train1)
关键验证
执行完上述步骤后,可通过以下代码确认特征矩阵格式正确:
print(X_level1.shape) # 应输出 (样本数量, 101) print(X_level1.dtype) # 应输出 float32 或 float64 等数值类型
内容的提问来源于stack exchange,提问作者Mayar Alzerki
相关产品推荐
相关产品推荐

