追加数据至DataFrame后重训模型报错:如何转为float类型?
解决方案:处理拼接后数据集的类型与特征名问题
1. 统一特征名为字符串
先解决特征名混合整数与字符串的警告,将所有数据集的列名转为字符串:
# 处理X的列名 X_train_init_new.columns = X_train_init_new.columns.astype(str) X_test_init.columns = X_test_init.columns.astype(str) X_pool.columns = X_pool.columns.astype(str) # 处理y的列名(若y为DataFrame类型) y_train_init_new.columns = y_train_init_new.columns.astype(str) y_test_init.columns = y_test_init.columns.astype(str)
2. 将数据集转换为float类型
使用pd.to_numeric批量转换数据类型,同时处理无法转换为数值的异常值(转为NaN后按需填充或删除):
# 转换X的所有列到float X_train_init_new = X_train_init_new.apply(pd.to_numeric, errors='coerce') X_test_init = X_test_init.apply(pd.to_numeric, errors='coerce') X_pool = X_pool.apply(pd.to_numeric, errors='coerce') # 转换y的所有列到float(多标签分类需确保标签为数值类型) y_train_init_new = y_train_init_new.apply(pd.to_numeric, errors='coerce') y_test_init = y_test_init.apply(pd.to_numeric, errors='coerce') # 处理转换产生的NaN值(示例:用列均值填充特征,标签填充0) X_train_init_new = X_train_init_new.fillna(X_train_init_new.mean()) X_test_init = X_test_init.fillna(X_test_init.mean()) X_pool = X_pool.fillna(X_pool.mean()) y_train_init_new = y_train_init_new.fillna(0) y_test_init = y_test_init.fillna(0)
3. 修改后的完整调用流程
确保在调用模型前完成上述处理:
# 拼接数据 y_train_init_new = pd.concat([y_train_init, X_pool_labeled.iloc[:, -7:]]) X_train_init_new = pd.concat([X_train_init, X_pool_labeled.iloc[:, 0:27446]]) # 处理列名和数据类型 X_train_init_new.columns = X_train_init_new.columns.astype(str) X_train_init_new = X_train_init_new.apply(pd.to_numeric, errors='coerce').fillna(X_train_init_new.mean()) y_train_init_new.columns = y_train_init_new.columns.astype(str) y_train_init_new = y_train_init_new.apply(pd.to_numeric, errors='coerce').fillna(0) X_test_init.columns = X_test_init.columns.astype(str) X_test_init = X_test_init.apply(pd.to_numeric, errors='coerce').fillna(X_test_init.mean()) y_test_init.columns = y_test_init.columns.astype(str) y_test_init = y_test_init.apply(pd.to_numeric, errors='coerce').fillna(0) X_pool.columns = X_pool.columns.astype(str) X_pool = X_pool.apply(pd.to_numeric, errors='coerce').fillna(X_pool.mean()) # 调用模型 model1_pool_preds = model1(LinearSVC(class_weight='balanced', random_state=42), OneVsRestClassifier, X_train_init_new, y_train_init_new, X_test_init, y_test_init, X_pool)
额外说明
errors='coerce'会把无法转换为数值的字符串转为NaN,必须后续处理NaN值,否则模型训练会报错。- 标签列的NaN处理需根据业务场景调整,比如多标签分类中,NaN可视为"无该标签"并填充0。
内容的提问来源于stack exchange,提问作者ForeverLearner
相关产品推荐
相关产品推荐

