Koneoppimisen parhaiden ominaisuuksien löytämisen taito

Ominaisuuksien valinta

Monissa tilanteissa kaikkien datajoukossa saatavilla olevien ominaisuuksien käyttäminen ei johda ennustavimpaan malliin. Käytettävän mallin tyypistä riippuen datajoukon koko ja monet muut tekijät, kuten ylimääräiset ominaisuudet, voivat heikentää mallin suorituskykyä.

Ominaisuuksien valinnassa on kolme päätavoitetta.

  • Parantaa tarkkuutta, jolla malli pystyy ennustamaan uutta dataa.
  • Vähentää laskentakustannuksia.
  • Tuottaa tulkinnanvaraisempi malli.

On useita syitä, joiden vuoksi tiettyjä piirteitä voidaan poistaa toisten sijaan. Tällaisia syitä ovat mm. piirteiden väliset suhteet, se, onko tilastollinen suhde kohdemuuttujaan olemassa tai onko se riittävän merkittävä, tai piirteen sisältämän informaation arvo.

Ominaisuuksien valinta voidaan tehdä manuaalisesti analysoimalla datajoukko sekä ennen että jälkeen harjoittelun, tai automatisoitujen tilastollisten menetelmien avulla.

Ominaisuuksien valinta manuaalisesti

Ominaisuuksien valintaan

Ominaisuuksien poistamiseen harjoitteluvaiheessa on useita syitä. Näitä ovat esimerkiksi:

  • Ominaisuus, joka korreloi voimakkaasti jonkin toisen aineistossa olevan ominaisuuden kanssa. Jos näin on, molemmat piirteet tarjoavat pohjimmiltaan samaa tietoa. Jotkin algoritmit ovat herkkiä korreloiville ominaisuuksille.
  • Ominaisuudet, jotka tarjoavat vain vähän tai ei lainkaan informaatiota. Esimerkkinä voidaan mainita piirre, jossa useimmilla esimerkeillä on sama arvo.
  • Piirteet, joilla on vain vähän tai ei lainkaan tilastollista yhteyttä kohdemuuttujaan.

Piirteet voidaan valita data-analyysin avulla, joka suoritetaan joko ennen mallin kouluttamista tai sen jälkeen. Seuraavassa on pari yleistä tekniikkaa, joilla piirteiden valinta voidaan suorittaa manuaalisesti.

Korrelaatiokuvio

Yksi manuaalinen tekniikka piirteiden valinnan suorittamiseksi on luoda visualisointi, joka piirtää korrelaatiomittarin jokaiselle piirteelle datajoukossa. Seaborn on hyvä python-kirjasto tähän tarkoitukseen. Alla oleva koodi tuottaa korrelaatiokuvion scikit-learnin API:sta saatavan rintasyöpädatan piirteille.

# library imports
import pandas as pd
from sklearn.datasets import load_breast_cancer
import matplotlib.pyplot as plt
%matplotlib inline
import seaborn as sns
import numpy as np# load the breast_cancer data set from the scikit-learn api
breast_cancer = load_breast_cancer()
data = pd.DataFrame(data=breast_cancer, columns = breast_cancer)
data = breast_cancer
data.head()# use the pands .corr() function to compute pairwise correlations for the dataframe
corr = data.corr()
# visualise the data with seaborn
mask = np.triu(np.ones_like(corr, dtype=np.bool))
sns.set_style(style = 'white')
f, ax = plt.subplots(figsize=(11, 9))
cmap = sns.diverging_palette(10, 250, as_cmap=True)
sns.heatmap(corr, mask=mask, cmap=cmap,
square=True,
linewidths=.5, cbar_kws={"shrink": .5}, ax=ax)

Tuloksena olevasta visualisoinnista voidaan tunnistaa joitakin piirteitä, jotka korreloivat läheisesti keskenään ja joista osa halutaan sen vuoksi poistaa, sekä joitakin piirteitä, joiden korrelaatio kohdemuuttujan kanssa on hyvin heikko ja jotka halutaan myös poistaa.

Ominaisuuksien merkitys

Kun olemme kouluttaneet mallin, on mahdollista soveltaa tarkempaa tilastollista analyysia ymmärtääksemme ominaisuuksien vaikutuksia mallin tulokseen ja määrittääksemme tästä, mitkä ominaisuuksista ovat hyödyllisimmät.

Ominaisuuksien tärkeyden määrittämiseen on käytettävissä useita työkaluja ja tekniikoita. Jotkin tekniikat ovat ainutlaatuisia tietylle algoritmille, kun taas toisia voidaan soveltaa monenlaisiin malleihin, ja niitä kutsutaan malli-agnostisiksi.

Ominaisuuksien tärkeyden havainnollistamiseksi käytän sisäänrakennettua ominaisuuksien tärkeysmenetelmää satunnaismetsäluokittimelle scikit-learnissa. Alla oleva koodi sovittaa luokittimen ja luo piirroksen, joka näyttää piirteiden importanssit.

from sklearn.model_selection import train_test_split
from sklearn.ensemble import RandomForestClassifier
from sklearn.model_selection import train_test_split# Spliiting data into test and train sets
X_train, X_test, y_train, y_test = train_test_split(data.drop('target', axis=1), data, test_size=0.20, random_state=0)# fitting the model
model = RandomForestClassifier(n_estimators=500, n_jobs=-1, random_state=42)
model.fit(X_train, y_train)# plotting feature importances
features = data.drop('target', axis=1).columns
importances = model.feature_importances_
indices = np.argsort(importances)plt.figure(figsize=(10,15))
plt.title('Feature Importances')
plt.barh(range(len(indices)), importances, color='b', align='center')
plt.yticks(range(len(indices)), for i in indices])
plt.xlabel('Relative Importance')
plt.show()

Tämä antaa hyvän indikaattorin niistä piirteistä, joilla on vaikutusta malliin ja niistä, joilla ei ole. Voimme päättää poistaa joitakin vähemmän tärkeitä piirteitä tämän kaavion analysoinnin jälkeen.

Automaattinen piirteiden valinta

On olemassa useita mekanismeja, jotka hyödyntävät tilastollisia menetelmiä optimaalisen piirrejoukon löytämiseksi automaattisesti mallissa käytettäväksi. Scikit-learn-kirjasto sisältää useita menetelmiä, jotka tarjoavat hyvin yksinkertaisen toteutuksen monille näistä tekniikoista.

Varianssikynnys

Tilastotieteessä varianssi on muuttujan neliöllinen poikkeama sen keskiarvosta, toisin sanoen kuinka kauas datapisteet hajaantuvat tietyn muuttujan osalta.

Esitettäisiin, että olisimme rakentamassa koneoppimismallia rintasyövän havaitsemista varten, ja datasarjassa olisi sukupuolta kuvaava boolean-muuttuja. Tämä aineisto koostuu todennäköisesti lähes kokonaan yhdestä sukupuolesta, ja siksi lähes kaikki datapisteet olisivat 1. Tällä muuttujalla olisi erittäin pieni varianssi, eikä siitä olisi lainkaan hyötyä kohdemuuttujan ennustamisessa.

Tämä on yksi yksinkertaisimmista lähestymistavoista ominaisuuksien valintaan. Scikit-learn-kirjastossa on menetelmä nimeltä VarianceThreshold . Tämä menetelmä ottaa kynnysarvon ja kun se sovitetaan piirrejoukkoon, se poistaa kaikki tämän kynnysarvon alapuolella olevat piirteet. Kynnysarvon oletusarvo on 0, ja tämä poistaa kaikki piirteet, joiden varianssi on nolla eli joissa kaikki arvot ovat samat.

Sovelletaan tätä oletusasetusta aiemmin käyttämäämme rintasyöpädatajoukkoon ja selvitetään, poistetaanko mitään piirteitä.

from sklearn.feature_selection import VarianceThresholdX = data.drop('target', axis=1)
selector = VarianceThreshold()
print("Original feature shape:", X.shape)new_X = selector.fit_transform(X)
print("Transformed feature shape:", new_X.shape)

Tuloste osoittaa, että muunnetut piirteet ovat samanmuotoisia, joten kaikilla piirteillä on ainakin jonkin verran varianssia.

Yksimuuttujapohjainen piirteenvalinta

Unimuuttujapohjainen piirteenvalinta soveltaa piirteisiin unimuuttujapohjaisia tilastollisia testejä, ja siinä valitaan piirteistä ne piirteet, jotka suoriutuvat näistä testeistä parhaiten. Yksimuuttujaiset testit ovat testejä, joissa on mukana vain yksi riippuvainen muuttuja. Näihin kuuluvat varianssianalyysi (ANOVA), lineaariset regressiot ja keskiarvojen t-testit.

Scikit-learn tarjoaa useita piirteiden valintamenetelmiä, jotka soveltavat erilaisia univariaatteja testejä löytääkseen parhaat piirteet koneellista oppimista varten.

Sovellamme yhtä näistä menetelmistä, joka tunnetaan nimellä SelectKBest, rintasyöpäaineistoon. Tämä funktio valitsee k parasta piirrettä yksimuuttujaisen tilastollisen testin perusteella. Oletusarvo k:lle on 10, joten 10 piirrettä säilytetään, ja oletustesti on f_classif.

F_classif-testiä käytetään kategorisille kohteille, kuten rintasyöpädatajoukossa. Jos kohde on jatkuva muuttuja, tulisi käyttää f_regressiotestiä. f_classif-testi perustuu tilastolliseen ANOVA-testiin (Analysis of Variance), jossa verrataan useiden ryhmien eli meidän tapauksessamme piirteiden keskiarvoja ja määritetään, eroavatko nämä keskiarvot tilastollisesti merkitsevästi toisistaan.

Alla oleva koodi soveltaa tätä funktiota käyttämällä oletusparametreja rintasyöpädatajoukkoon.

from sklearn.feature_selection import SelectKBestX = data.drop('target', axis=1)
y = data
selector = SelectKBest()
print("Original feature shape:", X.shape)new_X = selector.fit_transform(X, y)
print("Transformed feature shape:", new_X.shape)

Tulosteesta nähdään, että funktio on vähentänyt piirteitä 10:een. Voimme kokeilla eri k:n arvoilla ja kouluttaa useita malleja, kunnes löydämme optimaalisen piirteiden määrän.

Rekursiivinen piirteiden eliminointi

Tällä menetelmällä suoritetaan mallin kouluttaminen asteittain pienemmälle ja pienemmälle piirteiden määrälle. Joka kerta lasketaan piirteiden importanssit tai kertoimet ja poistetaan piirteet, joilla on alhaisimmat pisteet. Tämän prosessin lopussa tiedetään optimaalinen joukko piirteitä.

Koska tässä menetelmässä mallia koulutetaan toistuvasti, meidän on ensin instantioitava estimaattori. Tämä menetelmä toimii myös parhaiten, jos data on ensin skaalattu, joten olen lisännyt esikäsittelyvaiheen, joka normalisoi piirteet.

from sklearn.feature_selection import RFECV
from sklearn.svm import SVR
from sklearn import preprocessingX_normalized = preprocessing.normalize(X, norm='l2')
y = yestimator = SVR(kernel="linear")
selector = RFECV(estimator, step=1, cv=2)
selector = selector.fit(X, y)
print("Features selected", selector.support_)
print("Feature ranking", selector.ranking_)

Alla olevassa tulosteessa näkyvät valitut piirteet ja niiden järjestys.

Ominaisuuksien suunnittelu

Jos ominaisuuksien valinnan tavoitteena on pienentää datavarannon dimensiota poistamalla tarpeettomia piirteitä, ominaisuuksien suunnittelussa on kyse olemassa olevien ominaisuuksien muuntamisesta ja uusien ominaisuuksien konstruoinnista mallin suorituskyvyn parantamiseksi.

On kolme pääsyytä, joiden vuoksi voimme joutua suorittamaan piirteiden suunnittelua optimaalisen mallin kehittämiseksi.

  1. Piirteitä ei voida käyttää sellaisenaan. Tähän kuuluvat esimerkiksi päivämäärien ja kellonaikojen kaltaiset piirteet, joiden sisältämää informaatiota koneoppimismalli voi hyödyntää vain, jos ne muunnetaan numeeriseksi esitykseksi, esimerkiksi viikonpäivän kokonaislukumuotoiseksi esitykseksi.
  2. Piirteitä voidaan käyttää raakamuodossaan, mutta piirteen sisältämä informaatio on vahvempaa, jos data aggregoidaan tai esitetään eri tavalla. Esimerkkinä tästä voisi olla henkilön iän sisältävä ominaisuus, jolloin iän aggregointi kauhoihin tai lokeroihin voi esittää paremmin suhdetta kohteeseen.
  3. Ominaisuudella ei yksinään ole riittävän vahvaa tilastollista suhdetta kohteeseen, mutta kun se yhdistetään johonkin toiseen ominaisuuteen, sillä on mielekäs suhde. Oletetaan, että meillä on tietokokonaisuus, jossa on useita piirteitä, jotka perustuvat asiakasryhmän luottohistoriaan, ja kohde, joka ilmaisee, ovatko he jättäneet lainan maksamatta. Oletetaan, että meillä on lainasumma ja palkka-arvo. Jos yhdistämme nämä uudeksi ominaisuudeksi nimeltä ”lainan ja palkan suhde”, tämä voi antaa enemmän tai parempaa tietoa kuin nämä ominaisuudet yksinään.

Manuaalinen ominaisuuksien suunnittelu

Ominaisuuksien suunnittelu voidaan suorittaa data-analyysin, intuition ja toimialatiedon avulla. Usein suoritetaan samankaltaisia tekniikoita kuin manuaalisessa piirteiden valinnassa.

Huomioimalla esimerkiksi sitä, miten piirteet korreloivat kohteen kanssa ja miten ne käyttäytyvät piirteiden tärkeyden suhteen, saadaan selville, mitä piirteitä on syytä tutkia tarkemmin analyysin kannalta.

Jos palataan esimerkkiin lainatietoaineistosta, kuvitellaan, että meillä on ikämuuttuja, jolla korrelaatiokuvion perusteella näyttää olevan jonkinlainen yhteys kohdemuuttujaan. Kun analysoimme tätä suhdetta tarkemmin, saatamme havaita, että maksuhäiriöiset ovat vinoutuneet tiettyyn ikäryhmään. Tässä tapauksessa voisimme suunnitella ominaisuuden, joka poimii tämän ikäryhmän, ja tämä voi antaa parempaa tietoa mallille.

Automaattinen ominaisuuksien suunnittelu

Manuaalinen ominaisuuksien suunnittelu voi olla erittäin aikaa vievä prosessi, ja se vaatii paljon inhimillistä intuitiota ja aluetuntemusta, jotta se onnistuu. Käytettävissä on työkaluja, joilla on kyky syntetisoida automaattisesti suuri määrä uusia piirteitä.

Featuretools python-kirjasto on esimerkki työkalusta, joka voi suorittaa automaattista piirteiden suunnittelua aineistolle. Asennetaan tämä kirjasto ja käydään läpi esimerkki automaattisesta piirteiden suunnittelusta rintasyöpädatajoukolla.

Featuretools voidaan asentaa pipin kautta.

pip install featuretools

Featuretools on suunniteltu toimimaan relaatiotietojoukkojen (taulukot tai datakehykset, jotka voidaan yhdistää toisiinsa yksilöllisellä tunnisteella) kanssa. Featuretools-kirjasto viittaa kuhunkin taulukkoon entiteettinä.

Rintasyöpädatajoukko koostuu vain yhdestä entiteetistä, mutta voimme silti käyttää featuretoolsia piirteiden tuottamiseen. Meidän on kuitenkin ensin luotava uusi sarake, joka sisältää yksilöllisen tunnuksen. Alla oleva koodi käyttää datakehyksen indeksiä uuden id-sarakkeen luomiseen.

data = data.index + 1

Seuraavaksi tuomme featuretoolsin ja luomme entiteettijoukon.

import featuretools as ftes = ft.EntitySet(id = 'data')
es.entity_from_dataframe(entity_id = 'data', dataframe = data, index = 'id')

Tämä antaa seuraavan tulosteen.

>

Voimmepa seuraavaksi kirjastossa suorittaa ominaisuuksiksi synteesin.

feature_matrix, feature_names = ft.dfs(entityset=es, 
target_entity = 'data',
max_depth = 2,
verbose = 1,
n_jobs = 3)

Featuretools on luonut 31 uutta piirrettä.

Voimmekin tarkastella kaikkia uusia piirteitä suorittamalla seuraavaa.

feature_matrix.columns

Vastaa

Sähköpostiosoitettasi ei julkaista.