我们以2022年全国服务外包大赛的A03题目作为示例。
  问题的主要任务时找出商品的销量异常和价格异常,提供4个月的商品信息数据,共1700万余条,4个月的店铺信息数据,共60万余条,强调时间复杂度空间复杂度、异常值识别率和准确率。我们用店铺分析辅助商品的异常,以提高可信度和准确率。
  店铺部分数据链接:https://pan.baidu.com/s/1iAp-s2JwG_YTB35BevMNyQ 提取码:jhnb
  但是由于数据分布多样,异常店铺往往和奢侈品店铺以及火爆店铺同时出现,大大降低了我们的准确率。因此我们拟采取如下几个办法解决:

聚类

  思路:

  这样就算部分异常值被归入奢侈品行列,依靠第三步类目索引也会回到大部分的本类店铺所在类别,然后在异常值识别时被识别出来。相当于在总流程中添加了这一步:

  代码如下:

import numpy as np
import pandas as pd
from matplotlib import pyplot as pltpd.set_option('display.max_columns', None)
from sklearn.preprocessing import MinMaxScaler, StandardScaler
from sklearn.cluster import KMeansdef clustering(data):col_sale_amount = ["SHOP_SALES_AMOUNT_x", "Rate_amount", "MAIN_BUSINESS"]sc = StandardScaler().fit(data[col_sale_amount])  # 归一化data[col_sale_amount] = sc.transform(data[col_sale_amount])file_name = "shop_sale_amount_cluster"SSE(data, col_sale_amount, file_name)k_sale_volumn = 4df_cluster_result = Kmeans(data, col_sale_amount, k_sale_volumn, file_name)df_cluster_result[col_sale_amount] = sc.inverse_transform(df_cluster_result[col_sale_amount])df_cluster_result = df_cluster_result.sort_values("index")for i in range(k_sale_volumn):df_cluster_result[df_cluster_result["volumn_cluster"] == i].to_csv(file_name + "/ cluster " + str(i) + ".csv", encoding="utf-8-sig")return df_cluster_resultdef SSE(data, col_name, file_name):SSE = []left = 2right = 16for k in range(left, right):km = KMeans(n_clusters=k)km.fit(data[col_name])SSE.append(km.inertia_)# 肘部法取k值xx = range(left, right)plt.xlabel("k")plt.ylabel("SSE")plt.plot(xx, SSE, "o-")plt.savefig(file_name + "\SSE " + ".png")# plt.show()plt.clf()       # 清图def Kmeans(data, col, k, file_name):km = KMeans(n_clusters=k, random_state=1129).fit(data[col])# print(km.labels_)data["volumn_cluster"] = km.labels_data = data.sort_values(by="volumn_cluster")plt.rcParams["font.size"] = 14colors = np.array(["lightcoral", "pink", "lightsteelblue", "lightseagreen", "grey", "green", "yellow"])# masks = np.array([">", "x", "8", "*"])ele_x = col[0]ele_y = col[1]xx = np.array(data[ele_x])yy = np.array(data[ele_y])cc = np.array(data["volumn_cluster"])plt.scatter(xx, yy, c=colors[cc], s=2)  # c=colors[cc]plt.xlabel(ele_x)plt.ylabel(ele_y)plt.savefig(file_name+"\K_Means " + ".png")plt.show()return datadef main():# 聚类# df_filled_featured为待预测数据df_filled_featured["MAIN_BUSINESS"] = df_filled_featured["MAIN_BUSINESS"].apply(lambda x: dict_MainBussiness[x])df_filled_featured_clustered = clustering(df_filled_featured)print("初步聚类完毕!!!")# 异常值筛选,此处重点不在这里wrong_in_price(df_filled_featured_clustered_boxed, mode="slow")wrong_in_volumn(df_filled_featured_clustered_boxed, mode="slow")if __name__ == '__main__':main()

  关于为什么采取K-Means聚类而不是其他的聚类方法:

  1. K-MEANS聚类的目的只是根据几个特定的指标将商品分为多个种类,利于后面的模型实施与调参;其本意并非寻找离群点。
  2. 异常值数量较少,对聚类中心影响有限。就算收到影响,大部分正常数据类别还是对的,所以我们根据主要业务索引回来,将被归错类的异常值放回本来属于它的聚类。
  3. DBscan和DeBaCL等基于密度聚类算法在初期建树过程中所需空间太大,最多就只能承受3w不到的数据,这对于我们60w+和1700w+的数据大小是非常不友好的。
      聚类结果:

      其中,聚类三四已经筛选出部分异常值变量了:

衍生变量设计

  为了区别异常店铺和奢侈品店铺,一种办法是设计衍生变量,比如店铺商品均价与产业商品均价的均价的比值等等,从这个角度设计衍生变量可以很大程度上缓解奢侈品行业店铺在价格异常店铺以及廉价商品店铺在销量异常店铺中霸屏的现象。
  计算方法其实就是pandas的熟练应用,在此不赘述,可以参考这篇博客:https://blog.csdn.net/Hjh1906008151/article/details/124330708

设置初筛

  有点像上一个解决方法,其实就是找一个切入点。因为我们的目标是寻找销量异常和价格异常,这两种异常在很大程度上会导致销售额增多,因此我们可以考虑设置一个销售额异常作为初筛。这部分的思路的要点就是寻找两种异常的共性。

修改损失函数

  如果这部分有用到神经网络等方法,个人认为可以采取这个办法。因为异常值的加入会导致神经网络在学习时学到不好的特征,要知道数据集数据有问题在神经网络训练中的后果是灾难性的,为了缓解这个问题,可以采用 Minkowski error平滑异常值带来的影响,效果如下:


  优化损失函数之后:

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

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

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

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

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

  3. python 多重列表去重_Python对列表去重的多种方法(四种方法)

    Python对列表去重的多种方法(四种方法) 无聊统计了下列表去重到底有多少种方法.下面小编给大家总结一下,具体内容详情如下: 开发中对数组.列表去重是非常常见的需求,对一个list中的id进行去重, ...

  4. jquery 遍历筛选数组有多种方法与函数

    grep grep()方法用于数组元素过滤筛选 grep(array,callback,invert) array:待过滤数组; callback:处理数组中的每个元素,并过滤元素,该函数中包含两个参 ...

  5. 智科模式识别期末大课设:多种方法对数据集进行手写数字识别(数据集:MINIST)

    0结课作业内容 (1)程序编写及报告. 请大家下载70000个样本的MNIST数据集("手写体数字70000.zip",28*28像素),60000个用于训练,10000个用于测试 ...

  6. 高维数据中特征筛选方法的思考总结——多变量分析筛选法

    前言:之前的文章(高维数据中特征筛选方法的思考总结--单变量分析筛选法)中,对单变量分析筛选变量进行了初步考量,本文将进一步总结多变量分析筛选法.由于本文多处摘录网上的博客,只是进行了归纳整理,因此笔 ...

  7. scala方法中的变量_Scala变量,变量范围,字段变量,方法参数示例

    scala方法中的变量 Variables can be defined as the reserve space in memory to store the assigned values. Ba ...

  8. python怎么读文件内容-Python读取文件内容为字符串的方法(多种方法详解)

    以下笔记是我在 xue.cn 学习群之数据分析小组所整理分享的心得.相关背景是:我选择中文词频统计案例作为考察大家python基础功掌握程度. 以小见大,下面是2个小技能的具体实战: 如何灵活地处理文 ...

  9. 接口里面的方法都是抽象方法吗_单元格区域选取,竟然有这么多种方法,你都造吗?...

    在日常工作中, 怎么能少了Excel表格,相信我,如果你能把Excel用到极致,工作效率可是瞬间提升的,当然,可能还附带升职加薪哟! 关于单元格及单元格区域的选取可以说是Excel中最基本的操作之一, ...

最新文章

  1. 【linux】Valgrind工具集详解(五):命令行详解
  2. java hashmap 重复_java HashMap插入重复Key值问题
  3. mac终端python不能显示中文_Matplotlib为Mac显示中文,ForMac
  4. (021)java后台开发之HttpServletRequest
  5. 【Google Play】Google Play 开放式测试 ( 简介 | 发布开放式测试版本 )
  6. 泛华金控携手神策数据,赋能保险经代公司筑就全闭环智能营销
  7. Oracle中创建、修改、删除序列
  8. 那些年我们踩过的一些坑之 ClickHouse
  9. Java基础知识强化之IO流笔记44:IO流练习之 复制图片的 4 种方式案例
  10. 关于浏览器预检(OPTIONS)请求
  11. 将Win7中的IE11降级为IE8
  12. 互联网史话----十亿美金之51
  13. Renderdoc调试总结
  14. 从技术小白到收获BAT研发offer,分享我的学习经验和感悟(赠送相关学习资料)
  15. 微信公众号开发——微信支付踩坑小记
  16. 复旦大学有计算机网络专业,复旦大学自考本科计算机网络专业介绍
  17. 使用C语言的七个步骤
  18. 金羚纸业化工厂人员定位解决方案,苏州新导助力化工厂人员定位系统实施
  19. 58同城 反爬虫机制及处理
  20. Java忽略返回字段

热门文章

  1. 字节跳动三面面试整理
  2. 愿一切都那么简单 频分,时分,波分,码分以及四个随机访问介质访问控制协议【计网】
  3. 区块链的跨境货币汇款:麦腾支付
  4. 计算机网络常见缩略词
  5. 交叉驰豫的影响因素_石英玻璃的结构弛豫及其影响因素
  6. Echarts自定义地图和添加图标
  7. 贪心1|455.分发饼干|376. 摆动序列|53. 最大子序和
  8. 第三章 函数——自己定义一个函数
  9. POJ No.2386【B007】
  10. python读取docx中表格 图片_python 解析docx文档的方法,以及提取插入的文本对象和图片...