Как объединить / объединить результаты 3 моделей машинного обучения, хранящиеся в 3 кадрах данных, и вывести 1 кадр данных с результатами, согласованными большинством? - PullRequest
0 голосов
/ 27 июня 2018

В настоящее время я участвую в онлайн-хакатоне. Все лучшие записи находятся в пределах 1% друг от друга. Поэтому я решил запустить 3 разные модели вместо одной наиболее эффективной, то есть ансамблевого обучения, настроить гиперпараметры для каждой из них, а затем объединить результаты всех трех, чтобы получить лучшую модель. Я объединил результаты всех трех в dataframe, это 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' оба согласуются по одному значению, окончательный вывод'mage_grade 'изменяется на это значение, в противном случае он остается равным выводу' rf_damage_grade '. В данных содержится более 400 тысяч строк, и каждый раз, когда я перезапускаю свою модель, на моем MBP в начале 2015 года требуется около часа. Ниже приведен код, который я написал:

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 для такого рода вещей?

1 Ответ

0 голосов
/ 27 июня 2018

Просто запустите условную логику с помощью .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's where:

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