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

使用RandomForestClassifier补全卒中预测数据集未知吸烟状态失败排查

解决卒中预测数据集中smoking_status未知值替换问题及特征名警告处理

问题核心

你用RandomForestClassifier预测smoking_status列的Unknown值后,原数据集data没有变化,同时收到特征名不匹配的警告。

错误原因

  1. 未合并修改后的子集:仅修改了smokestatus_unknown子集,但未将更新后的数据合并回原data数据集,导致原数据完全无变化。
  2. 特征名不匹配:训练模型时用.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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.02 04:31:24