Opi kouluttamaan päätöspuun malli Kirnun ennustamiseen.
customer churn, joka tunnetaan myös nimellä customer nuutuminen, tapahtuu, kun asiakkaat lopettavat asioimisen yrityksen kanssa. Yritykset ovat kiinnostuneita tunnistamaan näiden asiakkaiden segmenttejä, koska uuden asiakkaan hankkimisesta peritään yleensä korkeampi hinta kuin vanhan asiakkaan säilyttämisestä. Esimerkiksi, jos Netflix tiesi segmentti asiakkaita, jotka olivat vaarassa myllerrys he voisivat ennakoivasti sitoutua erikoistarjouksia sen sijaan, että vain menettää ne.
tässä viestissä luomme yksinkertaisen asiakkaan ennustusmallin käyttäen Telco: n Asiakastoimeksiantoaineistoa. Valitsimme päätöspuun mallintamaan kirnuilevia asiakkaita, pandat datan murskaamiseen ja matplotlib visualisointiin. Teemme kaiken edellä mainitun Pythonilla.
koodia voidaan käyttää toisen aineiston kanssa muutamin pienin muutoksin perusvaatimusmallin kouluttamiseksi. Tarjoamme myös muutamia suosituksia ja antaa ideoita uusia ominaisuuksia ja parannuksia.
voit suorittaa tämän koodin lataamalla tämän Jupyter-muistikirjan.
tässä muutama linkki, jotka saattavat kiinnostaa:
- 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
osa yllä olevista linkeistä on affiliate-linkkejä ja jos käyt niitä läpi tehdäksesi ostoksen, ansaitsen provision. Muista, että linkitän kursseja niiden laadun vuoksi eikä siksi, että saan provision ostoksistasi.
käytämme pandoja aineiston lukemiseen ja esikäsittelyyn. Telco dataset on yksi asiakas per rivi useita sarakkeita (ominaisuudet). Ei ole mitään rivejä, joissa on kaikki puuttuvat arvot tai kaksoiskappaleet (näin harvoin tapahtuu reaalimaailman datajoukoissa). On 11 näytettä, joiden kokonaishinnat on asetettu arvoon””, mikä tuntuu virheeltä tiedoissa. Poistamme näytteet ja asetamme tyypin numeeriseksi (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)
eksploratiivinen tietoanalyysi
aineistossa on 2 erilaista ominaisuutta: kategorinen (kaksi tai useampi arvo ja ilman järjestystä) ja numeerinen. Useimmat ominaisuusnimet ovat itsestään selviä, paitsi:
- Partner: onko asiakkaalla kumppania vai ei (kyllä, ei),
- : onko asiakkaalla huollettavia vai ei (kyllä, ei),
- OnlineBackup: onko asiakkaalla online-varmuuskopiointi vai ei (kyllä, ei, ei internet-palvelua),
- hallintaoikeus: niiden kuukausien lukumäärä, joina asiakas on oleskellut yrityksessä,
- MonthlyCharges: asiakkaalta kuukausittain veloitettu summa,
- kokonaismaksut: asiakkaalta veloitettu kokonaismäärä.
aineistossa on 7032 asiakasta ja 19 ominaisuutta ilman asiakasrekisteriä (ei-informatiivinen) ja Kirnusaraketta (kohdemuuttuja). Useimmat kategoriset ominaisuudet ovat 4 tai vähemmän ainutlaatuisia arvoja.
yhdistämme ominaisuudet kahdeksi listaksi, jotta voimme analysoida niitä yhdessä.
categorical_features =
numerical_features =
target = "Churn”
numeeristen ominaisuuksien jakauma
numeeristen yhteenvetotekniikoiden keskiarvo, keskihajonta jne.) älä näytä meille piikkejä, jakaumien muotoja ja sen kanssa on vaikea havaita poikkeamia. Siksi käytämme histogrammeja.
df.describe()
ensisilmäyksellä tiedoissa ei ole poikkeamia. Mikään datapiste ei irtoa jakaumasta tai ole liian kaukana keskiarvosta. Vahvistaa, että meidän olisi laskettava interquartile range (IQR) ja osoittaa, että arvot kunkin numeerinen ominaisuus ovat sisällä 1.5 IQR ensimmäisestä ja kolmannesta kvartiili.
voisimme muuntaa numeeriset ominaisuudet ordinaalisiksi intervalleiksi. Esimerkiksi hallintaoikeus on numeerinen, mutta usein emme välitä pienistä numeerisista eroista, vaan ryhmittelemme hallintaoikeuden lyhyen, keskipitkän ja pitkän aikavälin hallintaoikeuden omaaville asiakkaille. Yksi syy muuntaa se olisi vähentää melua, usein pienet vaihtelut ovat vain melua.
df.hist(bins=30, figsize=(10, 7))
tarkastelemme numeeristen piirteiden jakaumia suhteessa kohdemuuttujaan. Voimme todeta, että mitä suuremmat kokonaishinnat ja hallintaoikeudet ovat, sitä pienempi on kirnuamisen todennäköisyys.
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)
kategorisen ominaisuusjakauman
kategoristen ominaisuuksien analysointiin käytämme viivakaavioita. Havaitsemme, että ikäihmiset ja asiakkaat, joilla ei ole puhelinpalvelua, ovat vähemmän edustettuina tiedoissa.
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)
seuraava vaihe on tarkastella kategorisia piirteitä suhteessa tavoitemuuttujaan. Teemme tämän vain sopimusominaisuuden vuoksi. Käyttäjät, joilla on kuukausi-to-kuukausi sopimus, ovat todennäköisemmin Kirnu kuin käyttäjät, joilla on pitkäaikainen sopimus.
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’)
tavoitemuuttujan jakauma
tavoitemuuttujan jakauma osoittaa, että kyseessä on epätasapainoinen ongelma, sillä kirnuttamattomia käyttäjiä on paljon enemmän. Malli saavuttaisi korkean tarkkuuden, koska se enimmäkseen ennustaisi enemmistön luokan käyttäjille, jotka eivät Kirnu esimerkissämme.
harvoja asioita, joita voimme tehdä epätasapainoisen aineiston vaikutuksen minimoimiseksi:
– resample data (epätasapainoinen-Opi),
– kerää lisää näytteitä,
– Käytä tarkkuutta ja takaisinkutsua tarkkuusmittareina.
df.value_counts().plot('bar').set_title('churned')
ominaisuudet
telco-tietojoukko on jo ryhmitelty asiakkaan mukaan, joten uusien ominaisuuksien lisääminen on vaikeaa. Kun työskentelemme Kirnun ennustus saamme yleensä tietojoukko, joka on yksi merkintä per asiakas istunto (asiakkaan toiminta tiettynä aikana). Sitten voitaisiin lisätä ominaisuuksia, kuten:
- istuntojen määrä ennen jonkin ostamista,
- keskimääräinen aika per istunto,
- Aikaero istuntojen välillä (usein tai harvemmin asiakas),
- on asiakas vain yhdessä maassa.
joskus meillä on jopa asiakastapahtumatietoa, jonka avulla voimme löytää asiakaskäyttäytymisen malleja suhteessa lopputulokseen (churn).
Koodausominaisuudet
valmistellaksemme aineiston mallintamista varten meidän on koodattava kategoriset ominaisuudet numeroihin. Tämä tarkoittaa koodausta ”Kyllä”, ” Ei ” 0: lle ja 1: lle, jotta algoritmi voi toimia datan kanssa. Tätä prosessia kutsutaan onehot-koodaukseksi.
luokittelija
käytämme sklearnia, koneoppimisen kirjastoa Pythonissa, luokittajan luomiseen.
sklearnin tapa on käyttää piirteiden käsittelyä ja luokittelijaa määritteleviä putkistoja. Esimerkissämme putki ottaa datajoukko input, se esikäsittelee ominaisuuksia ja kouluttaa luokittelija.
koulutettuna se ottaa saman syötön ja palauttaa ennusteita tuotoksessa.
putkistossa käsitellään erikseen kategorisia ja numeerisia ominaisuuksia. Emme voi koodata kategorisia ominaisuuksia ja skaalata numeerisia ominaisuuksia poistamalla keskiarvon ja skaalaamalla ne yksikkövarianssiksi.
valitsimme ratkaisupuumallin sen tulkittavuuden vuoksi ja asetimme maksimisyvyyden 3: een (mielivaltaisesti).
mallin koulutus
jaamme aineiston koulutettavaksi (75% näytteitä) ja testattavaksi (25% näytteitä).
me treenaamme (fit) putkea ja teemme ennustuksia. Classification_report laskemme tarkkuuden ja takaisinkutsun todellisilla ja ennustetuilla arvoilla.
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)
testaamalla mallia
luokitus_raportilla laskemme tarkkuuden ja takaisinkutsun todellisilla ja ennustetuilla arvoilla.
luokan 1 (kirnuilla käyttäjät) mallilla saavutetaan 0,67 tarkkuutta ja 0,37 takaisinkutsua. Tarkkuus kertoo, kuinka monta kirnuilevaa käyttäjää luokittelijamme ennusti oikein. Toisella puolella, muistaa kertoa meille, kuinka monta kirnuili käyttäjiä se jäi.
maallikkotermein luokittelija ei ole kovin tarkka kirnuille käyttäjille.
from sklearn.metrics import classification_reportprint(classification_report(df_test, pred))
malli tulkittavuus
päätöksentekopuumalli käyttää sopimus -, kuukausiharkinta -, internetpalvelu -, totalcharges-ja tenure-ominaisuuksia päätöksen tekemiseen, jos asiakas kirnuaa vai ei. Nämä ominaisuudet erottavat kirnusivat asiakkaat muista hyvin perusteella split kriteerit päätöksentekopuussa.
jokainen asiakasotos kulkee puun läpi ja lopullinen solmu antaa ennusteen.
esimerkiksi, jos Contract_Month-to-month on:
- yhtä suuri kuin 0, jatka puun läpikulkua aidolla oksalla,
- yhtä suuri kuin 1, jatka puun läpikulkua Valehaaralla,
- Ei määritelty, se tuottaa luokan 0.
Tämä on hieno lähestymistapa nähdä, miten malli tekee päätöksen tai jos meidän malliin hiipii ominaisuuksia, joita ei pitäisi olla.
further reading
- handling class epätasapaino in customer chorn prediction — how can we better handle class epätasapaino in chorn prediction.
- a Survey on Customer Churn Prediction using Machine Learning Techniques] — tässä artikkelissa tarkastellaan suosituimpia koneoppimisen algoritmeja, joita tutkijat käyttävät churnin ennustamiseen.
- Telco customer churn on Kaggle — Churn-analyysi Kaggle.
- WTTE-RNN-Hackless-churn-modeling — Event based churn prediction.
ennen kuin menet
Seuraa minua Twitterissä, jossa twiittaan säännöllisesti Datatieteestä ja koneoppimisesta.