Kunsten at finde de bedste funktioner til maskinlæring

Udvælgelse af funktioner

I mange situationer vil brugen af alle de funktioner, der er tilgængelige i et datasæt, ikke resultere i den mest forudsigende model. Afhængigt af den type model, der anvendes, kan størrelsen af datasættet og forskellige andre faktorer, herunder overskydende funktioner, reducere modellens ydeevne.

Der er tre hovedmål for udvælgelse af funktioner.

  • Forbedre den nøjagtighed, hvormed modellen er i stand til at forudsige for nye data.
  • Reducere beregningsomkostningerne.
  • Producere en mere fortolkelig model.

Der er en række grunde til, at man kan fjerne visse funktioner frem for andre. Dette omfatter de relationer, der findes mellem funktioner, om der findes en statistisk relation til målvariablen eller om den er signifikant nok, eller værdien af den information, der er indeholdt i en funktion.

Funktionsselektion kan udføres manuelt ved analyse af datasættet både før og efter træning, eller ved hjælp af automatiserede statistiske metoder.

Manuel funktionsselektion

Der er en række grunde til, at man måske ønsker at fjerne en funktion fra træningsfasen. Disse omfatter:

  • En funktion, der er stærkt korreleret med en anden funktion i datasættet. Hvis dette er tilfældet, giver begge funktioner i det væsentlige de samme oplysninger. Nogle algoritmer er følsomme over for korrelerede funktioner.
  • Funktioner, der giver få eller ingen oplysninger. Et eksempel kunne være en feature, hvor de fleste eksempler har den samme værdi.
  • Features, der har ringe eller ingen statistisk sammenhæng med målvariablen.

Features kan vælges gennem dataanalyse, der udføres enten før eller efter træning af en model. Her er et par almindelige teknikker til manuelt at udføre funktionsudvælgelse.

Korrelationsplot

En manuel teknik til at udføre funktionsudvælgelse er at oprette en visualisering, som plotter korrelationsmålet for hver funktion i datasættet. Seaborn er et godt pythonbibliotek, der kan bruges til dette. Nedenstående kode producerer et korrelationsplot for funktioner i brystkræftdatasættet, der er tilgængeligt fra scikit-learn API.

# 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)

I den resulterende visualisering kan vi identificere nogle funktioner, der er tæt korreleret, og vi vil måske derfor fjerne nogle af disse, og nogle funktioner, der har meget lav korrelation med målvariablen, som vi måske også ønsker at fjerne.

Funktionernes betydning

Når vi har trænet en model, er det muligt at anvende yderligere statistisk analyse for at forstå, hvilke virkninger funktionerne har på modellens output, og ud fra dette afgøre, hvilke funktioner der er mest nyttige.

Der er en række værktøjer og teknikker til rådighed til at bestemme feature-betydningen. Nogle teknikker er unikke for en bestemt algoritme, mens andre kan anvendes på en lang række modeller og er kendt som model agnostiske.

For at illustrere feature importances vil jeg bruge den indbyggede feature importances-metode for en random forest-klassifikator i scikit-learn. Koden nedenfor tilpasser klassifikatoren og skaber et plot, der viser feature importances.

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()

Dette giver en god indikator for de features, der har en indvirkning på modellen, og dem, der ikke har det. Vi kan vælge at fjerne nogle af de mindre vigtige features efter at have analyseret dette diagram.

Automatisk udvælgelse af features

Der findes en række mekanismer, der anvender statistiske metoder til automatisk at finde det optimale sæt af features til brug i en model. Scikit-learn-biblioteket indeholder en række metoder, der giver en meget enkel implementering af mange af disse teknikker.

Variansgrænse

I statistik er varians den kvadrerede afvigelse af en variabel fra dens gennemsnit, med andre ord, hvor langt er datapunkterne spredt ud for en given variabel?

Sæt, at vi opbygger en maskinlæringsmodel til at opdage brystkræft, og datasættet havde en boolsk variabel for køn. Dette datasæt vil sandsynligvis bestå næsten udelukkende af ét køn, og derfor vil næsten alle datapunkterne være 1. Denne variabel ville have ekstremt lav varians og ville slet ikke være nyttig til forudsigelse af målvariablen.

Dette er en af de mest enkle tilgange til udvælgelse af funktioner. Scikit-learn-biblioteket har en metode kaldet VarianceThreshold . Denne metode tager en tærskelværdi, og når den tilpasses et feature-sæt, vil den fjerne alle features under denne tærskelværdi. Standardværdien for tærskelværdien er 0, og dette vil fjerne alle funktioner med nul varians, eller med andre ord hvor alle værdier er ens.

Lad os anvende denne standardindstilling på det datasæt for brystkræft, som vi brugte tidligere, for at finde ud af, om der fjernes funktioner.

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)

Opdatet viser, at de transformerede funktioner har samme form, så alle funktioner har mindst en vis varians.

Univariate feature selection

Univariate feature selection anvender univariate statistiske tests på funktioner og udvælger dem, der klarer sig bedst i disse tests. Univariate tests er tests, som kun omfatter én afhængig variabel. Dette omfatter variansanalyse (ANOVA), lineære regressioner og t-test af middelværdier.

Scikit-learn indeholder en række metoder til udvælgelse af funktioner, der anvender en række forskellige univariate tests for at finde de bedste funktioner til maskinlæring.

Vi vil anvende en af disse, kendt som SelectKBest, på datasættet for brystkræft. Denne funktion udvælger de k bedste funktioner på grundlag af en univariat statistisk test. Standardværdien for k er 10, så 10 funktioner vil blive beholdt, og standardtesten er f_classif.

F_classif-testen anvendes til kategoriske mål, som det er tilfældet for datasættet for brystkræft. Hvis målet er en kontinuerlig variabel, bør f_regression anvendes. Testen f_classif er baseret på den statistiske test Analysis of Variance (ANOVA), som sammenligner middelværdierne for en række grupper, eller i vores tilfælde funktioner, og afgør, om nogen af disse middelværdier er statistisk signifikante fra hinanden.

Nedenstående kode anvender denne funktion med standardparametrene på datasættet for brystkræft.

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)

Opdatet viser, at funktionen har reduceret funktionerne til 10 funktioner. Vi kan eksperimentere med forskellige værdier for k og træne flere modeller, indtil vi finder det optimale antal funktioner.

Rekursiv fjernelse af funktioner

Denne metode udfører modeltræning på et gradvist mindre og mindre sæt funktioner. Hver gang beregnes funktionernes importanser eller koefficienter, og de funktioner, der har de laveste scorer, fjernes. Ved afslutningen af denne proces er det optimale sæt af funktioner kendt.

Da denne metode indebærer gentagne gange at træne en model, skal vi først instantiere en estimator. Denne metode fungerer også bedst, hvis dataene først er skaleret, så jeg har tilføjet et forbehandlingstrin, der normaliserer funktionerne.

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_)

Opdatet herunder viser de funktioner, der er blevet valgt, og deres rangordning.

Feature engineering

Hvor målet med featureudvælgelse er at reducere dimensionaliteten i et datasæt ved at fjerne unødvendige features, handler feature engineering om at omdanne eksisterende features og konstruere nye features for at forbedre en models ydeevne.

Der er tre hovedårsager til, at vi kan have behov for at udføre feature engineering for at udvikle en optimal model.

  1. Funktioner kan ikke bruges i deres rå form. Dette omfatter funktioner som f.eks. datoer og tidspunkter, hvor en maskinlæringsmodel kun kan gøre brug af de oplysninger, der er indeholdt i dem, hvis de omdannes til en numerisk repræsentation, f.eks. en heltalsrepræsentation af ugedagen.
  2. Funktioner kan bruges i deres rå form, men de oplysninger, der er indeholdt i funktionen, er stærkere, hvis dataene aggregeres eller repræsenteres på en anden måde. Et eksempel her kunne være en feature, der indeholder en persons alder, hvor en aggregering af alderen i spande eller bins kan repræsentere forholdet til målet bedre.
  3. En feature i sig selv har ikke et tilstrækkeligt stærkt statistisk forhold til målet, men når den kombineres med en anden feature, har den et meningsfuldt forhold. Lad os sige, at vi har et datasæt, der har en række funktioner baseret på kredithistorik for en gruppe af kunder og et mål, der angiver, om de har misligholdt et lån. Lad os antage, at vi har et lånebeløb og en lønværdi. Hvis vi kombinerer disse til en ny feature kaldet “lån til lønforhold”, kan det give flere eller bedre oplysninger end disse features alene.

Manual feature engineering

Feature engineering kan udføres gennem dataanalyse, intuition og domæneviden. Ofte udføres lignende teknikker som dem, der anvendes til manuel featureudvælgelse.

For eksempel indikerer observation af, hvordan features korrelerer med målet, og hvordan de klarer sig med hensyn til featurebetydning, hvilke features der skal udforskes yderligere med hensyn til analyse.

Hvis vi vender tilbage til eksemplet med lånedatasættet, så lad os forestille os, at vi har en aldersvariabel, som ud fra et korrelationsdiagram ser ud til at have et vist forhold til målvariablen. Vi kan finde ud af, når vi analyserer dette forhold yderligere, at de, der misligholder lånet, er skævt fordelt på en bestemt aldersgruppe. I dette tilfælde kan vi måske udvikle en funktion, der udvælger denne aldersgruppe, og det kan give bedre oplysninger til modellen.

Automatiseret funktionsteknik

Manuel funktionsteknik kan være en ekstremt tidskrævende proces og kræver en stor mængde menneskelig intuition og domæneviden for at få det rigtige resultat. Der findes værktøjer, som har mulighed for automatisk at syntetisere et stort antal nye funktioner.

Det pythonbibliotek Featuretools er et eksempel på et værktøj, som kan udføre automatiseret feature engineering på et datasæt. Lad os installere dette bibliotek og gennemgå et eksempel på automatiseret feature engineering på datasættet for brystkræft.

Featuretools kan installeres via pip.

pip install featuretools

Featuretools er designet til at arbejde med relationelle datasæt (tabeller eller dataframes, der kan forbindes sammen med en unik identifikator). Featuretools-biblioteket henviser til hver tabel som en enhed.

Datasættet for brystkræft består kun af én enhed, men vi kan stadig bruge featuretools til at generere funktionerne. Vi skal dog først oprette en ny kolonne, der indeholder et unikt id. Nedenstående kode bruger indekset i datarammen til at oprette en ny id-kolonne.

data = data.index + 1

Næst importerer vi featuretools og opretter entitetssættet.

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

Dette giver følgende output.

Vi kan nu bruge biblioteket til at udføre feature-syntese.

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

Featuretools har oprettet 31 nye funktioner.

Vi kan se alle de nye funktioner ved at køre følgende.

feature_matrix.columns

Skriv et svar

Din e-mailadresse vil ikke blive publiceret.