2022 年 MathorCup 高校数学建模挑战赛——大数据竞赛赛道 赛道 B:北京移动用户体验影响因素研究

2023-10-31

问题 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()

筛选出的最终特征

 

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

2022 年 MathorCup 高校数学建模挑战赛——大数据竞赛赛道 赛道 B:北京移动用户体验影响因素研究 的相关文章

随机推荐

  • Spring/Spring boot中静态变量赋值

    情形1 静态变量为自动注入的对象 解决方案 设置两个变量 非静态变量使用 resource注入Bean 然后使用 PostConstruct在Spring初始化Bean成功后为静态变量赋值 Component public class XX
  • sql语句直接执行很快,java程序执行慢

    一次线上Case 一条联合查询语句 直接在sql server查询分析器执行 1秒以内 通过java程序执行很慢要7秒返回结果 贴出sql 语句 select temp id temp userId temp operationUserId
  • 紫枫术河 imx6 uboot的mtd分区总结(rootfs为ubi文件系统) imx6 uboot的mtd分区总结(rootfs为ubi文件系统)

    版权声明 本文为博主原创文章 未经博主允许不得转载 https blog csdn net qq 29729577 article details 51130209 此文章基于U Boot 2014 04版本 烧写工具为mfgtool 开发
  • 蓝桥杯每日一题(18):李白打酒(python)

    Topic 话说大诗人李白 一生好饮 幸好他从不开车 一天 他提着酒壶 从家里出来 酒壶中有酒2斗 他边走边唱 无事街上走 提壶去打酒 逢店加一倍 遇花喝一斗 这一路上 他一共遇到店5次 遇到花10次 已知最后一次遇到的是花 他正好把酒喝光
  • ecshop中ajax的调用原理 1

    ecshop中ajax的调用原理 1 首先ecshop是如何定义ajax对象的 ecshop中的ajax对象是在js transport js文件中定义的 里面是ajax对象文件 声明了一个var Ajax Transport 对象和一个方
  • 大坝安全监测有哪些监测项目

    大坝安全监测有 工程主体结构 地基基础 两岸边坡 相关设施以及周围环境所作的测量及观察 也包括对建筑物外表及内部大范围对象的定期或不定期的直观检查和仪器探查 通过观测仪器和设备 以及时取得反映大坝和基岩性态变化以及环境对大坝作用的各种数据的
  • centos6.5搭建贴吧云签到平台(多图预警)

    前提 我已经用oneinstack服务搭建好了主机环境LNAMP Linux NginxApache Mysql php 默认目录是 data wwwroot default 详细步骤 1 先下载要安装的文件 我用的是GitHub上star
  • 虚拟机vmware安装win10提示operating system not found解决办法

    首先如果启动提示进入BIOS 则删除下述文件的efi 首先先设置启动PE镜像 加载启动盘PE ISO后进入PE 将系统镜像复制到U盘 PE里先分区 然后再安装 PE里安装完后重启 后面的步骤按自动的即可
  • postman循坏调用接口

    postman循坏调用接口 新建一个Collections 在新建的Collections里面新建需要循环的接口 将需要循坏变化的参数设置成变量 设置好变量之后 运行整个collections 变量值的数量应该与迭代次数一致 可以导入jso
  • YOLOv5+单目测距(python)

    YOLOv5 单目测距 python 1 相关配置 2 测距原理 3 相机标定 3 1 标定方法1 3 2 标定方法2 4 相机测距 4 1 测距添加 4 2 细节修改 可忽略 4 3 主代码 5 实验效果 相关链接 1 YOLOV7 单目
  • python ttk Treeview的插入、清空、各种点击事件、获取条目值、标题单击排序

    昨天整了一天Tkinter的treeview 发现中文的教程乃至提问都很少 其中两个问题的解决都是靠steakoverflow上找到的 在这里放出来我遇到并解决的问题 大家以后可能遇到的话就能省点事了 插入方法 import tkinter
  • 第二章-Kali安装

    目录 2 Kali Linux安装 硬盘安装 虚拟机安装 01硬盘安装 02DOCKER 03虚拟机安装 3 Kali Linux 安装 持久加密USB安装 熟悉环境 熟悉BASH命令 01 持久加密USB安装 1 02 持久加密USB安装
  • 专注于开源技术的研究与应用由Tencent://Message协议想到的一个解决方案

    源代码下载 http files cnblogs com phinecos HelloWorldProtocal rar 前天在BruceZhang 的一篇博文 求助 如何在ASP页面中调用Winform程序呢 中回答了他提出的问题 但细想
  • jsp调用证书类ocx控件问题

    1 先注册ocx 本次使用的方式是先将我调用的两个控件打包成 CAB文件 然后做成一个exe让用户去下载注册 2 jsp页面上使用 进行调用 ps clsid可以在注册表中找到 id是自己定义的 因为控件在第一步已经注册到注册表里 code
  • 重学Elasticsearch7(来源官方文档)

    一 开篇总览 1 bulk操作最好请求体数据大小在5m 15m 2 由于要给文件系统缓存留下足够空间 es的jvm堆大小不要超过服务器可用内存空间的一半 二 聚合 1 在聚合时 missing字段可以给没有该字段的文档以默认值 2 带权重的
  • html登录页面整理

    img src data image png base64 iVBORw0KGgoAAAANSUhEUgAAAycAAAJGCAYAAABBdvriAAAgAElEQVR4Aey9W5okN5KsWUz2qmaxs7zzNEvoSo78Ii
  • java自动化测试语言高级之Java 9 新特性

    java自动化测试语言高级之Java 9 新特性 文章目录 java自动化测试语言高级之Java 9 新特性 Java 9 新特性 Java 9 新特性 Java 9 发布于 2017 年 9 月 22 日 带来了很多新特性 其中最主要的变
  • 内嵌模式搭建Hive

    在此之前已经搭建好了一个三台机器的hadoop集群 https blog csdn net QYHuiiQ article details 123055389 spm 1001 2014 3001 5501 接下来在此基础上搭建hive 下
  • (C++)GDAL学习笔记——1 均值滤波和中值滤波

    就要开始研究生生活了 这个暑假要学一下GDAL相关的知识 这里将中间完成的一些东西Mark下来 方便自己以后回顾 任务 利用Vc 编写一个3 3的均值滤波或中值滤波程序 代码 注 此次试验用到的影像为波段数为1的tif格式影像 主函数 in
  • 2022 年 MathorCup 高校数学建模挑战赛——大数据竞赛赛道 赛道 B:北京移动用户体验影响因素研究

    问题 1 根据附件 1 和附件 2 分别研究影响客户语音业务和上网业务 满意度的主要因素 并给出各因素对客户打分影响程度的量化分析和结果 附件 1 2 中各字段的解释说明见附件 5 问题一本质就是特征筛选问题 而且要给出各特征影响程度的量化