使用RandomForestClassifier补全卒中预测数据集未知吸烟状态失败排查
解决卒中预测数据集中smoking_status未知值替换问题及特征名警告处理
问题核心
你用RandomForestClassifier预测smoking_status列的Unknown值后,原数据集data没有变化,同时收到特征名不匹配的警告。
错误原因
- 未合并修改后的子集:仅修改了
smokestatus_unknown子集,但未将更新后的数据合并回原data数据集,导致原数据完全无变化。 - 特征名不匹配:训练模型时用
.values将DataFrame转为numpy数组(丢失特征名),但预测时传入带列名的DataFrame,引发模型特征识别警告。
解决方案
1. 合并更新后的子集到原数据集
修改完smokestatus_unknown的smoking_status后,将其替换回原data中对应的行。
2. 统一用DataFrame训练/预测,保留特征名
训练模型时直接传入DataFrame(不用.values),确保训练与预测的特征名一致,消除警告。
修正后的完整代码
import matplotlib.pyplot as plt import pandas as pd import numpy as np from sklearn.ensemble import RandomForestClassifier from sklearn.model_selection import train_test_split from sklearn.metrics import accuracy_score from sklearn.preprocessing import OneHotEncoder raw_data = pd.read_csv('/Users/name/Desktop/CompSci_Projects/Stroke_Prediction_Model/dataset/healthcare-dataset-stroke-data.csv') data = raw_data.copy(deep=True) data.interpolate(method='linear', inplace=True) # 类别变量编码 data['gender'] = data['gender'].astype('category') data['ever_married'] = data['ever_married'].astype('category') data['work_type'] = data['work_type'].astype('category') data['Residence_type'] = data['Residence_type'].astype('category') data['Gen_new'] = data['gender'].cat.codes data['evm_new'] = data['ever_married'].cat.codes data['wktp_new'] = data['work_type'].cat.codes data['restype_new'] = data['Residence_type'].cat.codes # 独热编码 enc = OneHotEncoder() enc_data = pd.DataFrame(enc.fit_transform(data[['Gen_new', 'evm_new', 'wktp_new', 'restype_new']]).toarray()) # 合并编码后的数据,删除原类别列 data = pd.concat([data.drop(data.columns[[1, 5, 6, 7]], axis=1), enc_data], axis=1) # 拆分已知和未知smoking_status的数据集 smokestatus_unknown = data[data['smoking_status'] == 'Unknown'].copy() smokestatus_known = data[data['smoking_status'] != 'Unknown'].copy() # 训练集用DataFrame,保留特征名 X = smokestatus_known.drop('smoking_status', axis=1) Y = smokestatus_known['smoking_status'] X_train, X_test, Y_train, Y_test = train_test_split(X, Y, test_size=0.1, random_state=0) forest = RandomForestClassifier(n_estimators=45, max_depth=25, random_state=False, max_features=0.6, min_samples_leaf=3, n_jobs=-1) forest.fit(X_train, Y_train) y_pred_train = forest.predict(X_train) y_pred = forest.predict(X_test) # 预测未知值 smokestatus_unknown_X = smokestatus_unknown.drop('smoking_status', axis=1) prediction = forest.predict(smokestatus_unknown_X) # 更新smoking_status列 smokestatus_unknown['smoking_status'] = prediction # 将更新后的子集合并回原数据集 data.update(smokestatus_unknown)
警告信息翻译
你收到的警告中文翻译为:
用户警告:X包含特征名称,但RandomForestClassifier训练时未使用特征名称
该警告因训练时用无特征名的numpy数组、预测时用带列名的DataFrame导致,修正为用DataFrame训练即可消除。
内容的提问来源于stack exchange,提问作者rts2027
相关产品推荐
相关产品推荐

