使用scikit-learn独热编码后训练SVC模型遇序列赋值错误求助
问题分析与解决方案
错误根源
你遇到的TypeError和ValueError,核心原因是错误地将csr_matrix直接转换为pd.DataFrame。当执行pd.DataFrame(transformed_X)时,Pandas会把稀疏矩阵的每一行当作一个csr_matrix对象存入DataFrame的单元格,而非展开为数值型特征列。后续训练模型时,SVC无法识别这种包含矩阵对象的输入,因此抛出错误。
解决方案
方案1:直接使用稀疏矩阵训练模型(推荐)
scikit-learn的所有模型原生支持稀疏矩阵输入,完全不需要转换为DataFrame,步骤如下:
from sklearn.preprocessing import OneHotEncoder from sklearn.compose import ColumnTransformer from sklearn.model_selection import train_test_split from sklearn import svm # 特征转换 categorical_features = ["Name", "Sex", "Ticket", "Cabin", "Embarked"] encoder = OneHotEncoder(sparse_output=True) # 默认就是sparse_output=True,可省略 transformer = ColumnTransformer( [("one_hot", encoder, categorical_features)], remainder="passthrough" ) transformed_X = transformer.fit_transform(X) # 直接拆分稀疏矩阵 X_train, X_test, y_train, y_test = train_test_split(transformed_X, y, test_size=0.2) # 训练模型 clf = svm.SVC() clf.fit(X_train, y_train)
方案2:正确将稀疏矩阵转为DataFrame(仅小数据集适用)
如果一定要转为DataFrame,需要先将稀疏矩阵转为密集数组,但注意高基数特征(如Name、Ticket)OneHot编码后维度会极高,可能导致内存溢出:
# 稀疏矩阵转密集数组,再转DataFrame transformed_X = pd.DataFrame(transformed_X.toarray()) # 后续拆分、训练步骤不变 X_train, X_test, y_train, y_test = train_test_split(transformed_X, y, test_size=0.2) clf = svm.SVC() clf.fit(X_train, y_train)
额外优化建议
你当前选择的Name、Ticket、Cabin属于高基数特征,直接OneHot编码会引发维度灾难:
Name:每个乘客的名字几乎唯一,编码后会生成数千个无意义特征;Ticket:票号重复率低,同样会生成大量冗余特征;Cabin:缺失值占比极高,且基数较大。
建议做特征工程优化:
- 从
Name中提取头衔(如Mr、Mrs、Miss),用这个作为分类特征; - 从
Ticket中提取前缀(如A/5),或直接丢弃该特征; Cabin可提取首字母,或直接丢弃;- 优先保留
Sex、Embarked这类低基数、有区分度的特征。
内容的提问来源于stack exchange,提问作者Yusuf Saad
相关产品推荐
相关产品推荐

