如何组合/集成存储在 3 个数据帧中的 3 个机器学习模型的结果,并输出 1 个数据帧,结果得到多数同意?



我目前正在参加一个在线黑客马拉松。所有排名靠前的条目彼此相差不到 1%。因此,我决定运行 3 个不同的模型,而不是一个性能最好的模型,即集成学习,在每个模型上调整超参数,然后结合所有三个模型的结果以获得更好的模型。我已经将所有三个的结果组合在一个数据帧中,它的 df.head(( 如下所示:

index | building_id | rf_damage_grade | xg_damage_grade | lr_damage_grade   | damage_grade
0   a3380c4f75  Grade 4 Grade 2 Grade 3 Grade 4
1   a338a4e653  Grade 5 Grade 5 Grade 5 Grade 5
2   a338a4e6b7  Grade 5 Grade 5 Grade 5 Grade 5
3   a33a6eaa3a  Grade 3 Grade 2 Grade 4 Grade 3
4   a33b073ff6  Grade 5 Grade 5 Grade 5 Grade 5

所以"rf_damage_grade"是我最好的分类器的列。它提供了大约 74% 的准确率,另外两个分别提供 68% 和 58%。在我想要的最终输出中,如果"xg_damage_grade"和"lr_damage_grade"都同意一个值,则最终输出"damage_grade"将更改为该值,否则它仍然等于"rf_damage_grade"的输出。数据中有超过 400k 行,每次我重新运行模型时,在 2015 年初的 MBP 上执行此操作大约需要一个小时。以下是我编写的代码:

for i in range(len(final)):
if final.iloc[i,2]==final.iloc[i,3]:
final.iloc[i,4]=final.iloc[i,2]
if final.iloc[i,3]!=final.iloc[i,1]:
count+=1
else:
continue

我能做些什么来提高效率?sklearn中是否有任何内置函数可以做这种事情?

只需使用.loc运行条件逻辑:

df.loc[df['xg_damage_grade'] == df['lr_damage_grade'], 'damage_grade'] = df['xg_damage_grade']
df.loc[df['xg_damage_grade'] != df['lr_damage_grade'], 'damage_grade'] = df['rf_damage_grade']

或者用 numpy 的where

df['damage_grade'] = np.where(df['xg_damage_grade'] == df['lr_damage_grade'],
df['xg_damage_grade']
df['rf_damage_grade'])

最新更新