【机器学习】数模-解题套路(大数据向)

大数据
后台-插件-广告管理-内容页头部广告(手机)

背景

关于大数据方向的数学建模比赛,比如:Mathcup等都需要对CSV或者Excel文件进行数据分析。那么如何快速的进行数据整理和分析呢?下面我以python这个工具为例子,分享一下整体思路和源码。

(注:以下代码运行的文本环境为Jupyter;本文默认读者已经对Python有初步了解)

数据初步分析和整理

针对python语言进行编程,在进行数据分析前我们还需要导入一些必要的库文件,如下代码所示:(注:没有的外置库记得自己pip下载一下哦)

# 导入相关库文件import pandas as pdimport copyimport numpy as npfrom math import isnanimport lightgbm as lgbfrom sklearn.model_selection import KFold, cross_val_score, train_test_split# from sklearn.model_selection import StratifiedKFoldfrom scipy import stats# 画画相关库%matplotlib inlineimport matplotlib.pyplot as pltimport seaborn as snsplt.style.use('ggplot')  #风格设置近似R这种的ggplot库sns.set_style('whitegrid')

第一步 数据清洗

我们以2022年Mathcup数学建模大赛的赛道B的附件1为例子进行分析。下面是查看有哪些特征存在缺省值的代码:

# 读取附件1和3的数据附件1 = './附件1语音业务用户满意度数据.CSV'speech_train = pd.read_csv(附件1, low_memory=False, encoding='gbk')# 查看缺省值超过0.2的特征列check_null = speech_train.isnull().sum(axis=0).sort_values(ascending=False)print(check_null[check_null>0])

对于缺省值超过20%的特征采用80%法则,就是把那一列特征删除。下面是删除代码:

# 需要删除的特征:用户描述.1  是否关怀用户  用户描述  重定向驻留时长  重定向次数  是否去过营业厅# 消除NAN数量大于20%的列thresh_count = len(speech_train)*0.8 # 设定阀值speech_train = speech_train.dropna(axis=1, how='any', thresh=thresh_count)speech_train.drop(['用户id'],axis=1,inplace=True)speech_train.describe()

对于存在少量缺省值和异常值的特征采用统计指标(均值、中位数等)填充。下面是少量缺省值填充代码:

speech_train['前第3个月欠费金额'] = speech_train['前第3个月欠费金额'].fillna(0)speech_train['客户星级标识'] = speech_train['客户星级标识'].fillna('三星')speech_train['是否实名登记用户'] = speech_train['是否实名登记用户'].fillna('否')speech_train['是否5G网络客户'] = speech_train['是否5G网络客户'].fillna('否')speech_train['是否4G网络客户(本地剔除物联网)'] = speech_train['是否4G网络客户(本地剔除物联网)'].fillna('是')speech_train['终端品牌类型'] = speech_train['终端品牌类型'].fillna('A2223')speech_train['终端品牌'] = speech_train['终端品牌'].fillna('华为')speech_train['当月欠费金额'] = speech_train['当月欠费金额'].fillna(0)speech_train.columns

第二步 特征工程

特征工程的主要目标就是“类别(object)”数据,我们要对这些数据进行编码处理。但是在开始之前我们需要查看一下这些数据有哪些,代码如下所示:

#初步了解“Object”变量概况pd.set_option('display.max_rows',None)speech_train.select_dtypes(include=['object']).describe().T

对部分类别特征数据进行标签编码、独热编码和字典编码,然后进行特征构造并删除重复信息的字段,同时对部分数值特征进行特征缩放。代码如下所示:

#标签编码def coding(col, codeDict):    colCoded = pd.Series(col, copy=True)    for key, value in codeDict.items():        colCoded.replace(key, value, inplace=True)    return colCoded#'把是否实名登记用户' '是否5G网络客户' '是否4G网络客户(本地剔除物联网)'编码为登记=1, 没登记=0:speech_train['是否实名登记用户'] = coding(speech_train['是否实名登记用户'], {'否':0,'是':1 })speech_train['是否5G网络客户'] = coding(speech_train['是否5G网络客户'], {'否':0,'是':1 })speech_train['是否4G网络客户(本地剔除物联网)'] = coding(speech_train['是否4G网络客户(本地剔除物联网)'], {'否':0,'是':1 })

上面所示为标签编码,下面是字典编码。

# 生成百分比对应浮点数的字典:'17.0%':17.0def dict_code(col1):    temp_dict = dict(col1.value_counts())    for key in temp_dict.keys():        temp_dict[key] = float(key.strip('%'))    return temp_dict# 把外省语音占比百分比 改成浮点数speech_train['外省语音占比'] = coding(speech_train['外省语音占比'], dict_code(speech_train['外省语音占比']))# 把外省流量占比百分比 改成浮点数speech_train['外省流量占比'].replace('#DIV/0!', '0.0%', inplace=True)  # '#DIV/0!' 把这个用0替代speech_train['外省流量占比'] = coding(speech_train['外省流量占比'], dict_code(speech_train['外省流量占比']))speech_train['外省流量占比'].describe()

最后是one-hot独热编码。

#变量用one-hot编码n_columns = ['4\\5G用户', '语音方式', '终端品牌', '终端品牌类型', '客户星级标识']dummy_df = pd.get_dummies(speech_train[n_columns])# 用get_dummies进行one hot编码speech_train = pd.concat([speech_train, dummy_df], axis=1) #当axis = 1的时候,concat就是行对齐,然后将不同列名称的两张表合并speech_train = speech_train.drop(n_columns, axis=1)

第三步 特征选择

通过逻辑回归(LogisticRegression)分类器建立递归特征消除筛选器,并利用该筛选器获取相关性最强的特征簇。

#构建X特征变量和Y目标变量x_val = speech_train.copy()y_val = speech_train['语音通话整体满意度']# wrapper方法进行特征提取from sklearn.feature_selection import RFEfrom sklearn.linear_model import LogisticRegression# 建立逻辑回归分类器model = LogisticRegression(solver='liblinear', random_state=123, n_jobs=1, max_iter=5000)# 建立递归特征消除筛选器rfe = RFE(model, n_features_to_select=30)  # 通过递归选择特征,选择30个特征rfe = rfe.fit(x_val, y_val)col_filter = x_val.columns[rfe.support_] #通过布尔值筛选首次降维后的变量col_filter # 查看通过递归特征消除法筛选的变量

简单来说就是降维了,把被one-hot编码后的高维特征降低成30维。这样就可以很大程度减少冗余特征。让我们的模型得到的特征与我们需要预测的特征关系更加密切(love&peace)。

第四步 量化分析

建立随机森林模型分类器对目标变量和特征簇进行拟合分析,最终量化各因素对客户打分影响程度。代码如下:

# 添加之后需要预测的特征new_columns = ['网络覆盖与信号强度','语音通话清晰度','语音通话稳定性']new_speech_train = pd.concat([x_val[col_new],x_val[new_columns]],axis=1)names = new_speech_train.columns# 随机森林算法判定特征的重要性from sklearn.ensemble import RandomForestClassifierclf=RandomForestClassifier(n_estimators=10, random_state=123, n_jobs=-1)  # 构建随机森林分类器clf.fit(new_speech_train, y_val)  # 对自变量和因变量进行拟合for feature in zip(names, clf.feature_importances_):    print(feature)

总结

在拿到数据后按照上面四个步骤一步一步的来肯定不会是无用功的,你会得到你想要的与预测值最相关的特征,并且还可以为之后的模型预测做铺垫。最后再添加上附件1的数据链接,希望能给各位读者一些帮助(链接:https://pan.baidu.com/s/1exDpejHzI0puY2hLCziMcw 。提取码:xch7 )。

后台-插件-广告管理-内容页尾部广告(手机)
标签:

评论留言

我要留言

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。