解决sklearn GridSearchCV训练时报TypeError: must be real number, not str问题
报错根因
错误出在SVC模型训练阶段,底层libsvm库检测到输入特征/标签中存在字符串类型数据,无法进行数值计算。你仅对训练集做了数值类型转换,测试集未同步转换,且数据读取阶段大概率存在隐藏的字符串类型特征列,同时代码本身存在两处语法类错误也会导致后续运行失败。
解决步骤
- 第一步:先排查特征数据集的类型,在
Grid1.fit(x, y)之前插入以下代码,确认是否存在字符串列:
# 打印所有列的类型,以及是否存在字符串值 print(x.dtypes) print(x.applymap(type).eq(str).any())
如果存在object类型列,先做数值转换,空值先填充或者删除:
# 所有特征强制转数值,无法转换的设为空值后删除 x = x.apply(pd.to_numeric, errors='coerce').dropna() y = y[x.index] # 同步过滤标签
- 第二步:统一处理所有输入数据的类型,函数调用时给测试集也做类型转换:
result_using_non_tree_classifier(x_train.astype(int), x_test.astype(int), y_train.astype(int), y_test.astype(int))
- 第三步:修正参数字典的键名不统一问题,把
GaussianNB对应的参数键从params改为param,避免后续遍历到该模型时抛出KeyError:
'GaussianNB' : {'model': GaussianNB(), 'param':{} }
- 第四步:修正结果字典的键名错误,把
best_parameter改为best_params,和返回DataFrame的列名对应,避免返回空值:
scores.append({ 'model' : algo_name, 'best_score': Grid1.best_score_ , 'best_params': Grid1.best_params_ })
内容的提问来源于stack exchange,提问作者Aman Kothari
相关产品推荐
相关产品推荐

