我们以2022年全国服务外包大赛的A03题目作为示例代码演示缺失值填补过程。
  问题的主要任务时找出商品的销量异常和价格异常,提供4个月的商品信息数据,共1700万余条,4个月的店铺信息数据,共60万余条,强调时间复杂度空间复杂度、异常值识别率和准确率。我们用店铺分析辅助商品的异常,以提高可信度和准确率。但是店铺主要业务中存在较多缺失,对之后衍生变量计算有较大影响。
  店铺部分数据链接:https://pan.baidu.com/s/1iAp-s2JwG_YTB35BevMNyQ 提取码:jhnb
  个人认为,缺失值填补本质上是一个预测问题,因此,在随机森立算法效果不佳的情况下,我们采取一个AutoML工具hyperGBM(中文使用说明:https://hypergbm.readthedocs.io/zh_CN/latest/example.html)在10个模型中选取效果最好的模型预测缺失值。事实上这是一个分类问题,我们借助店铺的业务范围预测店铺的主要业务。因为店铺的业务范围长短不同,所以我们根据店铺的范围的长度将数据集分为13个部分,分别对这13个部分进行模型训练填补缺失值。在整体流程中这属于第一步缺失值填补:

import numpy as np
import pandas as pdpd.set_option('display.max_columns', None)
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import MinMaxScaler, StandardScaler
from sklearn.metrics import get_scorer, classification_report
from hypergbm import make_experiment
import os
import pickledef normalize(file, group):min_max = MinMaxScaler(feature_range=(0, 1))ret = fileret[file.columns[group]] = min_max.fit_transform(file[file.columns[group]])return retdef make_number(df_file):dic_main_bussiness_labels = df_file.value_counts("MAIN_BUSINESS").to_dict() # 建字典,value后转编号no = 0          # 统计字符数,当编号for key, value in dic_main_bussiness_labels.items():dic_main_bussiness_labels[key] = nono += 1df_file["MAIN_BUSINESS"] = [dic_main_bussiness_labels[name] for name in df_file["MAIN_BUSINESS"]]   # 字符转编号list_main_scope = list()    # 存储每行的 范围set_main_scope = set()      # 统计范围的每个的名字,后转编号for name in df_file["BUSINESS_SCOPE"]:try:new = name.split(",")          # 对每行的统计except:new = str(name).split(",")   # 这破玩意有的没引号while "" in new:  # 判断是否有空值在列表中new.remove("")  # 如果有就直接通过remove删除list_main_scope.append(new)set_main_scope.update(new)          # 更新setset_main_scope_num = {i for i in range(len(set_main_scope))}   # 生成编号dic_mainscope_labels = dict(zip(set_main_scope, set_main_scope_num))       # 靠zip把两个set合到一起list_num_main_scope = list()            # 按照行存贮向量化的结果count = list()                          # 统计每行的main scope的长度,后面填补缺失值有用for item in list_main_scope:temp = []for bussiness in item:temp.append(dic_mainscope_labels[bussiness])list_num_main_scope.append(temp)count.append(len(temp))df_file["BUSINESS_SCOPE"] = list_num_main_scopedf_file["count"]=countreturn df_file.drop(axis=1, columns="Unnamed: 0"), dic_main_bussiness_labels, dic_mainscope_labels  # 去掉那个莫名其妙的行def make_number_Nan(df_Nan, dict_Scope):    # 向量化含缺失值的list_main_scope = []index_insetead = [i for i in range(df_Nan.shape[0])]df_Nan.index = index_inseteadfor name in df_Nan["BUSINESS_SCOPE"]:try:new = name.split(",")except:new = str(name).split(",")  # 这破玩意有的没引号list_main_scope.append(new)list_num_main_scope = list()count = list()hema_index = list()         # 处理盒马for i, item in enumerate(list_main_scope):temp = []for bussiness in item:try:temp.append(dict_Scope[bussiness])except:                 # 如果是盒马if(bussiness!=""):temp.append(16)     # 16,目前最大16hema_index.append(i)list_num_main_scope.append(temp)count.append(len(temp))df_Nan["BUSINESS_SCOPE"] = list_num_main_scopedf_Nan["count"] = countfor i in hema_index:    # 直接编号盒马df_Nan.at[i, "MAIN_BUSINESS"] = 33df_hema = df_Nan[df_Nan["MAIN_BUSINESS"] == 33]df_Nan = df_Nan.drop(df_Nan.index[hema_index])      # 编号盒马return df_Nan.drop(axis=1, columns="Unnamed: 0"), df_hema.drop(axis=1, columns="Unnamed: 0")def fill_null(df_no_Nan, df_has_Nan, dict_BussinessScope):# stopline = [[], [], [], [], [], [], [], [], [], [24], [], [24], [], [24], []]    # 每种只出现一次的,不利于训练,去掉# print(df_no_Nan["count"].value_counts())  #print("预测数据长度:\n", df_has_Nan["count"].value_counts())   # 0-13df_predict_result = df_no_Nan               # 最终结果存这里for i in range(1, 14):      # 因为predict最多到13  把不同长度的分别训练# 这里把不同长度main scope切开col_names = ["col"+str(col_name) for col_name in range(i)]              # 生成列名train_data = df_no_Nan[df_no_Nan["count"] == i][["BUSINESS_SCOPE", "MAIN_BUSINESS"]]     # 根据列表长度训练train_data = train_data.groupby("MAIN_BUSINESS").filter(lambda x: (len(x) >= 5))print(train_data.value_counts("MAIN_BUSINESS"))predict_data = df_has_Nan[df_has_Nan["count"] == i]df_train_devided = train_data['BUSINESS_SCOPE'].apply(pd.Series, index=col_names)   # 切开商业范围df_predict_devided = predict_data['BUSINESS_SCOPE'].apply(pd.Series, index=col_names)train_data = pd.concat([df_train_devided, train_data.drop(columns="BUSINESS_SCOPE", axis=1)], axis=1) # 合并列# train_data = train_data[~train_data['MAIN_BUSINESS'].isin(stopline[i])]     # 去除那几个只有一个的predict_data_test = pd.concat([df_predict_devided, predict_data[["BUSINESS_SCOPE", "MAIN_BUSINESS"]].drop(columns="BUSINESS_SCOPE", axis=1)], axis=1)       # 预测数据# 分出训练集和验证集try:x_train, y_train = train_test_split(train_data, random_state=1129, test_size=0.2, stratify=train_data["MAIN_BUSINESS"])except:x_train, y_train = train_test_split(train_data, random_state=1129, test_size=0.2)# print(train_data.value_counts('MAIN_BUSINESS'))try:y_train, z_train = train_test_split(y_train, random_state=1129, test_size=0.5, stratify=y_train["MAIN_BUSINESS"])except:y_train, z_train = train_test_split(y_train, random_state=1129, test_size=0.5)# 转成csv,不然那个不接x_train.to_csv("train.csv", encoding="utf-8-sig")y_train.to_csv("eval.csv", encoding="utf-8-sig")predict_data_test.to_csv("test.csv", encoding="utf-8-sig")exp = make_experiment("train.csv", test_data=None, eval_data="eval.csv", target='MAIN_BUSINESS', reward_metric='accuracy', log_level='info', class_balancing='ClassWeight', cv=True)    # 模型参数estiamtor = exp.run()               # 跑模型with open('model'+str(i)+' .pkl', 'wb') as f:pickle.dump(estiamtor, f)print("完事!!\n\n")# 评价模型z_pred = estiamtor.predict(z_train.drop(axis=1, columns="MAIN_BUSINESS"))# print(y_pred)# print(y_train["MAIN_BUSINESS"].tolist())print(classification_report(z_train["MAIN_BUSINESS"].tolist(), pd.Series(z_pred, index=z_train.index), digits=5))# 预测pred_proba = estiamtor.predict_proba(predict_data_test)result = np.argmax(pred_proba, axis=1)predict_data["MAIN_BUSINESS"] = result  # 存储结果predict_data.to_csv("填补后店铺数据"+str(i)+".csv", encoding="utf-8-sig")df_predict_result = pd.concat([df_predict_result, predict_data], axis=0)    # 合并到最终结果里# 处理垃圾os.remove("test.csv")os.remove("train.csv")os.remove("eval.csv")df_predict_result.to_csv("填补后店铺数据.csv", encoding="utf-8-sig")return df_predict_resultdef main():df_file = pd.read_csv("../new feature/店铺数据.csv", encoding="utf-8-sig")# 筛选无缺失的(主要商业范围) 缺了57871,商业范围缺了5045,都缺的是4928df_NoNan = df_file.dropna(axis=0, how='any', subset=["MAIN_BUSINESS"])# 有缺失的(主要业务)df_has_Nan = df_file[df_file[["MAIN_BUSINESS"]].isnull().T.any()]# 找出缺主要业务但是商业范围不缺的df_has_Nan.dropna(axis=0, how='any', subset=["BUSINESS_SCOPE"])[["MAIN_BUSINESS", "BUSINESS_SCOPE"]]# 向量化(其实就是给那俩编号)df_NoNan_numbered, dict_MainBussiness, dict_BussinessScope = make_number(df_NoNan)df_has_Nan_numbered, df_hema = make_number_Nan(df_has_Nan, dict_BussinessScope)df_NoNan_numbered = pd.concat([df_NoNan_numbered, df_hema])     # 把盒马合并进来dict_MainBussiness.update(zip({"盒马"}, {33}))  # 处理盒马dict_BussinessScope.update(zip({"盒马"}, {16}))print("主要业务编号词典:\n", dict_MainBussiness)print("业务范围词典:\n", dict_BussinessScope)dict_numbers_to_MainBussiness = dict([value, key] for key, value in dict_MainBussiness.items())  # 制作反向传导dict_numbers_to_BussinessScope = dict([value, key] for key, value in dict_BussinessScope.items())print("向量化完毕!!!")# 缺失值填补df_fill_null = fill_null(df_NoNan_numbered, df_has_Nan_numbered, dict_BussinessScope)print("缺失值填补完毕!!!")

  后面几组数据由于维度较高且数据量较少,所以预测的准确率较低,因此准确率较低,因为数据较少,我们采取人工手动标注的方法填补缺失值。
  模型调参结果图:
相关文章
  数据概览与预处理https://blog.csdn.net/Hjh1906008151/article/details/124313507
  衍生变量计算(缺失值填补就是为了计算衍生变量)https://blog.csdn.net/Hjh1906008151/article/details/124330708
  异常值识别基础方法https://blog.csdn.net/Hjh1906008151/article/details/124342492
  基于pyod的异常值识别方法https://editor.csdn.net/md/?articleId=124340047
  异常值识别效果不佳的解决思路https://blog.csdn.net/Hjh1906008151/article/details/124341064

基于自动机器学习工具hyperGBM的异常值识别中缺失值填补问题(含2022年全国服务外包大赛实例)相关推荐

  1. 基于简单的机器学习方法等异常值识别方法(含2022年全国服务外包大赛实例)

      我们以2022年全国服务外包大赛的A03题目作为示例代码演示异常值识别过程.   问题的主要任务时找出商品的销量异常和价格异常,提供4个月的商品信息数据,共1700万余条,4个月的店铺信息数据,共 ...

  2. 多种方法(聚类、衍生变量、多重筛选、损失函数)解决解决异常值识别效果不佳问题(含2022年全国服务外包大赛实例)

      我们以2022年全国服务外包大赛的A03题目作为示例.   问题的主要任务时找出商品的销量异常和价格异常,提供4个月的商品信息数据,共1700万余条,4个月的店铺信息数据,共60万余条,强调时间复 ...

  3. 数据分析问题(异常值识别)中数据预处理部分流程(含2022年全国服务外包大赛实例)

      博主个人理解的数据预处理主要包括 个方面:读取文件 => 数据概览 => 缺失值填补 => 数据分布预览 => 衍生特征设计.这套流程在完成异常值识别时作为数据预处理时没有 ...

  4. pandas在数据分析(异常值识别问题)中的应用,以衍生特征计算为例(含2022年全国服务外包大赛实例)

      我们以2022年全国服务外包大赛的A03题目作为示例代码演示衍生特征计算过程.   问题的主要任务时找出商品的销量异常和价格异常,提供4个月的商品信息数据,共1700万余条,4个月的店铺信息数据, ...

  5. 微软开源的自动机器学习工具上新了:NNI概览及新功能详解

    作者 | 宋驰 来源 | 微软研究院AI头条(ID: MSRAsia) 2018年9月,微软亚洲研究院发布了第一版 NNI (Neural Network Intelligence) ,目前已在 Gi ...

  6. 微软开源自动机器学习工具 – NNI安装与使用

    微软开源自动机器学习工具 – NNI安装与使用 NNI的众多特点 开启你的第一次NNI之旅 · 安装 · 三步准备实验 (1) 准备搜索空间 (2) 准备实验代码 (3)定义实验配置 · 一行命令开始 ...

  7. 微软nni_微软开源自动机器学习工具NNI安装与使用

    微软开源自动机器学习工具NNI安装与使用 发布时间:2018-12-29 11:51, 浏览次数:951 , 标签: NNI 微软开源自动机器学习工具 – NNI安装与使用 在机器学习建模时,除了准备 ...

  8. AI之AutoML:Ludwig(无需编写代码/易于使用的界面和可视化自动机器学习工具)的简介、安装、使用方法之详细攻略

    AI之AutoML:Ludwig(无需编写代码/易于使用的界面和可视化自动机器学习工具)的简介.安装.使用方法之详细攻略 目录 Ludwig的简介 Ludwig(无需编写代码/易于使用的界面和可视化自 ...

  9. 基于深度机器学习算法DBNs的风险识别模型

    前言:最初关注深度机器学习是听了NUS的汪晟博士关于深度机器学习平台SIGNA的介绍,当时就发现深度机器学习是人工智能的一个革新的进步.但是由于从事的云计算和大数据方向的工作,所以平时只是作为自己的兴 ...

最新文章

  1. golang 基础知识4
  2. 深入全面探究有未经处理的异常: 0xC00000FD: Stack overflow(栈溢出)问题!
  3. Java 8中处理集合的优雅姿势——Stream
  4. .NET速度的问题,不是最重要的
  5. wps多人协作后怎么保存_剥开的柚子怎么保存 柚子剥开后可以放几天
  6. 写一个测试工具类,只在debug时运行,而release时自动移除代码,适用于gradle项目(idea,android studio等)
  7. 你绝对能懂的“机器学习”(二)
  8. 索尼a5100_索尼相机分类,买相机不再发愁
  9. 把一个函数作为参数传入到函数中
  10. java解析html jsoup_2020-06-02 jsoup java解析html
  11. linux离线安装virtualen,在Virtualbox中安装PuppyLinux实录三
  12. 数据库增加列或删除列操作
  13. 移动设备 计算机设备,移动设备
  14. Linux 操作系统原理介绍
  15. IDEA开发工具当前窗口导入多个项目
  16. Android Instant Run介绍
  17. NoSQL数据库Redis--1
  18. 适合中小型企业的OA系统网上试用整理
  19. js是什么、html、css
  20. docker实战学习2022版本(四)之不灭星辰

热门文章

  1. MT7628学习笔记(8)——开发板联网(以太网和WIFI模式)
  2. ios 去掉底部状态栏_iOS状态栏隐藏及显示问题终极解决方案
  3. Fiddler 高级用法:Fiddler Script 与 HTTP 断点调试
  4. html五角形代码,五角星.html · woshiluowenhao/TestWeb - Gitee.com
  5. origin画ROC曲线
  6. 2019杭州江干区中小学学区划分一览表
  7. 网购秒杀系统架构设计
  8. minio几种访问策略
  9. Python中,删除列表中包含某个数的所有元素
  10. 0基础都能看懂的SpringCloud,不容错过!