运动员奖牌获得概率预测模型运行报输入含NaN错误如何解决
报错原因
- 你仅对
Height、Weight两列做了缺失值填充,但用于训练的特征矩阵X包含Age、Sex、Height、Weight四个特征,未处理Age列的缺失值,这些NaN值传入模型时触发了报错。 - 潜在风险:若
Sex列存在空值,你编写的lambda函数会将空值识别为非'M'统一赋值为1,虽不会直接触发NaN报错,但会导致训练数据出现偏差。
修复方案
- 补充填充
Age列的缺失值,可沿用均值填充的逻辑:
# 填充Age列缺失值 df['Age'].fillna(value=df['Age'].mean(), inplace=True) # 可将Age转为int类型,和你现有数据格式保持统一 df['Age'] = df['Age'].astype(int)
- (可选)检查并处理
Sex列的空值,避免数据噪声:
# 先查看Sex列的缺失数量 print(df['Sex'].isna().sum()) # 若存在缺失,可用众数填充后再做编码 df['Sex'].fillna(df['Sex'].mode()[0], inplace=True) df['Sex'] = df['Sex'].apply(lambda x: 1 if str(x) != 'M' else 0)
- 训练前校验所有特征的完整性,确认无缺失值后再运行模型:
# 输出各特征列的缺失值数量,全为0即可正常训练 feature_names = ["Age", "Sex", "Height", "Weight"] print(df[feature_names].isna().sum())
- 场景适配优化:你的目标变量
Medal是0/1二分类变量,使用DecisionTreeRegressor回归器不符合任务场景,建议替换为分类模型,例如DecisionTreeClassifier,更适配获奖概率预测的需求,修改代码如下:
from sklearn.tree import DecisionTreeClassifier from sklearn.model_selection import cross_val_score classifier = DecisionTreeClassifier(random_state=0) cross_val_score(classifier, X, y, cv=10)
内容的提问来源于stack exchange,提问作者user13998985
相关产品推荐
相关产品推荐

