为何使用Fare与Family_Size异常值训练RandomForestRegressor填充Age缺失值?
疑问:为何用异常值训练模型填充Age缺失值?
相关代码
dataAgeNull = data[data["Age"].isnull()] dataAgeNotNull = data[data["Age"].notnull()] remove_outlier = dataAgeNotNull[(np.abs(dataAgeNotNull["Fare"]-dataAgeNotNull["Fare"].mean())>(4*dataAgeNotNull["Fare"].std()))| (np.abs(dataAgeNotNull["Family_Size"]-dataAgeNotNull["Family_Size"].mean())>(4*dataAgeNotNull["Family_Size"].std())) ] rfModel_age = RandomForestRegressor(n_estimators=2000,random_state=42) ageColumns = ['Embarked', 'Fare', 'Pclass', 'Sex', 'Family_Size', 'Title1', 'Title2','Cabin','Ticket_info'] rfModel_age.fit(remove_outlier[ageColumns], remove_outlier["Age"]) ageNullValues = rfModel_age.predict(X= dataAgeNull[ageColumns]) dataAgeNull.loc[:,"Age"] = ageNullValues data = dataAgeNull.append(dataAgeNotNull) data.reset_index(inplace=True, drop=True)
用户疑问
为何要使用Fare和Family_Size的异常值数据来训练RandomForestRegressor,以填充Age字段的缺失值?
我尝试理解这段代码,但仍无法弄明白其中的逻辑。
解答
首先要明确:这段代码的逻辑完全不合理,大概率是写代码时的失误,尤其是变量名和筛选逻辑搞反了。
正常填充缺失值的思路是用有代表性的正常样本训练模型,因为异常值本身偏离数据整体分布,用它训练出的模型会被带偏,预测结果会脱离实际范围:
- 代码里的
remove_outlier变量名起错了——它实际筛选的是Fare或Family_Size超出4倍标准差的异常样本,而非移除异常值。 - 用这些极端样本训练回归模型,等于让模型只学习“极端票价/极端家庭规模对应的年龄”,但这类样本不具备普遍代表性,用它预测普通样本的Age,结果会严重失真。
正确的做法
- 从
dataAgeNotNull中剔除异常值,用剩下的正常样本训练模型 - 若异常值占比极低(比如不到1%),也可以直接用全部非缺失值样本训练,异常值的影响可以忽略
内容的提问来源于stack exchange,提问作者Aaron
相关产品推荐
相关产品推荐

