电信行业智能套餐个性化匹配_特征工程(二)

本文详细介绍了特征处理的方法,包括对分类数据进行独热编码,处理有序分类特征,以及使用决策树离散化方法处理连续数值特征。通过具体实例展示了特征工程在机器学习项目中的应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

上一节对特征进行了分析,这一节进行特征处理,参考文献:
特征处理
处理分类数据

处理无序分类特征

这里使用独热编码,对

  • 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_levelvector
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')

分割service_type

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值