上一节对特征进行了分析,这一节进行特征处理,参考文献:
特征处理
处理分类数据
处理无序分类特征
这里使用独热编码,对
- is_mix_service 是否固移融合套餐
- 连续超套 many_over_bill
- 合约类型 contract_type
- 是否承诺低消用户 is_promise_low_consume
- 网络口径用户 net_service
- gender 性别
进行one-hot编码。
代码如下:
is_mix_service_rank = pd.get_dummies(train_data['is_mix_service'],prefix='is_mix_service')
many_over_bill_rank = pd.get_dummies(train_data['many_over_bill'],prefix='many_over_bill')
contract_type_rank = pd.get_dummies(train_data['contract_type'],prefix='contract_type')
is_promise_low_consume_rank = pd.get_dummies(train_data.is_promise_low_consume,prefix = 'promise_low_consume')
net_service_rank = pd.get_dummies(train_data.net_service,prefix='net_service')
gender_rank = pd.get_dummies(train_data.gender,prefix='gender')
new = pd.concat([train_data,is_mix_service_rank,many_over_bill_rank,contract_type_rank,is_promise_low_consume_rank,net_service_rank,gender_rank],axis = 1)
new.drop(['is_mix_service','many_over_bill','contract_type'],axis=1,inplace=True)
new.drop(['is_promise_low_consume','net_service','gender'],axis=1,inplace=True)
处理有序分类特征
有序分类特征有:
- online_time 在网时长
- 交费次数 pay_times
- age 年龄
其实以上特征都可以看作数值型特征。
真正的有序分类特征应该是这个:
- complaint_level 投诉重要性
一种处理方式是忽略特征的有序性,直接进行独热编码;另一种是使用递进的向量表示。
这里complaint_level共有{0,1,2,3}四个值。
设计一个如下的向量表示:
complaint_level | vector |
---|---|
0 | (0,0,0) |
1 | (0,0,1) |
2 | (0,1,1) |
3 | (1,1,1) |
我们两种方法都尝试一下,代码如下:
complaint_level = train_data.complaint_level.values
cn = []
cn_dic = {0:[0,0,0],1:[0,0,1],2:[0,1,1],3:[1,1,1]}
for i in complaint_level:
temp = cn_dic[i]
cn.append(temp)
cn_df = pd.DataFrame(cn)
cn_df.columns = ['complaint_level_v1','complaint_level_v2','complaint_level_v3']
new = pd.concat([new,cn_df,complaint_level_rank],axis = 1)
new.drop(['complaint_level'],axis=1,inplace=True)
处理数值特征
包括之前看作数值特征的有序分类特征:
- online_time 在网时长
- 交费次数 pay_times
- age 年龄
还有:
- 合约到期剩余时长 contract time
- 交费金额 pay_num
- 月总出账金额 * 4
- 当月累计流量 month_traffic
- 上月结转流量
- 月累计-本地数据流量
- 本地语音主叫通话时长
- 套外主叫通话时长
- Service2_caller_time
- 交费金历史投诉总量
- 历史执行补救费用交费金额
这些数值型特征。
我们使用决策树离散化方法进行连续数值的处理:
pass 暂时没找到现成的代码。
连续特征离散化方法还有:
基于熵的离散
基于卡方的离散
等距、等频
这里选择一个更简单的等距离离散的方法解决。
def discretization(arr,n=4):
# 等距离离散化连续特征
# arr: list-like object
minn = min(arr)
maxn = max(arr)
diff = maxn - minn
lenn = diff / n
temp = []
for num in arr:
count = 0
while num >= minn + count*lenn:
count += 1
if count > n :
count = n
temp.append(count)
#index0 = temp.index(max(temp))
#temp[index0] -= 1
return temp
age_rank = pd.get_dummies(discretization(train_data.age.values),prefix='age')
contract_time_rank = pd.get_dummies(discretization(train_data.contract_time.values),prefix='contract_time')
online_time_rank = pd.get_dummies(discretization(train_data.online_time.values),prefix='online_time')
pay_times_rank = pd.get_dummies(discretization(train_data.pay_times.values),prefix='pay_times')
new = pd.concat([train_data,age_rank,contract_time_rank,online_time_rank,pay_times_rank],axis = 1)
new.drop(['age','contract_time','online_time','pay_times'],axis=1,inplace=True)
pay_num_rank = pd.get_dummies(discretization(train_data.pay_num.values),prefix='pay_num')
month_traffic_rank = pd.get_dummies(discretization(train_data.month_traffic.values),prefix='month_traffic')
l_total_fee_rank = pd.get_dummies(discretization(train_data['1_total_fee'].values),prefix='1_total_fee')
ll_total_fee_rank = pd.get_dummies(discretization(train_data['2_total_fee'].values),prefix='2_total_fee')
lll_total_fee_rank = pd.get_dummies(discretization(train_data['3_total_fee'].values),prefix='3_total_fee')
llll_total_fee_rank = pd.get_dummies(discretization(train_data['4_total_fee'].values),prefix='4_total_fee')
new = pd.concat([new,pay_num_rank,month_traffic_rank,l_total_fee_rank,ll_total_fee_rank,lll_total_fee_rank,llll_total_fee_rank],axis = 1)
new.drop(['pay_num','month_traffic','1_total_fee','2_total_fee','3_total_fee','4_total_fee'],axis=1,inplace=True)
last_month_traffic_rank = pd.get_dummies(discretization(train_data.last_month_traffic.values),prefix='last_month_traffic')
local_trafffic_month_rank = pd.get_dummies(discretization(train_data.local_trafffic_month.values),prefix='local_trafffic_month')
local_caller_time_rank = pd.get_dummies(discretization(train_data.local_caller_time.values),prefix='local_caller_time')
server1_caller_time_rank = pd.get_dummies(discretization(train_data.service1_caller_time.values),prefix='server1_caller_time')
server2_caller_time_rank = pd.get_dummies(discretization(train_data.service2_caller_time.values),prefix='server2_caller_time')
former_complaint_num_rank = pd.get_dummies(discretization(train_data.former_complaint_num.values),prefix='former_complaint_num')
former_complaint_fee_rank = pd.get_dummies(discretization(train_data.former_complaint_fee.values),prefix='former_complaint_fee')