客戶流失預警模型 資料預處理與特徵衍生

2021-08-24 17:45:58 字數 4214 閱讀 6027

1、人為截斷,高於某一閾值的資料,統一等於某乙個數

2、刪除極端值

3、單獨建模型

1、完全隨機缺失

2、隨機缺失,依賴其他變數,如『配偶姓名』的缺失取決於『婚姻狀況』

3、完全非隨機缺失:缺失值是由於本身缺陷導致,如年齡較低的信用卡辦卡人員不願意透露父母親的**。

1、刪除缺失值的屬性

2、插補填充(常用於完全隨機缺失且缺失度不高的情形中)

3、將缺失值當成一種屬性值(常用於隨機缺失)

一、對於完全隨機缺失,當缺失率不高時,可以:

1、用常數不缺,例如均值,如果存在極端值,要考慮是否要剔除極端值後再計算均值

2、從非缺失值中隨機抽樣賦予缺失樣本

二、對於隨機缺失,可以在同一層內,用完全隨機缺失的方法進行補全。

例如:在有無工作的類別下,有工作的人群中工資樣本缺失,可以用有工作人群的工資平均值進行填補

三、對於完全非隨機缺失,可以當成 一種屬性,將該變數轉化成類別變數

一、當缺失率很低時:

1、用最常出現的類別補缺

2、從已知樣本中隨機抽樣

二、當缺失率很高時:

考慮剔除該變數

三、當缺失率介於很高和很低時:

可以當成一種類別

一、類別型變數

one—hot編碼

dummy編碼

濃度編碼

woe編碼 

二、時間型變數

基於某個基準點,轉化為天數

import pandas as pd

import random

import numpy as np

import operator

import numbers

from sklearn.ensemble import gradientboostingclassifer

from sklearn.model_selection import train_test_split

import datetime

import time

#df為資料集

#col為自變數特徵

#type特徵為數值型還是字串型

#method為填充方法

def makeupmissing(df,col,type,method):

validdf=valid.loc[df[col]==df[col]]

if validdf.shape[0] == df.shape[0]:

return '在以下特徵中{}沒有缺失值'.format(col)

#建立乙個副本,防止影響原資料框

missinglist = [i for i in df[col]]

if type =='continuous':

if method not in ['mean','random']:

return '請明確使用正確的方法'

descstats=validdf[col].describe()

mu=descstats['mean']

std=descstats['std']

maxval=descstats['max']

#根據切比雪夫不等式,超過3個標準差的數出現概率很低,基本可以推斷為極端值

if maxval > mu+3*std:

for i in list(validdf.index):

if validdf.loc[i][col]>mu+3*std:

validdf.loc[i][col]=mu+3*std

mu=validdf[col].describe()['mean']

for i in range(df.shape[0]):

if df.loc[i][col] != df.loc[i][col]:

if method == 'mean':

missinglist[i]=mu

elif method =='random':

missinglist[i]=random.sample(validdf[col],1)[0]

elif type =='categorical':

if method not in ['mode','random']:

return '請明確使用正確的方法'

freqdict={}

recdnum = validdf.shape[0]

for v in set (validdf[col]):

vdf = validdf.loc[validdf[col] == v]

freqdict[v] = vdf.shape[0]*1.0/recdnum

#得出眾數,key指的是定義以哪個數值為評價指標

modeval = max(freqdict.items(),key=lambda x : x[1])[0]

freqtuple = freqdict.items()

freqlist=[0]+[i[1] for i in freqtuple]

freqcumsum = pd.cumsum(freqlist)

for i in range(df.shape[0]):

if df.loc[i][col] != df.loc[i][col]:

if method == 'mode':

missinglist[i]=modeval

elif method == 'random':

a=random.random(1)

position=[k+1 for k in range(len(freqcumsum)-1) if freqcumsum[k] < a <=freqcumsum[k+1]][0]

missinglist[i] = freqtuple[position-1][0]

print('列的缺失值已經用方法填充'.format(col,method))

return missinglist

#將分型別變數編碼

def encoder(df, col, target):

encoder = {}

for v in set(df[col]):

if v == v:

subdf = df[df[col] == v]

else:

xlist = list(df[col])

nanind = [i for i in range(len(xlist)) if xlist[i] != xlist[i]]

subdf = df.loc[nanind]

encoder[v] = sum(subdf[target])*1.0/subdf.shape[0]

newcol = [encoder[i] for i in df[col]]

return newcol

#日期特殊變數轉換

def datedays(df,datecol,base):

base2 = time.strptime(base,'%y/%m/%d')

base3 = datetime.datetime(base2[0],base2[1],base2[2])

date1 = [time.strptime(i,'%y/%m/%d') for i in df[datecol]]

date2 = [datetime.datetime(i[0],i[1],i[2]) for i in date1]

daysgap = [(date2[i] - base3).days for i in range(len(date2))]

return daysgap

#colnumerator為分子項

#coldenominator為分母項

#特生衍生

def columndivide(df, colnumerator, coldenominator):

n = df.shape[0]

rate = [0]*n

xnum = list(df[colnumerator])

xdenom = list(df[coldenominator])

for i in range(n):

#這一判斷主要是為了區別分母為零時無法計算的情形

if xdenom[i]>0:

rate[i] = xnum[i]*1.0/xdenom[i]

else:

rate[i] = 0

return rate

資料探勘案例 建立客戶流失模型

隨著市場競爭的加劇,中國電信面臨的壓力越來越大,客戶流失也日益增大。從統計資料看,今年固話小靈通的銷戶數已經超 過了開戶數。面對如此嚴峻的市場形式,當務之急就是要盡全力減少客戶的流失。因此,利用資料探勘方法,建立一套可以及時 客戶流失率的模型就相當有必要。一 確定客戶流失模型的目標 可能流失的客戶名...

資料探勘案例 建立客戶流失模型

本文 隨著市場競爭的加劇,中國電信面臨的壓力越來越大,客戶流失也日益增大。從統計資料看,今年固話小靈通的銷戶數已經超過了開戶數。面對如此嚴峻的市場形式,當務之急就是要盡全力減少客戶的流失。因此,利用 資料探勘 方法,建立一套可以及時 客戶流失率的模型就相當有必要。一 確定客戶流失模型的目標 可能流失...

資料探勘中的預處理 以電信客戶流失問題為例

資料預處理 step1 資料取樣 由於在建立客戶流失模型過程中,流失客戶往往佔所有客戶人群的比例很小,這時,最好的辦法是保留真個流失客戶人群,而對非流失客戶人群進行取樣,使得客戶流失與非客戶流失人群在1 1 1 2 step2 資料探索 缺失值和異常值 step3 建立缺失變數指示器 對於每乙個缺失...