dataset SummaryWe combineren functies in twee lijsten zodat we ze gezamenlijk kunnen analyseren.
categorical_features =
numerical_features =
target = "Churn”
numerieke kenmerken distributie
numerieke samenvattende technieken (gemiddelde, standaardafwijking, enz.) Toon ons geen spikes, vormen van distributies en het is moeilijk om uitschieters mee te observeren. Daarom gebruiken we histogrammen.
df.describe()
Op het eerste gezicht zijn er geen uitschieters in de data. Geen enkel gegevenspunt is losgekoppeld van distributie of te ver van de gemiddelde waarde. Om te bevestigen dat we interquartile range (IQR) zouden moeten berekenen en laten zien dat de waarden van elke numerieke functie binnen de 1,5 IQR van het eerste en derde kwartiel liggen.
We kunnen numerieke kenmerken converteren naar ordinale intervallen. Bijvoorbeeld, tenure is numeriek, maar vaak geven we niet om kleine numerieke verschillen en in plaats daarvan groep tenure aan klanten met korte, middellange en lange termijn tenure. Een reden om het om te zetten zou zijn om het lawaai te verminderen, vaak kleine fluctuaties zijn gewoon lawaai.
df.hist(bins=30, figsize=(10, 7))
kijken We naar distributies van numerieke functies in relatie tot de variabele. We kunnen zien dat hoe groter de totale lasten en tenure zijn, hoe minder de kans op Karn is.
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)
Categoriale functie distributie
Om het analyseren van categorische eigenschappen, gebruiken we staafdiagrammen. We zien dat senioren en klanten zonder telefoonservice minder vertegenwoordigd zijn in de gegevens.
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)
De volgende stap is om te kijken naar categorische functies in relatie tot de variabele. We doen dit alleen voor contract functie. Gebruikers die een maand-tot-maand contract hebben meer kans om te churn dan gebruikers met lange termijn contracten.
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’)
variabele distributie
variabele verdeling laat zien dat we te maken hebben met een onevenwichtige probleem, want er zijn veel meer niet-gekarnd als gekarnd gebruikers. Het model zou een hoge nauwkeurigheid te bereiken als het zou meestal voorspellen meerderheid klasse-gebruikers die niet churn in ons voorbeeld.
weinig dingen die we kunnen doen om de invloed van onevenwichtige dataset te minimaliseren:
– resample data (imbalanced-learn),
– collect more samples,
– use precision and recall as accuracy metrics.
df.value_counts().plot('bar').set_title('churned')
Mogelijkheden
Telco dataset is al gegroepeerd per klantnummer dus het is moeilijk om nieuwe functies toe te voegen. Bij het werken aan de churn voorspelling krijgen we meestal een dataset die één ingang per klant sessie heeft (activiteit van de klant in een bepaalde tijd). Dan kunnen we functies toevoegen zoals:
- aantal sessies voordat je iets koopt,
- gemiddelde tijd per sessie,
- tijdsverschil tussen sessies (frequente of minder frequente klant),
- is slechts een klant in één land.
soms hebben we zelfs gegevens over klantgebeurtenissen, waardoor we patronen van klantgedrag kunnen vinden in relatie tot de uitkomst (churn).
coderingsfuncties
om de dataset voor te bereiden voor het modelleren van churn, moeten we categorische functies coderen naar getallen. Dit betekent coderen “ja”, ” nee ” naar 0 en 1, zodat algoritme kan werken met de gegevens. Dit proces wordt onehot codering genoemd.
classifier
we gebruiken sklearn, een machine learning bibliotheek in Python, om een classifier te maken.
De sklearn manier is om pijpleidingen te gebruiken die feature processing en de classifier definiëren. In ons voorbeeld neemt de pijplijn een dataset in de invoer, het preprocess functies en traint de classifier.
wanneer getraind, neemt het dezelfde input en geeft het voorspellingen terug in de output.
in de pijplijn verwerken we afzonderlijk categorische en numerieke kenmerken. We onehot coderen categorische functies en schaal numerieke functies door het verwijderen van het gemiddelde en schalen ze naar eenheid variantie.
We kozen een beslissingsboommodel vanwege zijn interpreteerbaarheid en zetten de maximale diepte op 3 (willekeurig).
de Opleiding de model
We splitsen de dataset te trainen (75% monsters) en test (25% van de monsters). we trainen (passen) de pijplijn en maken voorspellingen. Met classification_report berekenen we precisie en recall met actuele en voorspelde waarden.
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)
het testen van het model
met classification_report berekenen we precisie en recall met actuele en voorspelde waarden.
voor klasse 1 (gekarnde gebruikers) model bereikt 0,67 precisie en 0,37 recall. Precisie vertelt ons hoeveel gekarnde gebruikers onze classifier correct voorspelde. Aan de andere kant, herinneren vertel ons hoeveel gekarnde gebruikers het gemist.
in lekentaal is de classifier niet erg nauwkeurig voor gekarnde gebruikers.
from sklearn.metrics import classification_reportprint(classification_report(df_test, pred))
Model interpreteerbaarheid
beslisboom-model maakt gebruik van het Contract, MonthlyCharges, InternetService, TotalCharges, en mandaat heeft om een beslissing te maken als een klant churn of niet. Deze functies scheiden gekarnde klanten van anderen goed op basis van de split criteria in de beslissing boom.
elk klantenvoorbeeld doorkruist de boom en het uiteindelijke knooppunt geeft de voorspelling.
bijvoorbeeld, als Contract_Month-to-month is:
- gelijk aan 0, Ga door de boom met True branch,
- gelijk aan 1, Ga door de boom met False branch,
- niet gedefinieerd, het voert de klasse 0 uit.
Dit is een geweldige benadering om te zien hoe het model een beslissing neemt of of er functies in ons model zijn geslopen die er niet zouden moeten zijn.
Verder lezen
- Omgaan klasse onbalans in klantbehoud voorspelling — hoe kunnen we beter omgaan met klasse onbalans in de churn prediction.
- A Survey on customer Churn Prediction using Machine Learning Techniques] – dit artikel geeft een overzicht van de meest populaire machine learning algoritmen die door onderzoekers worden gebruikt voor het voorspellen van de churn.
- Telco klant churn op Kaggle-Churn analyse op Kaggle.
- WTTE-RNN-Hackless-churn-modeling-Event based Churn voorspelling.
voordat je gaat
Volg me op Twitter, waar ik regelmatig tweet over Data Science en Machine Learning.