Zephyrnet-logotyp

Utmaningarna med att skapa funktioner för maskininlärning

Datum:

Utmaningarna med att skapa funktioner för maskininlärning
Bild av den Monsterko från Pixabay

 

När jag bestämde mig för att lämna akademin och utbilda mig till datavetare fick jag snabbt reda på att jag var tvungen att lära mig R eller Python, eller tja... båda. Det är förmodligen första gången jag hörde talas om Python. Jag hade aldrig föreställt mig att jag tre år senare skulle upprätthålla ett allt mer populärt Python-bibliotek med öppen källkod för funktionsteknik: Feature-motor.

I den här artikeln vill jag diskutera utmaningarna med funktionsteknik och urval både från den tekniska och operativa sidan, och sedan redogöra för hur Feature-motor, ett Python-bibliotek med öppen källkod, kan hjälpa oss att mildra dessa utmaningar. Jag kommer också att lyfta fram fördelarna och nackdelarna med Feature-engine i samband med andra Python-bibliotek. Låt oss dyka in.

Vad är Leverans-motor?

 
Feature-motor är ett Python-bibliotek med öppen källkod för funktionsutveckling och funktionsval. Det fungerar som Scikit-learn, med metoderna fit() och transform() som lär sig parametrar från data och sedan använder dessa parametrar för att transformera data.

Med Feature-engine kan vi utföra massor av funktionstransformationer, som att imputera saknade data, koda kategoriska variabler, diskretisera numeriska variabler och transformera variabler med matematiska funktioner som logaritm, kvadratrot och exponential. Vi kan också kombinera befintliga funktioner för att skapa nya, ta bort eller censurera extremvärden och extrahera funktioner från datum och tid.

 
Utmaningarna med att skapa funktioner för maskininlärning


 

Feature-motor har en helhet modul tillägnad funktionsval, med funktionsvalstekniker som har utvecklats i datavetenskapstävlingar eller inom organisationer, och som inte är tillgängliga i Scikit-learn eller något annat Python-bibliotek. Jag diskuterade några av dessa tekniker i en tidigare inlägg.

Vad gör Funktionsmotor unik?

 
Det finns ett antal egenskaper som gör Feature-engine lätt att använda och ett utmärkt alternativ för funktionsteknik. För det första innehåller Feature-engine det mest uttömmande batteriet av funktionstekniska transformationer. För det andra kan Feature-motor transformera en specifik grupp av variabler i dataramen, och vi behöver bara ange de variabler som ska transformeras inom en Feature-motors transformator, utan några extra rader med kod eller hjälpklasser. För det tredje kan Feature-engine automatiskt känna igen numeriska, kategoriska och datetime-variabler, vilket gör att vi lättare kan bygga en funktionsteknisk pipelines. För det fjärde tar Feature-engine in en dataram och returnerar en dataram, vilket gör den till ett lämpligt bibliotek både för datautforskning och även för att distribuera modeller till produktion.

Feature-engine har andra funktioner som gör det till ett fantastiskt bibliotek, som omfattande dokumentation med massor av exempel, lättläst funktionalitet och kompatibilitet med Scikit-learn Pipeline, Grid och Random hyperparametersökklasserna.

Feature-motorn är utformad för att hjälpa användare att utföra meningsfulla datatransformationer. Funktionsmotorn varnar användare när en transformation inte är möjlig, t.ex. om logaritm tillämpas på negativa variabler eller divisioner med 0, om NaN-värden införs efter transformationen eller om variablerna som användaren matat in inte är av lämplig typ. Du behöver alltså inte vänta till slutet av processen för att hitta otäcka överraskningar. Du kommer att veta direkt!

Varför är funktionsteknik utmanande?

 
Låt oss först definiera funktionsteknik. Funktionsteknik är processen att använda domänkunskap för att skapa eller transformera variabler som är lämpliga för att träna maskininlärningsmodeller. Det handlar om allt från att fylla i eller ta bort saknade värden, till att koda kategoriska variabler, transformera numeriska variabler, extrahera funktioner från datum, tid, GPS-koordinater, text och bilder och kombinera dem på meningsfulla sätt. Med det sagt, vilka är utmaningarna med denna process?

Dataförbearbetning och funktionsteknik är tidskrävande. Först måste vi samla in en representativ datauppsättning av befolkningen som vi vill bedöma. Därefter utför vi datautforskning för att förstå de variabler vi har och deras relation till ett mål, om vi har ett. Ju sämre kvalitet på datan, eller ju mindre vi vet om den datan som vi arbetar med, desto mer tid behöver vi lägga på att utforska och förbereda den datan. Slutligen måste vi arbeta igenom data för att lämna den i ett tillstånd där den kan konsumeras av en maskininlärningsmodell.

Dataförbearbetning och funktionsteknik är repetitiva. Vi utför samma transformationer på olika variabler i samma datauppsättning och över projekt, dvs datauppsättningar. Och mycket troligt utför våra kollegor samma transformationer på sina datamängder. I ett nötskal, kan hela teamet utföra samma transformationer, variabel efter variabel, datauppsättning efter datauppsättning. Detta beror på nästa utmaning: reproducerbarhet. Hur säkerställer vi att olika kod, från olika kollegor, returnerar samma funktionalitet? Hur kan vi bygga vidare på koden som vi redan har skapat för att påskynda framtida projekt?

Dataförbearbetning och funktionsteknik måste vara det reproducerbar. Koden som vi använder, projekt efter projekt, gruppmedlem efter gruppmedlem, måste uppnå samma resultat givet samma data. Så vi behöver reproducerbarhet över projekt och över team. Men ännu viktigare, vi behöver reproducerbarhet mellan forsknings- och utvecklingsmiljöerna. Vad?

När vi väl har skapat en maskininlärningsmodell som förbrukar en del förbearbetad data måste vi sätta modellen i produktion. Mycket ofta innebär den processen att återskapa modellen och hela funktionstekniska transformationer i produktionsmiljön. Vi behöver kunna få samma resultat, givet samma data, med modellen i produktionsmiljön och den modell vi har utvärderat i forskningsmiljön. Denna process ger sina egna utmaningar. För det första, är koden i forskningsmiljön lämplig för produktion? Eller kommer vi att behöva refaktorisera koden avsevärt? Funktionsteknikmetoder, som maskininlärningsmodeller, kan lära sig parametrar från data. Hur lagrar vi dessa parametrar för senare användning?

Funktionsteknik innebär också icke-tekniska utmaningar, som tolkbarhet. Kan vi förstå funktionerna efter transformationen? Mycket ofta behöver användarna av modellerna förstå varför modellen tog ett visst beslut. Till exempel vill bedrägeriutredare ofta veta varför en bedrägerimodell tror att en viss applikation eller kund kan vara bedräglig. Det betyder att vi behöver kunna tolka förutsägelserna på en observationsnivå, det vill säga för varje kund eller varje applikation. För att tolka en förutsägelse måste vi använda modeller som vi kan tolka, och även pass som vi kan tolka. Detta kommer att påverka de funktionstransformationer som vi väljer. Till exempel kan vi kombinera funktioner sinsemellan i någon form av polynomordningstransformation. Men dessa transformationer genererar egenskaper som inte är förståeliga för oss. Vad betyder "ålder i kvadrat multiplicerat med inkomstkub"? Till synes finns det sätt att koda kategoriska variabler som returnerar egenskaper som inte kan tolkas av människor. Så om vi behöver tolka våra modeller måste vi ge dem tolkbara funktioner.

Slutligen måste maskininlärningsmodeller vara det verkligt. Och för att en modell ska vara rättvis måste de fatta beslut baserade på rättvisa, icke-diskriminerande egenskaper. Ett exempel på en diskriminerande egenskap skulle vara kön och i vissa fall ålder. Vi behöver också träna modeller med representativa datamängder. Om våra modeller kommer att användas i Storbritannien borde vi förmodligen träna våra modeller baserat på data från den brittiska befolkningen.

Hur ser din drömresa ut gör Hjälp med funktionsmotor att tackla dessa utmaningar?

 
Feature-motorn har utformats för att minska tiden som läggs på datatransformation genom att undvika att skriva repetitiv kod, samtidigt som man säkerställer reproducerbarhet och returnerar tolkningsbara funktioner. Med Feature-engine behöver datavetare inte koda varje transformation från början, de kan implementera varje transformation på flera variabler åt gången, i 1 till 3 rader kod.

Feature-motorn är versionsstyrd, vilket säkerställer reproducerbarhet mellan forsknings- och produktionsmiljön. Feature-motorns transformatorer är noggrant testade, vilket säkerställer att de ger den förväntade transformationen. Genom att använda Feature-engines transformatorer över miljöer, projekt och teammedlemmar säkerställer vi att alla får samma resultat från samma transformationer och data, vilket maximerar reproducerbarheten.

Feature-motor har fokuserats på att skapa variabler som är begripliga för människor. Således, närhelst en modell fattar ett beslut, kan vi förstå hur den variabeln bidrog till det beslutet.

Finns det inte tillräckligt med funktionsteknikbibliotek redan?

 
Visst, Feature-engine är inte den första i spelet. Det finns andra fantastiska Python-bibliotek för funktionstransformation, som pandas, Scikit lära, Kategorikodare, Funktionsverktyg, tsfresh och mer. Python-ekosystemet växer år för år.

 

Utmaningarna med att skapa funktioner för maskininlärning
Python-bibliotek med öppen källkod för funktionsutveckling och urval.

 

Kategorikodare, Featuretools och tsfresh hanterar mycket specifika problem. Den första är utformad för att koda kategoriska variabler, medan Featuretools och tsfresh arbetar med tidsserier mest för klassificeringsproblem.

Pandas är ett utmärkt bibliotek för att kombinera datatransformation med utforskande dataanalys. Och det är förmodligen därför det är det bästa verktyget. Men Pandas, tillåter oss inte att lagra parametrar som vi lärt oss från data direkt. Feature-motor fungerar ovanpå Pandas, för att lägga till denna funktionalitet.

Scikit-learn, å andra sidan, låter oss tillämpa ett brett utbud av datatransformationer och det kan lagra parametrar i vissa fall. Med Scikit-learn till exempel kan vi använda vanliga dataimputering och kategoriska kodningsmetoder för att lära oss och lagra parametrar. Och med hjälp av FunctionTransformer() kan vi också i princip tillämpa vilken transformation vi vill på variablerna. Ursprungligen designades Scikit-learn-transformatorer för att transformera hela datasetet. Detta innebär att om vi bara vill transformera en delmängd av data, måste vi dela upp data manuellt eller göra någon form av lösning. På senare tid har de lagt till mer och mer funktionalitet för att göra detta möjligt. Scikit-learn-transformatorer kommer också att returnera en Numpy-array, optimal för att träna maskininlärningsmodeller men inte bra för att fortsätta med datautforskning.

Slutligen, med Pandas och Scikit-learn kan vi implementera de vanligaste metoderna för att förbearbeta data, men ytterligare metoder som utvecklats inom organisationer eller datavetenskapstävlingar är inte tillgängliga.

Tillbaka till Feature-motor: hur fungerar det?

 
Funktionsmotortransformatorer fungerar precis som Scikit-learn-transformatorer. Vi måste instansiera klassen med några parametrar, sedan tillämpa fit()-metoden så att transformatorn lär sig de nödvändiga parametrarna, och slutligen transform()-metoden för att transformera data.

Till exempel kan vi instansiera en saknad dataimputerare genom att ange vilken imputeringsmetod som ska användas och vilka variabler som ska ändras enligt följande:

median_imputer = MeanMedianImputer( imputationsmetod = 'median', variabler = ['variabel_a', 'variabel_b'] )

Vi tillämpar sedan metoden fit() över en träningsuppsättning, så att imputeren lär sig medianvärdena för varje variabel:

median_imputer.fit(X_train)

Och slutligen tillämpar vi transformeringsmetoden över vilken datauppsättning vi vill ha. Med det kommer saknad data att imputeras i de angivna variablerna av värdena som lärts in i föregående steg:

train_t = median_imputer.transform(X_train) test_t = median_imputer.transform(X_test)

Och det är allt. Det saknas inte mer data i de 2 variablerna som vi ville ha.

Vilka är riskerna med felaktigt tillämpade datatransformationer?

 
Funktionsteknik är en möjlighet att få ut mer värde från våra funktioner. I denna mening kommer att tillämpa "felaktiga" datatransformationer, om något sådant existerar, att ha en avsmittande effekt på maskininlärningsmodellens prestanda och tolkningsbarhet.

Vissa modeller gör antaganden om data. Till exempel antar linjära modeller ett linjärt samband mellan egenskaper och målet. Om våra datatransformationer inte bevarar eller på annat sätt skapar den linjära relationen, kommer modellens prestanda inte att bli så bra som den skulle kunna vara. På samma sätt påverkas vissa modeller negativt av extremvärden, så att inte ta bort eller censurera dem kan påverka deras prestanda.

Hur illa är en minskning av modellens prestanda? Tja, det beror på vad vi använder modellen till. Om vi ​​försöker förhindra bedrägerier kan en minskning av modellens prestanda leda till att tusentals eller miljoner dollar går förlorade på grund av bedrägerier, med den följdeffekt som det orsakar för andra konsumenter av produkterna, oavsett om det är försäkringar eller lån. Om vi ​​använder en modell för att optimera reklam, skulle jag hävda att det inte är en stor förlust, för ja... det är bara reklam.

Problemet får en annan dimension om vi använder modeller för att förutsäga sjukdom, bestämma vem som ska få visum eller en plats på universitetet. I det första fallet står patienternas hälsa på spel. I det senare talar vi om människors framtid och karriär, för att inte tala om bristande rättvisa och diskriminering.

Den sista punkten för mig tillbaka till tolkningsbarheten. Är mina egenskaper rättvisa och neutrala? Eller är de diskriminerande? Förstår jag mina egenskaper och hur data, även efter transformationen, påverkar förutsägelserna som modellen gör? Om jag inte förstår mina variabler kan jag lika gärna inte använda dem för att träna modellerna. Annars vet jag inte varför beslut fattas.

Om du vill veta mer om konsekvenserna av partiska modeller, boken "Vapen av matematisk förstörelse” erbjuder ett bra minne av modeller som har negativt påverkat de ämnen som de gjorde förutsägelser om att vara orättvisa. Filmen "Kodad förspänning” berättar å andra sidan om konsekvenserna av att använda en modell på en population som inte var representerad i träningsdataset.

Hur fungerar Leverans-motor hjälpa till att mildra dessa risker?

 
Vi nämnde att vissa modeller antar linjära relationer mellan funktioner och mål. Feature-motor inkluderar ett batteri av transformationer som returnerar monotona relationer mellan den transformerade variabeln och målet. Så även om det linjära, eller väl, monotona, förhållandet inte existerade i rådata, kan det uppnås efter en transformation. Och denna transformation görs inte på bekostnad av tolkningsbarhet. Med de lagrade parametrarna kan vi nästan alltid gå tillbaka från den transformerade variabeln till rådata.

Jag skulle dock hävda att den största fördelen är att Feature-motorn "tvingar" användare att använda domänkunskap för att bestämma vilken transformation som ska tillämpas. Det gör det genom att inte centralisera alla transformationer till en klass, utan istället gruppera relaterade transformationer i en transformator. Till exempel, med Scikit-learns SimpleImputer() kan vi tillämpa alla vanliga imputeringstekniker. Feature-motorn har 3 transformatorer för att täcka hela SimpleImputer()-funktionaliteten. Detta görs avsiktligt för att undvika att tillämpa transformationer som är lämpliga för kategoriska variabler på numeriska variabler, eller transformationer som avsevärt kommer att förvränga variabelfördelningen till variabler med få datapunkter som saknas.

Den decentraliserade designen är spridd över hela paketet, så att vi i varje transformator kan lägga till funktionalitet och information som hjälper användarna att förstå fördelarna och begränsningarna med den transformationen, samt fel som uppstår när till exempel variabeln inte är lämplig.

När är Feature-engine inte det bästa alternativet?

 
Feature-motorn har designats för att fungera med pandas dataramar, och hittills är det mesta av dess funktionalitet inriktad på tabell- eller tvärsnittsdata. Detta är de optimala förutsättningarna för att använda Feature-motor. Om vår data inte kan lagras i en dataram eller om den inte är tabellformad, till exempel om vi har tidsserier, så är Feature-engine inte rätt val för tillfället.

Vad är nästa för Leverans-motor?

 
I vår senaste release i januari 2022 gjorde vi en massiv förbättring av dokumentationen, inklusive fler förklaringar och exempel på hur man använder Feature-motors transformatorer. Vi släppte också en ny transformator för att automatiskt extrahera funktioner från datetime-variabler, och en ny urvalsalgoritm baserad på funktionens befolkningsstabilitetsindex, som används i stor utsträckning inom finans.

Därefter vill vi utöka Feature-motorn för att skapa funktioner från tidsserier för prognoser. Vi vill att Feature-engine ska kunna skapa fördröjningsfunktioner och fönsterfunktioner med hjälp av funktionerna fit() och transform() som vi älskar. Och vi vill också utöka funktionaliteten hos datetime-funktioner, till exempel genom att skapa funktioner från kombinationer av datetime-variabler. Ett exempel skulle vara att bestämma ålder utifrån skillnaden mellan födelsedatum och tidpunkten för ansökan.

Hur kan vi stödja Leverans-motor?

 
Om du tycker att Feature-engine är ett bra paket, finns det många sätt som du kan stödja dess fortsatta utveckling och underhåll. Du kan bidra med kod för att förbättra dess funktionalitet, donera för att stödja underhållaren (aka, jag), föreslå nya funktioner som ska inkluderas, skriv en blogg, prata om Feature-motor på en träff, eller med kollegor och studenter, och något annat sätt du kan tänka dig för att sprida ordet.

Feature-motor är ett inkluderande projekt. Vi välkomnar alla. Om du funderar på att göra ditt första bidrag till öppen källkod, om du är en erfaren utvecklare, om du vill lära dig Python eller maskininlärning, om du vill ha roligt med kodning, om du har för mycket tid och inte vet vad att göra med det, om du vill lära oss ett par saker, eller om du behöver specifik funktionalitet, hoppa ombord. Vi är glada över att ha dig.

Inslagning upp

 
Om du har kommit så långt, bra jobbat och tack för att du läste!

För att bidra till Feature-motor kolla vår bidragande riktlinjer. Hur tråkiga riktlinjer än låter, de kommer att spara mycket tid på att ställa in miljön och felsöka git .

För att lära dig mer om Feature-motor besök dess dokumentation. För att lära dig mer om funktionsteknik och funktionsval i allmänhet, kolla in mina kurser Funktionsteknik för maskininlärning och Funktionsval för maskininlärning.

För ytterligare öppen källkodsbibliotek för funktionsteknik, kolla in Kategorikodare, Funktionsverktyg, tsfresh.

För en fantastisk diskussion om hur maskininlärning kan påverka människors liv negativt när de inte används på rätt sätt, kolla in boken "Vapen av matematisk förstörelse".

Det var allt, jag hoppas att du gillade artikeln.

 
 
Soledad Galli, PhD är Lead Data Scientist och maskininlärningsinstruktör på Träna i data. Sole undervisar i mellan- och avancerade kurser i datavetenskap och maskininlärning. Hon arbetade inom finans och försäkring, fick en Data Science Leaders Award 2018 och valdes ut som "LinkedIns röst” i datavetenskap och analys 2019. Hon är också skaparen och underhållaren av Python-biblioteket med öppen källkod Feature-motor. Sole brinner för att dela kunskap och hjälpa andra att lyckas inom datavetenskap.
 

plats_img

Senaste intelligens

plats_img