使用SelectKBest+chi2做分类特征选择时遇字符串转浮点数错误
卡方特征选择报错:字符串无法转浮点数的原因与解决方法
错误原因
sklearn的chi2卡方检验函数不接受原始字符串格式的分类特征——它要求输入的特征矩阵必须是数值型。卡方检验的核心是计算特征与目标变量的频数分布关联,而字符串类型无法直接参与频数统计和后续的卡方值计算,哪怕你明确知道这些是分类特征也不行。
解决方法
需要先把字符串分类特征转换成数值型编码,常用两种方案:
1. 独热编码(适合无序分类特征)
对无顺序的分类特征(比如职业、地区这类无等级区分的),用独热编码生成二进制数值特征,避免引入错误的顺序关系:
from sklearn.feature_selection import chi2, SelectKBest from sklearn.preprocessing import OneHotEncoder from sklearn.compose import ColumnTransformer # 定义转换规则:对所有特征列做独热编码(sparse_output=False输出稠密矩阵) ct = ColumnTransformer( transformers=[('onehot', OneHotEncoder(sparse_output=False, drop='first'), X.columns)], remainder='passthrough' ) X_encoded = ct.fit_transform(X) # 执行特征选择 selector = SelectKBest(score_func=chi2, k=3).fit_transform(X_encoded, y)
2. 标签编码(适合有序分类特征)
如果分类特征存在明确的顺序(比如收入等级:低/中/高),可以用标签编码将字符串映射为连续数值:
from sklearn.feature_selection import chi2, SelectKBest from sklearn.preprocessing import LabelEncoder import pandas as pd # 复制原特征矩阵,避免修改原始数据 X_encoded = X.copy() # 遍历所有特征列,逐个做标签编码 for col in X_encoded.columns: le = LabelEncoder() X_encoded[col] = le.fit_transform(X_encoded[col]) # 执行特征选择 selector = SelectKBest(score_func=chi2, k=3).fit_transform(X_encoded, y)
额外注意
如果目标变量y也是字符串类型,建议同步用LabelEncoder转换为数值:
le_y = LabelEncoder() y_encoded = le_y.fit_transform(y) # 后续拟合时传入y_encoded即可
内容的提问来源于stack exchange,提问作者forest
相关产品推荐
相关产品推荐

