Churn prediction

figcaption > bilde av mantas hesthaven på unsplash

customer churn, også kjent som kundeavbrudd, oppstår når kundene slutter å gjøre forretninger med et selskap. Selskapene er interessert i å identifisere segmenter av disse kundene fordi prisen for å anskaffe en ny kunde er vanligvis høyere enn å beholde den gamle. For Eksempel, Hvis Netflix visste et segment av kunder som var i fare for å churning, kunne De proaktivt engasjere dem med spesialtilbud i stedet for bare å miste dem.

i dette innlegget vil vi lage en enkel customer churn prediction modell ved Hjelp Av Telco Customer Churn datasett. Vi valgte en beslutning treet til modell kvernet kunder, pandaer for data knaser og matplotlib for visualiseringer. Vi vil gjøre alt dette ovenfor I Python.
koden kan brukes med et annet datasett med noen få mindre justeringer for å trene baseline-modellen. Vi gir også noen referanser og gir ideer til nye funksjoner og forbedringer.

du kan kjøre denne koden ved å laste ned Denne Jupyter bærbare.

Her er noen linker som kan interessere deg:

- Labeling and Data Engineering for Conversational AI and Analytics- Data Science for Business Leaders - Intro to Machine Learning with PyTorch - Become a Growth Product Manager - Deep Learning (Adaptive Computation and ML series) - Free skill tests for Data Scientists & Machine Learning Engineers

Noen av linkene ovenfor er affiliate linker og hvis du går gjennom dem for å foreta et kjøp jeg vil tjene en kommisjon. Husk at jeg kobler kurs på grunn av deres kvalitet og ikke på grunn av provisjonen jeg mottar fra kjøpene dine.

vi bruker pandaer til å lese datasettet og preprosessere det. Telco datasett har en kunde per linje med mange kolonner (funksjoner). Det er ikke noen rader med alle manglende verdier eller duplikater(dette skjer sjelden med virkelige datasett). Det er 11 prøver som Har Totaltladninger satt til»», som virker som en feil i dataene. Vi fjerner disse prøvene og setter typen til numerisk (float).

df = pd.read_csv('data/WA_Fn-UseC_-Telco-Customer-Churn.csv')df = df.dropna(how=”all”) # remove samples with all missing values
df = df # remove duplicatestotal_charges_filter = df.TotalCharges == " "
df = df
df.TotalCharges = pd.to_numeric(df.TotalCharges)

div>

første få prøver i telco customer churn datasett

utforskende dataanalyse

vi har 2 typer funksjoner i datasettet: kategorisk (to eller flere verdier og uten noen ordre) og numerisk. De fleste funksjonsnavnene er selvforklarende, bortsett fra:

  • Partner: om kunden har en partner eller Ikke (Ja, Nei),
  • Avhengige: Om kunden har pårørende eller ikke (Ja, Nei),
  • OnlineBackup: om kunden har en online backup Eller ikke (Ja, Nei, nei internett-tjeneste),
  • tenure: antall måneder kunden har oppholdt seg hos selskapet,
  • MonthlyCharges: beløpet belastet kunden månedlig,
  • TotalCharges: det totale beløpet belastet kunden.

det er 7032 kunder i datasettet og 19 funksjoner uten customerID (ikke-informativ) og Churn kolonne (målvariabel). De fleste kategoriske funksjonene har 4 eller mindre unike verdier.

datasett oppsummering

vi kombinerer funksjoner i to lister slik at vi kan analysere dem i fellesskap.

categorical_features = 
numerical_features =
target = "Churn”

distribusjon Av Numeriske funksjoner

numeriske oppsummeringsteknikker (gjennomsnitt, standardavvik, etc.) ikke vis oss pigger, former for distribusjoner, og det er vanskelig å observere uteliggere med det. Det er derfor vi bruker histogrammer.

df.describe()

/div>

sammendrag av numeriske funksjoner

ved første øyekast er det ingen avvik i dataene. Ingen datapunkt er koblet fra distribusjon eller for langt fra middelverdien. For å bekrefte at vi må beregne interquartile range (IQR) og vise at verdiene for hver numerisk funksjon er innenfor 1.5 IQR fra første og tredje kvartil.

vi kunne konvertere numeriske funksjoner til ordinære intervaller. For eksempel, ansiennitet er numerisk, men ofte vi ikke bryr seg om små numeriske forskjeller og i stedet gruppe ansiennitet til kunder med kort, mellomlang og lang sikt ansiennitet. En grunn til å konvertere det ville være å redusere støy, ofte små svingninger er bare støy.

df.hist(bins=30, figsize=(10, 7))

histogrammer av numeriske funksjoner

vi ser på fordelinger av numeriske funksjoner i forhold til målvariabelen. Vi kan observere at jo større Totalavgifter og tenure er jo mindre er sannsynligheten for churn.

fig, ax = plt.subplots(1, 3, figsize=(14, 4))
df.hist(bins=30, color="blue", alpha=0.5, ax=ax)
df.hist(bins=30, color="red", alpha=0.5, ax=ax)
numeriske funksjoner i forhold til målvariabelen

kategoriske funksjonsfordeling

for å analysere kategoriske funksjoner bruker vi stolpediagrammer. Vi ser At Eldre og kunder uten telefontjeneste er mindre representert i dataene.

ROWS, COLS = 4, 4
fig, ax = plt.subplots(ROWS, COLS, figsize=(18, 18))
row, col = 0, 0
for i, categorical_feature in enumerate(categorical_features):
if col == COLS - 1:
row += 1
col = i % COLS
df.value_counts().plot('bar', ax=ax).set_title(categorical_feature)

div>

distribusjon av kategoriske funksjoner

det neste trinnet er å se på kategoriske funksjoner i forhold til målvariabelen. Vi gjor dette bare for kontraktsfunksjonen. Brukere som har en måned-til-måned kontrakt er mer sannsynlig å churn enn brukere med langsiktige kontrakter.

feature = ‘Contract’
fig, ax = plt.subplots(1, 2, figsize=(14, 4))
df.value_counts().plot(‘bar’, ax=ax).set_title(‘not churned’)
df.value_counts().plot(‘bar’, ax=ax).set_title(‘churned’)

div> kontraktfunksjon i forhold til målvariabelen

målvariabel distribusjon

målvariabel distribusjon viser at vi har å gjøre med et ubalansert problem, da det er mange flere ikke-churned som churned brukere. Modellen ville oppnå høy nøyaktighet, da det for det meste ville forutsi flertallsklassebrukere som ikke churn i vårt eksempel.Få ting vi kan gjøre for å minimere innflytelsen av ubalanserte datasett: – resample data (ubalansert-lær), – samle flere prøver, – bruk presisjon og tilbakekalling som nøyaktighetsmålinger.

df.value_counts().plot('bar').set_title('churned')

div

target variable distribution

funksjoner

telco datasett er allerede gruppert etter customerid, så det er vanskelig å legge til nye funksjoner. Når vi jobber med churn-prediksjonen, får vi vanligvis et datasett som har en oppføring per kundeøkt (kundeaktivitet på en bestemt tid). Da kan vi legge til funksjoner som:

  • antall økter før du kjøper noe,
  • gjennomsnittlig tid per økt,
  • tidsforskjell mellom økter (hyppig eller mindre hyppig kunde),
  • er kun kunde i ett land.

Noen ganger har vi til og med kundehendelsesdata, som gjør det mulig for oss å finne mønstre av kundeatferd i forhold til utfallet (churn).

Koding funksjoner

for å forberede datasettet for modellering churn, må vi kode kategoriske funksjoner til tall. Dette betyr koding «Ja», » Nei » til 0 og 1 slik at algoritmen kan fungere med dataene. Denne prosessen kalles onehot koding.

en varm kodede kategoriske funksjoner

klassifikator

vi bruker sklearn, et maskinlæringsbibliotek i python, for å lage en klassifikator.
den sklearn måten er å bruke rørledninger som definerer funksjonen behandling og klassifikator. I vårt eksempel tar rørledningen et datasett i inngangen, det preprosesserer funksjoner og trener klassifikatoren.
når trent, tar det samme inngang og returnerer spådommer i utgangen.

i rørledningen behandler vi separat kategoriske og numeriske funksjoner. Vi onehot kode kategoriske funksjoner og skala numeriske funksjoner ved å fjerne gjennomsnittet og skalere dem til enhet varians.
vi valgte en beslutning tre modell på grunn av sin tolkbarhet og satt maks dybde til 3 (vilkårlig).

pipeline tar et datasett i inngangen, det preprosesserer funksjoner og trener klassifikatoren

trening av modellen

vi deler datasettet for å trene (75% prøver) og teste (25% prøver).
vi trener (fit) rørledningen og gjøre spådommer. Med classification_report beregner vi presisjon og tilbakekalling med faktiske og forventede verdier.

from sklearn.model_selection import train_test_splitdf_train, df_test = train_test_split(df, test_size=0.25, random_state=42)pipeline.fit(df_train, df_train)
pred = pipeline.predict(df_test)

Testing av modellen

med classification_report beregner vi presisjon og tilbakekalling med faktiske og forventede verdier.

for klasse 1 (churned brukere) modell oppnår 0,67 presisjon og 0,37 tilbakekalling. Presisjon forteller oss hvor mange churned brukere gjorde vår klassifikator spådd riktig. På den andre siden, husker fortelle oss hvor mange kvernet brukere det savnet.

i lekmannsbetingelser er klassifikatoren ikke veldig nøyaktig for churned brukere.

from sklearn.metrics import classification_reportprint(classification_report(df_test, pred))

div>

klassifiseringsrapport for decision tree model

model interpretability

decision tree model bruker kontrakt, monthlycharges, internetservice, totalcharges og tenure-funksjoner for å ta en beslutning om en kunde vil churn eller ikke. Disse funksjonene skille kvernet kunder fra andre godt basert på delt kriteriene i beslutningstreet.

hver kundeprøve går gjennom treet og den endelige noden gir prediksjonen.
For eksempel, hvis Contract_Month-to-month er:

  • lik 0, fortsett å krysse treet Med Ekte gren,
  • lik 1, fortsett å krysse treet Med Falsk gren,
  • ikke definert, det sender ut klassen 0.

Dette er en flott tilnærming for å se hvordan modellen tar en beslutning eller om noen funksjoner snek seg i vår modell som ikke burde være der.

decision tree model

videre lesing

  1. håndtering klasse ubalanse i kunde churn prediksjon — hvordan kan vi bedre håndtere klasse ubalanse i churn prediksjon.
  2. A Survey on Customer Churn Prediction using Machine Learning Techniques] – dette papiret vurderer de mest populære maskinlæringsalgoritmer som brukes av forskere for å forutsi churn.
  3. Telco kunde churn På Kaggle-Churn analyse På Kaggle.WTTE-RNN-Hackless-churn-modellering-Hendelsesbasert churn prediksjon.

Før du går

Følg Meg På Twitter, der jeg regelmessig tweet Om Datavitenskap og Maskinlæring.

Bilde av courtney hedger på unsplash

Legg igjen en kommentar

Din e-postadresse vil ikke bli publisert.