使用HistGradientBoostingClassifier时出现“could not convert string to float”报错的问题求助
使用HistGradientBoostingClassifier时出现“could not convert string to float”报错的问题求助
看起来你遇到的问题其实是Scikit-learn版本或者参数格式不匹配导致的,我来帮你拆解一下原因和解决办法:
问题核心原因
主要有两个关键问题触发了这个报错:
- 旧版本Scikit-learn不支持列名作为
categorical_features参数:在Scikit-learn 1.2之前,HistGradientBoostingClassifier的categorical_features只接受特征的索引位置(整数列表),不支持直接传入列名字符串。如果你传入列名,模型根本不会识别这些是分类特征,依然会尝试把整个DataFrame转成数值型numpy数组,字符串类型的分类列自然就会触发“无法转成float”的错误。 - DataFrame转numpy数组的隐式转换限制:即使你把列转成了
category类型,Scikit-learn旧版本内部的check_array步骤在处理DataFrame时,还是会把category列的原始字符串值暴露出来,而不是自动编码为数值,这也会导致转换失败。
具体解决办法
办法1:使用特征索引代替列名(兼容所有旧版本)
把categorical_features改成对应特征的索引位置。在你的示例中,person_gender是第二列(索引从0开始,所以索引为1):
clf_hgb = HistGradientBoostingClassifier(categorical_features=[1]) clf_hgb.fit(X_train, y_train)
办法2:升级Scikit-learn到1.2及以上版本
从Scikit-learn 1.2版本开始,categorical_features参数正式支持直接传入列名字符串(当输入是pandas DataFrame时),模型会自动识别并处理分类特征,不需要手动编码。升级后你的原始代码就能正常运行。
额外验证步骤
虽然你已经把列转成了category类型,但可以再确认一下类型是否正确:
print(X_train['person_gender'].dtype) # 正常输出应为 'category'
修改后的完整测试代码
import pandas as pd import numpy as np from sklearn.ensemble import HistGradientBoostingClassifier X_train = pd.DataFrame({'person_age': {24716: 33.0, 37121: 28.0, 34325: 24.0, 7068: 24.0, 11680: 23.0, 17900: 34.0, 16108: 22.0, 26879: 27.0, 37408: 23.0, 10782: 26.0, 40871: 26.0, 16929: 23.0, 21868: 28.0, 34622: 31.0, 14948: 24.0, 22929: 33.0, 15295: 26.0, 16620: 23.0, 42191: 24.0, 13442: 26.0}, 'person_gender': {24716: 'female', 37121: 'male', 34325: 'male', 7068: 'female', 11680: 'male', 17900: 'female', 16108: 'male', 26879: 'female', 37408: 'male', 10782: 'male', 40871: 'male', 16929: 'male', 21868: 'male', 34622: 'male', 14948: 'male', 22929: 'female', 15295: 'female', 16620: 'female', 42191: 'male', 13442: 'female'}}) y_train = np.array([0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0]) X_train['person_gender']=X_train['person_gender'].astype('category') # 兼容旧版本的写法:使用特征索引 clf_hgb = HistGradientBoostingClassifier(categorical_features=[1]) clf_hgb.fit(X_train, y_train) print("模型训练成功!") # 若Scikit-learn版本≥1.2,可直接用列名 # clf_hgb = HistGradientBoostingClassifier(categorical_features=['person_gender']) # clf_hgb.fit(X_train, y_train)
备注:内容来源于stack exchange,提问作者user28824349
相关产品推荐
相关产品推荐

