predikce Churn

Foto Mantas Hesthaven na Unsplash

Zákazník máselnice, také známý jako zákazník opotřebení, dochází, když zákazníci přestanou obchodovat s firmou. Společnosti mají zájem identifikovat segmenty těchto zákazníků, protože cena za získání nového zákazníka je obvykle vyšší než zachování starého. Například, pokud Netflix znal segment zákazníků, kterým hrozilo víření, mohli by je proaktivně zapojit do speciálních nabídek místo toho, aby je jednoduše ztratili.

v tomto příspěvku vytvoříme jednoduchý model predikce churn zákazníků pomocí datové sady Telco Customer Churn. Vybrali jsme rozhodovací strom pro modelování zákazníků, pandy pro křupání dat a matplotlib pro vizualizace. To vše uděláme výše v Pythonu.
kód lze použít s jiným datovým souborem s několika drobnými úpravami pro trénování základního modelu. Poskytujeme také několik referencí a dáváme nápady na nové funkce a vylepšení.

tento kód můžete spustit stažením tohoto notebooku Jupyter.

Zde je několik odkazů, které by vás mohly zajímat:

- 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

Některé z výše uvedené odkazy jsou affiliate odkazy, a pokud jste jít přes ně k nákupu získám provizi. Mějte na paměti, že propojuji kurzy kvůli jejich kvalitě a ne kvůli provizi, kterou dostávám z vašich nákupů.

používáme pandy ke čtení datové sady a jejímu předzpracování. Telco dataset má jednoho zákazníka na řádek s mnoha sloupci (funkce). Neexistují žádné řádky se všemi chybějícími hodnotami nebo duplikáty(to se zřídka stává u datových souborů v reálném světě). Existuje 11 vzorků, které mají Celkemnabíjky nastavené na“ „, což se jeví jako chyba v datech. Odebereme tyto vzorky a nastavíme typ na číselný (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)

Prvních pár vzorků v Telco Zákazník Máselnice dataset

Průzkumné Analýzy Dat

Máme 2 typy funkcí v dataset: kategorické (dvě nebo více hodnot, a to bez jakéhokoliv pořadí) a numerické. Většina názvů funkcí je samovysvětlující, s výjimkou:

  • Partner: zda má zákazník partnera nebo ne (ano, ne),
  • závislé osoby: zda má zákazník závislé, nebo ne (Ano, Ne),
  • OnlineBackup: Zda zákazník má on-line zálohování, nebo ne (Ano, ne, Ne internet service),
  • působení: počet měsíců zákazník zůstal u společnosti,
  • MonthlyCharges: částka, kterou hradí zákazník měsíční,
  • TotalCharges: celková částka účtována k zákazníkovi.

v datovém souboru je 7032 zákazníků a 19 funkcí bez customerID (neinformativní) a Churn column (Cílová proměnná). Většina kategorických funkcí má 4 nebo méně jedinečné hodnoty.

Dataset Shrnutí

Jsme se spojit vlastnosti do dvou seznamů tak, že můžeme analyzovat je společně.

categorical_features = 
numerical_features =
target = "Churn”

Číselná distribuční funkce

Číselná sumarizace metod (průměr, směrodatná odchylka, atd.) neukazujte nám hroty, tvary distribucí a je těžké s nimi pozorovat odlehlé hodnoty. To je důvod, proč používáme histogramy.

df.describe()

Shrnutí numerické vlastnosti

Na první pohled, tam nejsou žádné odlehlé hodnoty v datech. Žádný datový bod není odpojen od distribuce nebo příliš daleko od střední hodnoty. Abychom potvrdili, že bychom museli vypočítat mezikvartilní rozsah (IQR) a ukázat, že hodnoty každého numerického prvku jsou v rámci 1,5 IQR z prvního a třetího kvartilu.

mohli bychom převést číselné znaky na ordinální intervaly. Například držba je číselné, ale často nemusíme se starat o malé číselné rozdíly a místo toho se skupina, působení na zákazníky s krátkodobém, střednědobém a dlouhodobém horizontu funkčního období. Jedním z důvodů, proč jej převést, by bylo snížení hluku, často malé výkyvy jsou jen hluk.

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

Histogramy číselných funkcí,

podíváme se na rozdělení numerických funkcí ve vztahu k cílové proměnné. Můžeme pozorovat, že čím větší jsou poplatky a držba, tím menší je pravděpodobnost 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)

Numerické funkce ve vztahu k cílové proměnné

Kategorické distribuční funkce

analyzovat kategorické vlastnosti, používáme sloupcové grafy. Pozorujeme, že senioři a zákazníci bez telefonních služeb jsou v datech méně zastoupeni.

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)

Distribuce kategorické vlastnosti

další krok je podívat se na kategorické vlastnosti ve vztahu k cílové proměnné. Děláme to pouze pro funkci smlouvy. Uživatelé, kteří mají měsíční smlouvu, častěji chrlí než uživatelé s dlouhodobými smlouvami.

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

Smlouvu funkce ve vztahu k cílové proměnné

Cílové proměnné distribuce

Cílové proměnné distribuce ukazuje, že máme co do činění s nevyváženým problém, protože existuje mnoho více non-žaludek jako žaludek uživatelů. Model by dosáhl vysoké přesnosti, protože by většinou předpovídal většinové uživatele třídy, kteří se v našem příkladu nezachytili.

pár věcí, které můžeme udělat, aby se minimalizoval vliv nevyvážené datové sady:
– převzorkování dat (nevyvážený-učit se),
– Sbírat více vzorků,
– použijte přesnost a vyvolání jako metriky přesnosti.

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

Cílové proměnné distribuce

Vlastnosti

Telco dataset je již seskupeny podle kódzákazníka, takže je těžké přidat nové funkce. Při práci na predikci churn obvykle získáme dataset, který má jednu položku na relaci zákazníka (aktivita zákazníka v určitém čase). Pak jsme mohli přidat funkce, jako je:

  • počet návštěv před nákupem něco,
  • průměrný čas na návštěvu,
  • časový rozdíl mezi zasedáními (časté nebo méně časté zákazníka),
  • je zákazník pouze v jedné zemi.

někdy máme dokonce data o zákaznických událostech, což nám umožňuje najít vzorce chování zákazníků ve vztahu k výsledku (churn).

kódovací funkce

abychom připravili datovou sadu pro modelování churn, musíme kódovat kategorické funkce do čísel. To znamená kódování „ano“,“ ne “ na 0 a 1, aby algoritmus mohl pracovat s daty. Tento proces se nazývá onehot kódování.

Jeden hot kódované kategorické vlastnosti

Třídění

použijeme sklearn, Strojové Učení knihovna v jazyce Python, vytvořit klasifikátor.
Sklearn způsobem je použití potrubí, které definují zpracování prvků a klasifikátor. V našem příkladu potrubí vezme datovou sadu do vstupu, předzpracuje vlastnosti a trénuje klasifikátor.
když trénuje, bere stejný vstup a vrací předpovědi ve výstupu.

v potrubí zpracováváme Samostatně kategorické a numerické prvky. My onehot kódovat kategorické rysy a měřítko numerické rysy odstraněním střední a škálování je jednotkové rozptylu.
pro jeho interpretovatelnost jsme zvolili model rozhodovacího stromu a maximální hloubku jsme nastavili na 3 (libovolně).

potrubí trvá údajů v zadání, to předzpracovává vlastnosti a vlaky třídění

Školení modelu

rozdělit datový soubor na vlak (75% vzorků) a testovací (25% vzorků).
trénujeme (fit) potrubí a děláme předpovědi. S classification_report počítáme přesnost a vyvolání se skutečnými a předpokládanými hodnotami.

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)

Testování modelu

S classification_report počítáme přesnost a připomeňme si, s aktuální a předpovídané hodnoty.

pro třídy 1 (churned users) model dosahuje 0,67 přesnost a 0,37 odvolání. Přesnost nám říká, kolik churned uživatelů náš klasifikátor předpověděl správně. Na druhé straně připomeňme, kolik uživatelů chybělo.

Laicky řečeno, klasifikátor není pro uživatele příliš přesný.

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

Klasifikace zpráva pro Rozhodovací Strom model

Model interpretovatelnost

Rozhodovací Strom model používá Smlouvy, MonthlyCharges, InternetService, TotalCharges, a držby, funkcí, aby se rozhodnutí, pokud zákazník máselnice, nebo ne. Tyto funkce oddělují zákazníky od ostatních dobře na základě rozdělených kritérií ve stromu rozhodnutí.

každý vzorek zákazníka prochází stromem a konečný uzel dává predikci.
například, pokud Contract_Month-na-měsíc je:

  • rovná 0, pokračovat v procházení stromu s Pravou větev,
  • rovno 1, pokračovat v procházení stromu s Falešnými větev,
  • není definováno, výstupy do třídy 0.

To je skvělý přístup, vidět, jak se model dělá rozhodnutí, nebo pokud některé funkce vplížil v našem modelu, že by tam být neměl.

Výklad Rozhodovací strom model

Další čtení

  1. Manipulace třídy nerovnováha v fluktuaci zákazníků predikce — jak můžeme lépe zvládat třídní nerovnosti v máselnice predikce.
  2. a Survey on Customer Churn Prediction using Machine Learning Techniques] – tento článek hodnotí nejoblíbenější algoritmy strojového učení používané výzkumníky pro předpovídání churn.
  3. Telco customer churn on Kaggle-Churn analysis on Kaggle.
  4. WTTE-RNN-Hackless-churn-modelování-Event based churn predikce.

než půjdete

Následujte mě na Twitteru, kde pravidelně tweetuji o datové vědě a strojovém učení.

Foto Courtney Hedger na Unsplash

Napsat komentář

Vaše e-mailová adresa nebude zveřejněna.