RapidMiner tippek – Valós attribútum nominálissá alakítása
A következő bejegyzés Ragány Csaba kollégánk írása, aki csapatunk egyik, ha nem a legtapasztaltabb RapidMiner felhasználója.
Az elmúlt hetekben több fontos esemény is történt a RapidMiner háza táján, melyek közül az egyik – nem meglepő módon -, hogy a KDNuggets felmérésében idén is a RapidMiner bizonyult a legnépszerűbb adatelemző szoftvernek, megőrizve, sőt növelve ezzel vezető helyét a piacon. Ennek ellenére úgy gondolom, hogy a RapidMiner megítélése többek számára is igencsak kettős. Egyrészt a jól eltalált felhasználói felületének köszönhetően az alkalmazás használatának elsajátítása meglehetősen addiktív, a szerteágazó kiegészítőkkel pedig az adatelemzési feladatok palettájának jelentős része lefedhető. Így nemcsak a kezdő vagy “alkalmi” adatbányászok, de a “főállásúak” gyakori eszközévé is vált a szoftver. A másik oldalról viszont könnyen találhatjuk magunkat olyan feladattal szemben, melynek megoldása RapidMiner-rel egyáltalán nem hatékony, vagy egyenesen lehetetlen vállalkozásnak tűnik. Előbbiek mögött első helyen a gyatra memóriakezelést szokták említeni, melyről a tavaly novemberi RapidMiner fizetős verzió megjelenésének apropóján mi is írtunk. Utóbbiak alatt pedig a szoftvert jellemző apró hiányosságokra és bugokra gondolhatunk, melyek megszűntetésére úgy tűnik, a cég kevesebb figyelmet fordít. Ehelyett a fókusz – az őszi váltással összhangban – inkább a nagyvállalatok kiszolgálására irányul, amit többek között a Radoop felvásárlása is alátámaszt.
Felmerülhet tehát a kérdés: dobjuk-e el a RapidMiner-t és használjunk helyette R-t, Python-t vagy valami mást? A választ nyilván mindenki maga adja meg saját magának (úgy gondolom ebben a kérdésben sem csak fekete és fehér létezik), mindenesetre amit korábban szerettünk a szoftverben, az mind ma is megvan benne. A zavaró hiányosságok kapcsán pedig, melyek néha a legegyszerűbb feladatokat is megoldhatatlannak láttatják, álljon itt az alábbi leírás.
Legyen a feladatunk egy valós számokat tartalmazó attribútum valamiféle elemzése, mely során szeretnénk megállapítani pl. a tizedesjegyek számát, vagy az attribútum minden sorának különbözőségét az első elemhez képest, vagy csak egyszerűen a szám tört részét kellene eltárolnunk egy másik attribútumban. Ezen feladatok megvalósításához nominális attribútumként kell kezelnünk a valós számokat, vagyis szükségünk van egy típuskonverzióra (tegyük fel, hogy numerikus műveleteket is végre kell hajtanunk, így az adatbeolvasáskori típusdeklaráció nem segít rajtunk). Ilyetén típuskonverzió pedig háromféleképpen történhet RapidMiner-ben:
- egyrészt a megfelelő operátor használatával, ami esetünkben a ‘Numerical to Polynominal’,
- másrészt használhatjuk a ‘Generate Attributes’ operátor ‘str()’ függvényét, de
- akár egy ‘Extract Macro’ operátort is segítségül hívhatunk a valós attribútumra (pl. az első elemre a többivel való összehasonlításhoz), hogy a szükséges string műveleteket végrehajthassuk.
Ezek valamelyikének alkalmazása után például a tizedesjegyek száma a pont vagy vessző (decimális jelölő) karakter utáni karaktersorozat hosszával adódik. Bármelyik módszert is választjuk, hamar észrevehető, hogy a maximális karakterhossz véletlen valós számok esetén is – alapértelmezetten – 3. Ennek pedig az az oka, hogy mindhárom módszer a RapidMiner belső, valós attribútumot nominálissá alakító mechanizmusát használja, ami viszont csonkol, méghozzá a ‘rapidminer.general.fractiondigits.numbers’ paraméterben beállított mértékben (a beállítás elérhető a RapidMiner Tools menüpont Preferences almenüjének General füle alatt). Az érték növelése pedig csak addig segít, amíg a saját RapidMiner alkalmazásunkban futtatjuk a létrehozott folyamatot, ugyanis nemigen van módszer ezen beállítás RapidMiner folyamatból való átállítására (persze létrehozhatunk egy külső script-et, mely fájlrendszer szinten a futtatás előtt átírja a ‘/RapidMiner5/resources/com/rapidminer/resources/rapidminerrc’ állomány megfelelő sorát, de adott esetben ez is körülményes lehet).
Van tehát egy egészen egyszerű feladatunk, melyet három kézenfekvő módszerrel sem lehet jól megoldani RapidMiner-ben. Nehezen fogadható el, hogy a kis túlzással tetszőleges karakterhosszal bíró nominális attribútumokban miért nem fér el pl. egy 10-20 digites valós szám, miért van szükség a tizedesjegyek csonkolására illetve miért nem adható meg a ‘Numerical to Polynominal’ operátorban vagy az ‘str()’ függvény paramétereként a tizedesjegyek maximális száma, a makró, mint speciális RapidMiner változó téves értékadásáról pedig már ne is beszéljünk. Néhány ilyen hiányosság vagy bug megtapasztalása után könnyen fordul az ember pl. a Python-hoz, ahol egy kódsorral megvalósítható – a helyesen működő – típusátalakítás.
Hiányosságai azonban nemcsak egy szoftvernek lehetnek. A RapidMiner-ben való alaposabb elmélyülés után felfedezhetjük a ‘Format Numbers’ operátort, mely elsősorban nem a szóban forgó probléma, vagyis a helyes (azaz teljes) valós-nominális típuskonverzió megvalósítására lett létrehozva, hanem a különböző tudományos, százalékos vagy pénznemben megadott számok megfelelő kezelésére. De az operátorban a ‘format type: pattern’ és a ‘pattern: #.####################’ paramétereket illetve értékeket megadva elérhető, hogy egy tetszőleges helyiértékű és maximum 20 tizedesjegyet (a pont tizedesjel utáni # karakterek száma) tartalmazó valós attribútumot nominálissá alakítsunk. Arra érdemes még odafigyelnünk, hogy bár ez az operátor nem csonkol, ha elegendően hosszú mintát adunk meg, azonban kerekít, ami felfogható egyfajta csonkolásnak a digitek számát illetően. Például a ‘789.00146’ valós szám és a ‘#.##’ minta esetén ‘789’ lesz a nominális eredmény, a ‘#.####’ minta esetén pedig ‘789.0015’. Ha tehát nem ismerjük a valós attribútumunk intervallumát, vagy ez idővel változhat, érdemes minél hosszabb illeszkedést használni: ugyanis például a fenti, 20 tizedesjegyes minta esetén a létrejövő nominális attribútumunk éppen a kívánt ‘789.00146’ karakterláncot tartalmazza majd, melyre alkalmazva a ‘length(replaceAll(<nominálissá alakított attribútum neve>, “^\\d+\\.”, “”))’ függvényt, megkapjuk az 5 értéket.