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 建立缺失變數指示器 對於每乙個缺失...