问题 1:根据附件 1 和附件 2,分别研究影响客户语音业务和上网业务 满意度的主要因素,并给出各因素对客户打分影响程度的量化分析和结果。 附件 1、2 中各字段的解释说明见附件 5。
问题一本质就是特征筛选问题,而且要给出各特征影响程度的量化分析。
问题 2:结合问题 1 的分析,对于客户语音业务和上网业务分别建立 客户打分基于相关影响因素的数学模型,并据此对附件 3、4 中的客户打分 进行预测研究,将预测结果分别填写在 result.xlsx 的 Sheet1“语音”和 Sheet2“上网”两个工作表中,并上传到竞赛平台,说明你们预测的合理 性。
问题二本质就是构建机器学习模型,直接上代码。
# 导入数据,取附件一和附件三特征的交集
import pandas as pd
import warnings
warnings.filterwarnings('ignore')
import pylab as mpl
mpl.rcParams['font.sans-serif']=['Microsoft YaHei']
mpl.rcParams['axes.unicode_minus']=False
# 取附件1和附件3的特征交集
df1 = pd.read_excel(r"C:\B初赛\赛道B初赛\附件1语音业务用户满意度数据.xlsx")
df2=df1.copy(deep=True)
df3=pd.read_excel(r"C:\B初赛\赛道B初赛\附件3语音业务用户满意度预测数据.xlsx")
df2_feature=set(df2.columns)
df3_feature=set(df3.columns)
comman_feature=df2_feature & df3_feature
drop_feature=df2_feature-comman_feature
a=set(['网络覆盖与信号强度', '语音通话稳定性','语音通话清晰度', '语音通话整体满意度'])
b=drop_feature-a # 附件1要删除的特征
print(b,len(b))
df2=df2.drop(b,axis=1)
print(df2.info())
print(df2.columns)
{'是否实名登记用户', '语音方式', '重定向驻留时长', 'ARPU(家庭宽带)', '是否去过营业厅', '当月欠费金额', '重定向次数', '家宽投诉', '前第3个月欠费金额', '资费投诉'} 10
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 5433 entries, 0 to 5432
Data columns (total 45 columns):
# Column Non-Null Count Dtype
--- ------ -------------- -----
0 用户id 5433 non-null int64
1 语音通话整体满意度 5433 non-null int64
2 网络覆盖与信号强度 5433 non-null int64
3 语音通话清晰度 5433 non-null int64
4 语音通话稳定性 5433 non-null int64
5 是否遇到过网络问题 5433 non-null int64
6 居民小区 5433 non-null int64
7 办公室 5433 non-null int64
8 高校 5433 non-null int64
9 商业街 5433 non-null int64
10 地铁 5433 non-null int64
11 农村 5433 non-null int64
12 高铁 5433 non-null int64
13 其他,请注明 5433 non-null int64
14 用户描述 275 non-null object
15 手机没有信号 5433 non-null int64
16 有信号无法拨通 5433 non-null int64
17 通话过程中突然中断 5433 non-null int64
18 通话中有杂音、听不清、断断续续 5433 non-null int64
19 串线 5433 non-null int64
20 通话过程中一方听不见 5433 non-null int64
21 其他,请注明.1 5433 non-null int64
22 用户描述.1 109 non-null object
23 脱网次数 5433 non-null int64
24 mos质差次数 5433 non-null int64
25 未接通掉话次数 5433 non-null int64
26 4\5G用户 5433 non-null object
27 是否关怀用户 200 non-null object
28 套外流量(MB) 5433 non-null float64
29 是否4G网络客户(本地剔除物联网) 5428 non-null object
30 套外流量费(元) 5433 non-null float64
31 外省语音占比 5433 non-null float64
32 语音通话-时长(分钟) 5433 non-null int64
33 省际漫游-时长(分钟) 5433 non-null int64
34 终端品牌 5429 non-null object
35 终端品牌类型 5428 non-null object
36 当月ARPU 5433 non-null float64
37 当月MOU 5433 non-null int64
38 前3月ARPU 5433 non-null float64
39 前3月MOU 5433 non-null int64
40 外省流量占比 5431 non-null float64
41 GPRS总流量(KB) 5433 non-null int64
42 GPRS-国内漫游-流量(KB) 5433 non-null int64
43 是否5G网络客户 5428 non-null object
44 客户星级标识 5428 non-null object
dtypes: float64(6), int64(30), object(9)
# 数据预处理。包括:1、数据补齐,2、缺失值处理,3、类别变量编码,4、异常值处理,5、查看数据分布
# 数据补齐
df2['是否关怀用户']=df2['是否关怀用户'].fillna('否')
df2=df2.drop('用户id',axis=1)
# 缺失值处理
import missingno as msno
msno.matrix(df2,labels=True) # 4列缺失值比较多,8个缺失值集中在几个样本
isnull_df = pd.DataFrame(df2.isnull().any()) # 查看存在缺失值的列数
isnull_df[df2.isnull().any()==True]
# 定义一个函数,查看缺失值比例
def check_na(data):
null_val_sums =data.isnull().sum() +data.isin(['空']).sum()#统计每个列有多少缺失值
null = list(null_val_sums.values)
per_null = list(null_val_sums.values / len(df1)) #计算缺失率
total = 0
for ele in range(0, len(per_null)):
total = total + per_null[ele]
if total == 0:
print('所有变量无缺失值')
else:
for i in range(len(per_null)):
if per_null[i]!=0:
print('变量'+list(data)[i],'缺失值个数为:',null[i],'缺失值比率为:',per_null[i])
return
check_na(df2)
变量用户描述 缺失值个数为: 5158 缺失值比率为: 0.9493833977544635
变量用户描述.1 缺失值个数为: 5324 缺失值比率为: 0.9799374194735874
变量是否4G网络客户(本地剔除物联网) 缺失值个数为: 5 缺失值比率为: 0.0009203018590097553
变量终端品牌 缺失值个数为: 4 缺失值比率为: 0.0007362414872078042
变量终端品牌类型 缺失值个数为: 5 缺失值比率为: 0.0009203018590097553
变量外省流量占比 缺失值个数为: 2 缺失值比率为: 0.0003681207436039021
变量是否5G网络客户 缺失值个数为: 5 缺失值比率为: 0.0009203018590097553
变量客户星级标识 缺失值个数为: 5 缺失值比率为: 0.0009203018590097553
df2=df2.drop(['用户描述','用户描述.1'],axis=1) # 删除两个缺失值较多的列
df2[df2.isnull().any(axis=1)==True] # 找缺失值的行
df2 = df2.drop(labels=[1572,1600,2326,2827,3265]) # 删除5个缺失值较多的样本
df2 = df2.fillna(df2.mean())
check_na(df2)
df2.info()
所有变量无缺失值
<class 'pandas.core.frame.DataFrame'>
Int64Index: 5428 entries, 0 to 5432
Data columns (total 42 columns):
# Column Non-Null Count Dtype
--- ------ -------------- -----
0 语音通话整体满意度 5428 non-null int64
1 网络覆盖与信号强度 5428 non-null int64
2 语音通话清晰度 5428 non-null int64
3 语音通话稳定性 5428 non-null int64
4 是否遇到过网络问题 5428 non-null int64
5 居民小区 5428 non-null int64
6 办公室 5428 non-null int64
7 高校 5428 non-null int64
8 商业街 5428 non-null int64
9 地铁 5428 non-null int64
10 农村 5428 non-null int64
11 高铁 5428 non-null int64
12 其他,请注明 5428 non-null int64
13 手机没有信号 5428 non-null int64
14 有信号无法拨通 5428 non-null int64
15 通话过程中突然中断 5428 non-null int64
16 通话中有杂音、听不清、断断续续 5428 non-null int64
17 串线 5428 non-null int64
18 通话过程中一方听不见 5428 non-null int64
19 其他,请注明.1 5428 non-null int64
20 脱网次数 5428 non-null int64
21 mos质差次数 5428 non-null int64
22 未接通掉话次数 5428 non-null int64
23 4\5G用户 5428 non-null object
24 是否关怀用户 5428 non-null object
25 套外流量(MB) 5428 non-null float64
26 是否4G网络客户(本地剔除物联网) 5428 non-null object
27 套外流量费(元) 5428 non-null float64
28 外省语音占比 5428 non-null float64
29 语音通话-时长(分钟) 5428 non-null int64
30 省际漫游-时长(分钟) 5428 non-null int64
31 终端品牌 5428 non-null object
32 终端品牌类型 5428 non-null object
33 当月ARPU 5428 non-null float64
34 当月MOU 5428 non-null int64
35 前3月ARPU 5428 non-null float64
36 前3月MOU 5428 non-null int64
37 外省流量占比 5428 non-null float64
38 GPRS总流量(KB) 5428 non-null int64
39 GPRS-国内漫游-流量(KB) 5428 non-null int64
40 是否5G网络客户 5428 non-null object
41 客户星级标识 5428 non-null object
dtypes: float64(6), int64(29), object(7)
# 给字符串变量编码
s=df2.dtypes=='object'
object_cols=list(s[s].index)
df2[object_cols]=df2[object_cols].astype('str')
label_df = df2.copy()
from sklearn.preprocessing import LabelEncoder
label_encoder = LabelEncoder()
for col in object_cols:
label_df[col]=label_encoder.fit_transform(df2[col])
print(label_df.head())
label_df.info()
# 给其他类别变量编码
label_df.iloc[:,4].replace(2,0,inplace=True) # 第五列将的2换成0
for i in range(len(label_df)):
for j in range(5,20):
if label_df.iloc[i,j]==-1:
label_df.iloc[i,j]=0
else:
label_df.iloc[i,j]=1
print(label_df.head())
# label_df.to_excel(r"C:\B初赛\附件1编码数据.xlsx")
编码后各变量的情况
语音通话整体满意度 网络覆盖与信号强度 语音通话清晰度 语音通话稳定性 是否遇到过网络问题 居民小区 办公室 高校 商业街 地铁 \
0 10 6 6 6 1 0 1 0 0 0
1 2 1 1 1 1 1 1 0 1 0
2 10 7 7 7 1 0 0 0 0 0
3 6 7 7 6 1 1 1 0 0 0
4 5 5 4 3 1 0 1 0 0 1
... 终端品牌类型 当月ARPU 当月MOU 前3月ARPU 前3月MOU 外省流量占比 GPRS总流量(KB) \
0 ... 43 347.32 644 0.0 480 1.0 8450801
1 ... 462 111.40 902 0.0 480 1.0 17425910
2 ... 571 48.00 322 0.0 413 1.0 6215849
3 ... 45 49.00 139 0.0 301 1.0 5370710
4 ... 34 138.10 787 0.0 1193 1.0 3857521
GPRS-国内漫游-流量(KB) 是否5G网络客户 客户星级标识
0 8450801 1 8
1 17425910 1 8
2 6215849 0 1
3 5370710 1 1
4 3857521 0 8
[5 rows x 42 columns]
# 查看异常值
# 筛选出数值变量
import numpy as np
s1=label_df.dtypes=='float64'
number_variable=list(s1[s1].index)
number_variable1=['脱网次数', 'mos质差次数', '未接通掉话次数','语音通话-时长(分钟)', '省际漫游-时长(分钟)',
'当月MOU','前3月MOU','GPRS总流量(KB)','GPRS-国内漫游-流量(KB)']
number_variable=number_variable+number_variable1
print(number_variable,len(number_variable)) # 15个数值型变量
O_data=label_df[number_variable]
# 画箱线图查看异常值
import matplotlib.pylab as plt
import seaborn as sns
feacture_name=O_data.columns.tolist()
n=0
fig,ax=plt.subplots(3,5,figsize=(15,5))
for i in range(3):
for j in range(5):
sns.boxplot(x=O_data[feacture_name[n]],data=O_data.iloc[:,n],ax=ax[i][j],
fliersize=1,width=0.8,color='purple')
n+=1
fig.tight_layout() # 自动紧凑型布局
plt.show()
# 剔除异常值
A=O_data[abs(O_data-O_data.mean())>3*O_data.std()] # 返回一个dataframe,查找异常值
C=B.dropna(thresh=7,axis=0) # (保留非空值(异常值)超过7个的行)
print(C,C.shape) # 剔除这五个样本
# 计算各数值变量异常值的个数
def segamma(x):
mean = x.mean()
std = x.std()
return (x-mean >3*std).sum() + (x-mean < -3*std).sum()
list1=O_data.columns.tolist()
num={}
for i in range(O_data.shape[1]):
num[list1[i]] = segamma(O_data.iloc[:,i])
a = {}
for key,values in num.items():
if values>0:
a[key] = values
b=sorted(a.items(),key = lambda item : item[1],reverse=True)
print(b)
['套外流量(MB)', '套外流量费(元)', '外省语音占比', '当月ARPU', '前3月ARPU', '外省流量占比', '脱网次数', 'mos质差次数', '未接通掉话次数', '语音通话-时长(分钟)', '省际漫游-时长(分钟)', '当月MOU', '前3月MOU', 'GPRS总流量(KB)', 'GPRS-国内漫游-流量(KB)'] 15
套外流量(MB) 套外流量费(元) 外省语音占比 当月ARPU 前3月ARPU 外省流量占比 脱网次数 mos质差次数 \
90 1512.83 NaN 1.000000 NaN NaN 1.000000 NaN NaN
114 1055.64 150.0 1.000000 304.00 NaN 1.000000 NaN NaN
213 NaN NaN 0.948052 NaN NaN 0.957533 NaN NaN
238 2439.33 NaN 0.737779 NaN NaN 0.924110 NaN NaN
244 NaN NaN 0.712792 628.25 NaN 0.708733 NaN NaN
未接通掉话次数 语音通话-时长(分钟) 省际漫游-时长(分钟) 当月MOU 前3月MOU GPRS总流量(KB) \
90 NaN 3451.0 3451.0 3451.0 NaN NaN
114 NaN NaN 2051.0 NaN NaN 174541422.0
213 NaN 3234.0 3066.0 3234.0 3079.0 NaN
238 NaN 2639.0 1947.0 2639.0 NaN 117556786.0
244 NaN 4878.0 3477.0 4878.0 3314.0 NaN
GPRS-国内漫游-流量(KB)
90 68040140.0
114 174541422.0
213 21330214.0
238 108635384.0
244 NaN (5, 15)
[('外省流量占比', 257), ('外省语音占比', 252), ('mos质差次数', 116), ('当月ARPU', 102), ('GPRS-国内漫游-流量(KB)', 83), ('未接通掉话次数', 78), ('省际漫游-时长(分钟)', 74), ('套外流量费(元)', 73), ('脱网次数', 67), ('前3月MOU', 61), ('语音通话-时长(分钟)', 60), ('当月MOU', 60), ('前3月ARPU', 47), ('套外流量(MB)', 46), ('GPRS总流量(KB)', 20)]
# 删除114、238、244、90、213号样本,这五个样本的异常值超过8个
label_df=label_df.drop(labels=[114,238,244,90,213])
O_data=O_data.drop(labels=[114,238,244,90,213])
print(label_df.shape,O_data.shape)
# 预处理完之后还剩5425个样本
查看变量的分布情况
# 画直方图,查看分类型变量和数值型变量的个数
import matplotlib.pyplot as plt
from pylab import mpl
mpl.rcParams['font.sans-serif']=['Simhei'] #设置中文字体
mpl.rcParams['axes.unicode_minus']=False #解决图像保存时‘-’显示为方框的问题
# 变量类型统计条形图
x1=label_df.iloc[:,4:]
set1_O=set(O_data.columns)
set2_C=set(x1.columns)-set1_O
C_data=label_df[list(set2_C)]
print(C_data.head(),C_data.shape)
# 分类型直方图
import random
import seaborn as sns
import warnings
warnings.filterwarnings('ignore')
name2=list(random.sample(set2_C,5))
fig,ax=plt.subplots(1,5,figsize=(10,5))
for j in range(5):
sns.distplot(C_data.iloc[:,j],bins=8,kde=False,ax=ax[j])
plt.tight_layout() #坐标轴与title重合问题解决
plt.show()
# 数值型直方图
name3=list(random.sample(set1_O,5))
fig,ax=plt.subplots(1,5,figsize=(10,5))
for i in range(5):
sns.set_palette('hls')
sns.distplot(O_data.iloc[:,i],bins=4,kde=True,ax=ax[i])
plt.tight_layout() #坐标轴与title重合问题解决
# 对第一个因变量分析
x1 = label_df.iloc[:,4:]
print(x1.head(),y.head())
y1=label_df.iloc[:,0]
y2=label_df.iloc[:,1]
y3=label_df.iloc[:,2]
y4=label_df.iloc[:,3]
y1=pd.DataFrame(label_encoder.fit_transform(y1),columns=['语音通话整体满意度']) # 给因变量重新编码,分类模型需要
y2=pd.DataFrame(label_encoder.fit_transform(y2),columns=['网络覆盖与信号强度'])
y3=pd.DataFrame(label_encoder.fit_transform(y3),columns=['语音通话清晰度'])
y4=pd.DataFrame(label_encoder.fit_transform(y4),columns=['语音通话稳定性'])
print(y1.head(),y2.head(),y3.head(),y4.head())
# 计算信息增益率
import numpy as np
def ent(data):
prob=pd.value_counts(data)/len(data)
return sum(np.log2(prob)*prob*(-1))
def get_info_gain(data,str1,str2):
e1=data.groupby(str1).apply(lambda x : ent(x[str2])) # 计算可视化分组后的信息熵
p1=pd.value_counts(data[str1])/len(data[str1]) # 计算特征的信息熵
e2=sum(e1*p1)
return round(float(ent(data[str2])-e2),5)
def gent(data,str1,str2):
return get_info_gain(data,str1,str2)/ent(data[str1]) # 计算信息增益率
# 计算四个因变量的信息熵
print(ent(y1['语音通话整体满意度']),ent(y2['网络覆盖与信号强度']),ent(y3['语音通话清晰度']),ent(y4['语音通话稳定性']))
# 筛选语音通话整体满意度'的主要影响因素
data1=label_df.drop(['网络覆盖与信号强度', '语音通话清晰度', '语音通话稳定性'],axis=1)
data2=label_df.drop(['语音通话整体满意度', '语音通话清晰度', '语音通话稳定性'],axis=1)
data3=label_df.drop(['语音通话整体满意度','网络覆盖与信号强度', '语音通话稳定性'],axis=1)
data4=label_df.drop(['语音通话整体满意度','网络覆盖与信号强度', '语音通话清晰度'],axis=1)
str1=x1.columns.tolist()
# print(str1,len(str1))
str21,str22,str23,str24='语音通话整体满意度','网络覆盖与信号强度','语音通话清晰度','语音通话稳定性'
diction1={}
diction2={}
diction3={}
diction4={}
for feat in str1:
diction1[feat]=gent(data1,feat,str21)
diction2[feat]=gent(data2,feat,str22)
diction3[feat]=gent(data3,feat,str23)
diction4[feat]=gent(data4,feat,str24)
print(diction1,diction2,diction3,diction4)
by_value1=sorted(diction1.items(),key= lambda item : item[1],reverse=True) # 对各因变量的信息增益率由大到小排序
by_value2=sorted(diction2.items(),key= lambda item : item[1],reverse=True)
by_value3=sorted(diction3.items(),key= lambda item : item[1],reverse=True)
by_value4=sorted(diction4.items(),key= lambda item : item[1],reverse=True)
def separate(by_value): # 对键值进行分离,方便后续作图
key=[]
value=[]
for d in by_value:
key.append(d[0])
value.append(d[1])
return key,value
key1,value1=separate(by_value1)
key2,value2=separate(by_value2)
key3,value3=separate(by_value3)
key4,value4=separate(by_value4)
# print(key1[:20])
import pylab as mpl
mpl.rcParams['font.sans-serif']=['Microsoft YaHei']
mpl.rcParams['axes.unicode_minus']=False
plt.title('特征对语音通话整体满意度的信息增益率')
index=range(len(key1[0:20]))
plt.yticks(index,key1[0:20]) #刻度替换
plt.barh(index,value1[0:20]) #横向条形图
plt.show()
import pylab as mpl
mpl.rcParams['font.sans-serif']=['Microsoft YaHei']
mpl.rcParams['axes.unicode_minus']=False
plt.title('特征对网络覆盖与信号强度的信息增益率')
index=range(len(key2[0:20]))
plt.yticks(index,key2[0:20]) #刻度替换
plt.barh(index,value2[0:20]) #横向条形图
plt.show()
import pylab as mpl
mpl.rcParams['font.sans-serif']=['Microsoft YaHei']
mpl.rcParams['axes.unicode_minus']=False
plt.title('特征对语音通话清晰度的信息增益率')
index=range(len(key3[0:20]))
plt.yticks(index,key3[0:20]) #刻度替换
plt.barh(index,value3[0:20]) #横向条形图
plt.show()
import pylab as mpl
mpl.rcParams['font.sans-serif']=['Microsoft YaHei']
mpl.rcParams['axes.unicode_minus']=False
index=range(len(key4[0:20]))
plt.title('特征对语音通话稳定性的信息增益率')
plt.yticks(index,key4[0:20]) #刻度替换
plt.barh(index,value4[0:20]) #横向条形图
# 计算加权信息增益率
dicton5={'语音通话整体满意度':diction1, '网络覆盖与信号强度':diction2, '语音通话清晰度':diction3, '语音通话稳定性':diction4}
df3=pd.DataFrame(dicton5)
df3['weight']=0.4*df3['语音通话整体满意度']+0.2*df3['网络覆盖与信号强度']+0.2*df3['语音通话清晰度']+0.2*df3['语音通话稳定性']
print(df3['weight'].mean(),df3.head())
df4=df3.query('weight>=0.093')
imtance_f=df4.index.tolist() # 选出加权信息增益率大于均值的特征,共有20个特征
diction6={}
for i in range(df4.shape[0]):
diction6[imtance_f[i]]=df4.iloc[i,4]
by_value5=sorted(diction6.items(),key= lambda item : item[1],reverse=True)
key5,value5=separate(by_value5)
print(diction6)
import pylab as mpl
mpl.rcParams['font.sans-serif']=['Microsoft YaHei']
mpl.rcParams['axes.unicode_minus']=False
plt.title('特征加权信息增益率')
index=range(len(key5[0:20]))
plt.yticks(index,key5[0:20]) #刻度替换
plt.barh(index,value5[0:20]) #横向条形图
plt.show()
构建XGBoost模型和随机森林模型筛选特征
# 构建模型
# 将数据切割为训练集和测试集
from sklearn.model_selection import train_test_split
x_train1, x_test1, y_train1, y_test1 = train_test_split(x1, y1,test_size=0.2,random_state=0)
x_train2, x_test2, y_train2, y_test2 = train_test_split(x1, y2,test_size=0.2,random_state=0)
x_train3, x_test3, y_train3, y_test3 = train_test_split(x1, y3,test_size=0.2,random_state=0)
x_train4, x_test4, y_train4, y_test4 = train_test_split(x1, y4,test_size=0.2,random_state=0)
from sklearn import metrics
def model_evaluate(x_train,y_train,x_test,y_test):
# xgboost模型
from xgboost import XGBClassifier
xgboost=XGBClassifier(learning_rate= 0.1,max_depth=9,n_estimators=80,subsample=0.8,
objective='multi:softmax',num_class=10)
result1=xgboost.fit(x_train,y_train)
y_pred1=result1.predict(x_test)
print('xgboost结果如下')
print('训练集分数:', result1.score(x_train, y_train))
print('测试集分数:', result1.score(x_test, y_test))
print('xgboost分类报告')
print(metrics.classification_report(y_test,y_pred1))
# 随机森林分类器
from sklearn.ensemble import RandomForestClassifier
rf=RandomForestClassifier(n_estimators=35,max_features=0.8,random_state=0) #随机森林实例化,150颗树,每次随机选80%特征
result2=rf.fit(x_train,y_train)
y_pred2=result2.predict(x_test)
print('随机森林结果如下')
print(result2.score(x_train,y_train))
print(result2.score(x_test,y_test))
print('随机森林分类报告')
print(metrics.classification_report(y_test,y_pred2)) #打印混淆矩阵
importances1=xgboost.feature_importances_ #返回一个series,展示每个特征的重要性(小数值)
im1=pd.DataFrame(importances1)
feacture_name=x_train.columns.values.tolist() #把原始的cloenmns转化为列表 #去掉label
im1['feacture']=feacture_name
im1=im1.sort_values(by=[0],ascending=False)[:20] #根据第0列的数值来排列,降序
index=range(len(im1))
plt.yticks(index,im1.feacture) #刻度替换
plt.barh(index,im1[0]) #横向条形图
plt.show()
importances2=rf.feature_importances_ #返回一个series,展示每个特征的重要性(小数值)
im2=pd.DataFrame(importances2)
feacture_name=x_train.columns.values.tolist() #把原始的cloenmns转化为列表 #去掉label
im2['feacture']=feacture_name
im2=im2.sort_values(by=[0],ascending=False)[:20] #根据第0列的数值来排列,降序
index=range(len(im2))
plt.yticks(index,im2.feacture) #刻度替换
plt.barh(index,im2[0]) #横向条形图
plt.show()
return im1,im2
xgb1,rf1=model_evaluate(x_train1,y_train1,x_test1,y_test1) # 第一个因变量的结果
xgb2,rf2=model_evaluate(x_train2,y_train2,x_test2,y_test2)
xgb3,rf3=model_evaluate(x_train3,y_train3,x_test3,y_test3)
xgb4,rf4=model_evaluate(x_train4,y_train4,x_test4,y_test4)
# XGBoost筛选出的对语音业务影响的主要特征
xgb_set1,xgb_set2,xgb_set3,xgb_set4=set(xgb1['feacture'][:20]),set(xgb2['feacture'][:20]),set(xgb3['feacture'][:20]),set(xgb4['feacture'][:20])
commen_set1=xgb_set1| xgb_set2|xgb_set3|xgb_set4
# print(commen_set1,len(commen_set1)) # 28个
# 随机森林筛选出的对语音业务影响的主要特征
rf_set1,rf_set2,rf_set3,rf_set4=set(rf1['feacture'][:20]),set(rf2['feacture'][:20]),set(rf3['feacture'][:20]),set(rf4['feacture'][:20])
commen_set2=rf_set1|rf_set2|rf_set3|rf_set4
# print(commen_set2,len(commen_set2)) # 21个
# 加权信息增益率筛选出的对语音业务影响的主要特征
commen_set3=set(key5)
# print(commen_set3,len(commen_set3)) # 20个
finnal_feature=commen_set1 & commen_set2 & commen_set3
print(finnal_feature,len(finnal_feature))
finnal_feature=list(finnal_feature)
diction7={}
for i in finnal_feature:
diction7[i]=diction6.get(i)
by_value6=sorted(diction7.items(),key= lambda item : item[1],reverse=True)
print(by_value6)
key6,value6=separate(by_value6)
import pylab as mpl
mpl.rcParams['font.sans-serif']=['Microsoft YaHei']
mpl.rcParams['axes.unicode_minus']=False
plt.title('特征加权信息增益率')
index=range(len(key6[0:12]))
plt.yticks(index,key6[0:12]) #刻度替换
plt.barh(index,value6[0:12]) #横向条形图
plt.show()
# 画最终变量的相关系数图
corr1=label_df[finnal_feature].corr()
sns.heatmap(corr1,vmin=-1,vmax=1,cmap=sns.color_palette('RdBu',n_colors=128))#画热力图,图例最小值 -1,最大值1,颜色对象设为红蓝('RdBu'),颜色数目为128
plt.show()
筛选出的最终特征