Im letz­ten Bei­trag der Serie wur­den zunächst die ASHRAE Kaggle Com­pe­ti­tion vor­ge­stellt und die dort ver­füg­ba­ren Daten visua­li­siert. Dabei wur­den die Daten aus ver­schie­de­nen Blick­win­keln beleuch­tet, um ein Gefühl für die Daten zu bekom­men. Man konnte sehen, wie in der Rea­li­tät eigent­lich immer üblich, dass der Daten­satz einige Makel hat. 

Im fol­gen­den Bei­trag wol­len wir uns nun mit dem Schritt des Data Cle­an­sings beschäf­ti­gen und an dem Use Case der Kaggle Com­pe­ti­tion vor­stel­len, wie die­ser aus­se­hen kann. 

Data Cle­an­sing bezeich­net dabei das Vor­ge­hen einen Roh­da­ten­satz zu ana­ly­sie­ren, um feh­ler­hafte bzw. feh­lende Daten­sätze zu erken­nen und diese zu kor­ri­gie­ren oder zu löschen. Wei­ter wer­den rele­vante Fea­tures iden­ti­fi­ziert für die zu erwar­ten ist, dass die Ziel­va­ria­ble (in unse­rem Fall meter_reading) von die­sen abhängt. Ziel dabei ist es einen wohl­ge­ar­te­ten Trai­nings­da­ten­satz zu erzeu­gen, von dem ein Ler­ner die zugrunde lie­gen­den – unbe­kann­ten – Gesetz­mä­ßig­kei­ten ler­nen kann. 

Im letz­ten Blog­bei­trag haben wir schon sehen kön­nen, dass zum einen einige Daten feh­len und zum ande­ren unsere Ziel­va­ria­ble meter_reading sich je nach meter_type, primary_use und site_id ganz unter­schied­lich ver­hält. In die­sem Teil wol­len wir die Miss­stände der Daten noch­mal auf­zei­gen und Mög­lich­kei­ten beschrei­ben, wie man mit die­sen umge­hen kann. 

Die Daten

Wie schon im ers­ten Bei­trag gese­hen, las­sen sich die Ungleich­ver­tei­lun­gen der Daten beson­ders gut visu­ell unter­su­chen. Die Pro­bleme der Daten, die wir nun zu bewäl­ti­gen haben, wol­len wir hier noch ein­mal kurz beleuchten:

1. Zum einen ist die Gestalt und Menge der Daten je nach gemes­se­nem Ener­gie­typ (meter) sehr unterschiedlich.

Abbil­dung 1 Ver­tei­lung der Daten nach Energietyp

2. Zum ande­ren sieht man bei Ver­wen­dung einer log­arith­mier­ten Skala, dass meter_reading nach meter im Mit­tel um etwa zwei, nach primary_use  sogar um mehr als drei Grö­ßen­ord­nun­gen vari­iert. Dies wird in den fol­gen­den Abbil­dun­gen deutlich: 

Abbil­dung 2 Varia­tion der Grö­ßen­ord­nun­gen ver­schie­de­ner Energietypen
Abbil­dung 3 Varia­tion der Grö­ßen­ord­nun­gen ver­schie­de­ner Anwendungsbereiche

Wie im ers­ten Teil der Bei­trags­se­rie bereits ange­spro­chen, beschrän­ken wir uns im Fol­gen­den nun auf den meter Chil­led Water. 

3. Wei­ter gibt es ver­ein­zelte Gebäude mit eini­gen gro­ßen Aus­rei­ßern in den meter_reading Wer­ten (z.B. Das  building_id = 954).

Abbil­dung 4 Ener­gie­ver­brauch von Gebäude 954

4. Außer­dem sind, wie schon im ers­ten Teil gese­hen, die Daten je nach site_id (es gibt nur Daten für die site_ids 0, 2, 6, 7, 9) von sehr ver­schie­de­ner Gestalt (vgl. auch Blog­bei­trag 1):

Abbil­dung 5 Ener­gie­ver­brauch von Sites 0, 2 und 6

5. Schließ­lich gibt es noch einige Daten­sätze mit feh­len­den (essen­zi­el­len) Attri­bu­ten, die wir für unse­ren Ler­ner ver­wen­den wollen.

Ziel

Wir wol­len nun die Daten für Chil­led Water so auf­be­rei­ten, dass ein Ler­ner eine mög­lichst gute Vor­her­sage für das meter_reading tref­fen kann. Ein Indiz für gute Vor­aus­set­zun­gen ist die Kor­re­la­tion der ein­zel­nen Fea­tures mit unse­rer Ziel­größe meter_reading. Wenn man sich von dem unbe­rei­nig­ten Daten­satz die Kor­re­la­tio­nen ansieht (wie im 1. Bei­trag bereits gezeigt), stellt man fest, dass es außer zwi­schen den Fea­tures wind_direction und wind_speed sowie dew_temperature und air_temperature kaum Kor­re­la­tio­nen gibt. Ins­be­son­dere gibt es – außer age – auch keine Grö­ßen, die merk­lich mit unse­rer Ziel­größe korrelieren.

Abbil­dung 6 Cor­re­la­tion-Heat-Map des Beispieldatensatzes

Einer­seits bedeu­tet dies nicht, dass jeder Ler­ner, der mit den Roh­da­ten trai­niert wird, zum Schei­tern ver­ur­teilt wäre. Ein Indiz für eine erfolg­rei­che Vor­her­sage unse­rer Ziel­va­ria­blen ist es aber auch nicht. 

Ziel ist nun, die ver­füg­ba­ren Daten so auf­zu­be­rei­ten, dass wir mög­lichst Kor­re­la­tio­nen zwi­schen unse­ren Mess­grö­ßen und unse­rer Ziel­va­ria­blen meter_reading finden. 

Der Auf­be­rei­tungs­pro­zess

Im Fol­gen­den wer­den wir die von uns unter­nom­me­nen Schritte beschrei­ben, um die im vor­he­ri­gen Abschnitt auf­ge­zeig­ten Pro­bleme anzugehen. 

1. Da es sich bei der Ener­gie­art um einen kate­go­ri­sches Attri­but han­delt, haben wir uns wie bereits vor­her ange­kün­digt dazu ent­schlos­sen nur die Ener­gie­art Chil­led Water zu betrach­ten. Damit ver­bleibt uns eine Grund­menge aus 4182440 Daten­sätze, die wir berei­ni­gen wol­len. So müs­sen wir uns nicht mit der Kon­so­li­die­rung der ver­schie­de­nen Ener­gie­ar­ten aus­ein­an­der­set­zen. Um Vor­her­sa­gen für die ande­ren drei Ener­gie­ar­ten zu machen, würde man für diese geson­dert eigene Modelle trainieren.

2. Auch bei dem primary_use han­delt es sich um ein kate­go­ri­sches Attri­but. Die­ses könnte wie die Ener­gie­art in 1. behan­delt wer­den, indem man sich auf einen primary_use kon­zen­triert und für die ande­ren geson­dert Modelle trai­niert. Aller­dings würde man dadurch die Anzahl der ver­füg­ba­ren Daten dras­tisch redu­zie­ren und hätte letzt­end­lich nicht mehr aus­rei­chend Daten um ver­nünf­tig ein Modell zu trainieren:

primary_useAnzahl Daten­sätze
Edu­ca­tion1823125
Entertainment/public assem­bly371663
Food sales and service35132
Health­care111324
Lodging/residential457833
Manufacturing/industrial6677
Office1117099
Other22684
Par­king8781
Public ser­vices179877
Reli­gious worship7327
Retail16039
Technology/science16106
Uti­lity8783

Wenn man doch die­sen Weg gehen will, müsste man sich über­le­gen, wie man geschickt seine Daten ver­mehrt oder doch ver­schie­dene primary_uses zusam­men­fas­sen. Wir wer­den unser Modell auf allen primary_uses trai­nie­ren. Wenn keine aus­rei­chende Genau­ig­keit des Modells erzielt wer­den kann, wäre dies ein Punkt an dem man die Daten noch ver­bes­sern könnte.

3. Ska­liert man das meter_reading linear auf das Inter­vall [0, 1], so ergibt sich für die für das Maxi­mum der meter_reading Werte je Gebäude fol­gende Grafik:

Abbil­dung 7 Res­ka­lier­ter Ener­gie­ver­brauch aller Gebäude

Man sieht deut­lich, dass der Groß­teil der Gebäude ein meter_reading von weni­ger als 0,1 hat. Gebäude mit einem grö­ße­ren meter_reading wer­ten wir als Aus­rei­ßer (wie oben). Damit ver­blei­ben uns etwa 99,97% der Daten­sätze (4181281).

4. Da sich die Sites struk­tu­rell sehr unter­schei­den, haben wir uns dazu ent­schie­den nur Daten von site_id = 2 zu ver­wen­den. Die Daten von Site 2 sehen ziem­lich homo­gen aus und kön­nen daher ver­mut­lich gut für einen Ler­ner ver­wen­det wer­den. Damit ver­lie­ren wir einige Daten­sätze und haben noch 863845. Um die Vari­anz noch etwas zu ver­rin­gern, mit­teln wir die stünd­li­chen Daten noch jeweils über einen Tag und erhal­ten 36134 Daten­punkte. Damit sind wir noch im Rah­men der für LightGBM emp­foh­le­nen Min­dest­größe von 10000 Daten­sät­zen. Für andere Sites sind aller­dings noch deut­lich weni­ger Daten vor­han­den. Diese müsste man dann mit ande­ren Sites zusam­men­fas­sen, um LightGBM auf die­sen zu trainieren.

5. Schaut man sich nun die Kor­re­la­tio­nen an, so stellt man fest, dass meter_reading, age, air_temperature sowie dew_temperature kor­re­liert scheinen:

Abbil­dung 8 Cor­re­la­tion-Heat-Map von Site 2

Daher wer­den wir uns nun auf diese Fea­tures ein­schrän­ken und zu guter letzt alle Daten­sätze ver­nach­läs­si­gen, die dort feh­lende Infor­ma­tio­nen haben.

Damit ver­blei­ben uns ins­ge­samt 27375 Daten­sätze, um einen Ler­ner zu trai­nie­ren. Wie schon ange­merkt, reicht dies aus, um den LightGBM Algo­rith­mus auf unse­ren berei­nig­ten Daten­satz anzu­wen­den. Wäre der Daten­satz merk­lich klei­ner, so könnte allein durch unsere man­gelnde Daten­satz­größe Over­fit­ting auf­tre­ten. Mit unse­ren 27375 haben wir zwar einen klei­ne­ren Daten­satz, aber noch nicht zu klein für unser Vorhaben.

Fazit

Das Resul­tat des Data Cle­an­sings sieht für unsere Ein­schrän­kun­gen erfolgs­ver­spre­chend aus. Um die ande­ren Ener­gie­ty­pen und Sites zu unter­su­chen, wäre ähn­lich vorzugehen. 

Fach­lich wäre zu erwar­ten, dass der Ener­gie­ver­brauch jeweils eine Sai­so­na­li­tät auf­weist. Anhand der zur Ver­fü­gung ste­hen­den Daten wird diese aller­dings nicht von einem Ler­ner erkannt wer­den kön­nen. Um diese dem Modell doch bei­zu­brin­gen, wäre es zum Bei­spiel eine Option fik­tive Daten für 2015 als Dupli­kat derer von 2016 zu generieren. 

Im letz­ten Teil die­ser Bei­trags­se­rie wol­len wir den LightGBM Algo­rith­mus vor­stel­len, mit dem prä­pa­rier­ten Daten­satz trai­nie­ren und dabei zei­gen, was für einen Ein­fluss das Data Cle­an­sing auf die Güte des Ler­ners hat.