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

使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.25 23:36:21