如何评价算法的好坏?
序言
评价一个算法的好坏,我认为关键是看能不能解决问题。如果算法能很好地解决实际的问题,那么我认为就是好算法。 比如预测的算法,关键是看预测的准确率,即预测值与实际值之间的接近程度,而不是看算法本身的评分高低。
在《 如何用人工智能预测双 11 的交易额 》这篇文章中,利用线性回归算法,我预测 2019 年双 11 交易额为 2471 亿元,而阿里官方公布的实际交易额是 2684 亿元,预测值比实际值少 7.9%,对这个结果,我觉得准确率不够高。反思预测的过程,我认为可以从以下几个方面来进行改进。
1. 样本
为了简化算法模型,我舍弃掉了前几年相对较小的数据,只保留了最近 5 年的数据。
在数据量本身就比较少的情况下,我仍然遵循简单原则,这无形中就加大了算法不稳定的风险,出现了欠拟合的问题。
尽管算法的评分很高,但是评分高并不代表算法就好。所以,样本的选择非常重要,不能单纯地追求算法的评分高,而忽略样本的质量。
2. 算法
如果保留所有样本,那么显然数据呈现的规律并不是线性的,用多项式回归算法应该是个更好的选择。
假如用三次多项式回归算法进行预测,那么算法代码如下:
- # 导入所需的库
- import numpy as np
- import pandas as pd
- import matplotlib.pyplot as plt
- from sklearn.linear_model import LinearRegression
- from sklearn.preprocessing import PolynomialFeatures
- from sklearn.pipeline import Pipeline
- from sklearn.preprocessing import StandardScaler
- # 内嵌画图
- %matplotlib inline
- # 设置正常显示中文标签
- plt.rcParams['font.sans-serif'] = ['SimHei']
- # 读取数据,在林骥的公众号后台回复「1111」
- df = pd.read_excel('./data/1111.xlsx')
- # x 年份
- x = np.array(df.iloc[:, 0]).reshape(-1, 1)
- # y 交易额
- y = np.array(df.iloc[:, 1])
- # z 预测的年份
- z = [[2019]]
- # 用管道的方式调用多项式回归算法
- poly_reg = Pipeline([
- ('ploy', PolynomialFeatures(degree=3)),
- ('std_scaler', StandardScaler()),
- ('lin_reg', LinearRegression())
- ])
- poly_reg.fit(x, y)
- # 用算法进行预测
- predict = poly_reg.predict(z)
- # 输出预测结果
- print('预测 2019 年双 11 的交易额是', str(round(predict[0],0)), '亿元。')
- print('线性回归算法的评分:', poly_reg.score(x, y))
预测 2019 年双 11 的交易额是 2689.0 亿元。
线性回归算法的评分:0.99939752363314
下面是用 matplotlib 画图的代码:
- # 将数据可视化,设置图像大小
- fig = plt.figure(figsize=(10, 8))
- ax = fig.add_subplot(111)
- # 绘制散点图
- ax.scatter(x, y, color='#0085c3', s=100)
- ax.scatter(z, predict, color='#dc5034', marker='*', s=260)
- # 设置标签等
- plt.xlabel('年份', fontsize=20)
- plt.ylabel('双 11 交易额', fontsize=20)
- plt.tick_params(labelsize=20)
- # 绘制预测的直线
- x2 = np.concatenate([x, z])
- y2 = poly_reg.predict(x2)
- plt.plot(x2, y2, '-', c='#7ab800')
- plt.title('用多项式回归预测双 11 的交易额', fontsize=26)
- plt.show()
![如何评价算法的好坏?](https://s2.51cto.com/oss/201911/23/cba6cf542cf0bff1436b8791b56632e1.jpeg)
这近乎完美地拟合了 2009 年以来十一年的数据,因此不禁让人怀疑,阿里的数据是不是过于完美?
3. 优化
按照一般的机器学习算法流程,应该把数据拆分为两部分,分别称为训练数据集和测试数据集。从 2009 年到 2018 年,双 11 的交易额总共才 10 个数据,我在预测的时候还舍弃了前 5 个数据,最后只剩下 5 个数据,我以为再拆分就没有必要了。 但机器学习算法的表现好坏,有一个关键因素,就是要有足够多的数据量。
另外,应该适当地使用网格搜索法,优化算法的参数,必要时还要与交叉验证法相结合,进行算法评估,从而提高算法的可信度和准确率。 除了算法的准确率,还可以使用其他的方法对模型进行评价,比如:召回率、F1 分数、ROC、AUC、MSE、RMSE、MAE 等等 。
现实世界是错综复杂的,很难用一个算法就解决问题,往往需要经过很多次的尝试,才可能找到基本符合的模型。需要注意的是,多项式回归的指数不宜过高,否则算法太复杂,很可能出现“过拟合”的现象,从而泛化能力比较差,也就是说,对于训练数据集能够很好地拟合,但是对于测试数据集的预测误差比较大。模型复杂度与预测误差的大致关系如下图所示:
![如何评价算法的好坏?](https://s5.51cto.com/oss/201911/23/942c1f8f851520c95b96439918e30dab.jpeg)
小结
本文是我在用线性回归算法预测双 11 的交易额之后,做的一次复盘,总结了改进的思路,学习优化的方法。
学以致用,是我学习的基本原则。如果害怕出错,不去勇于实践,学习再多算法有什么用?这就如同我们不能指望不下水就学会游泳一样。
以上,希望能够对你有所启发。
相关文章
- AWS 连续 10 年获评 Gartner 基础设施与平台服务魔力象限中的领导者
- 对 PyTorch BERT 模型进行微调,并将其部署到 Amazon SageMaker 上的 Amazon Elastic Inference
- 高盛如何通过 AWS PrivateLink 构建起接入 Amazon MSK 集群的跨账户连接体系
- REA Group 如何利用 Amazon Rekognition 实现自动化图像合规审查
- 在 Amazon SageMaker notebook 实例上使用 R 编程
- AWS Content Analysis 解决方案介绍
- 教育网站 ApplyBoard 使用 CloudWatch Container Insights 监控关键任务 EKS 环境
- TUNA 开源镜像站分站在由西云数据运营的 AWS 中国(宁夏)区域上正式上线并开放服务
- 宣布在洛杉矶推出第二个本地区域
- Python Tkinter 之Frame控件(Python GUI 系列4)
- 轻松便捷为 AWS WAF 部署一套仪表板
- 将 Linux 实例无缝加入适用于 Microsoft Active Directory 的 AWS Directory Service 中
- 使用 Route 53 解析器查询日志记录您的 VPC DNS 查询
- 使用 AWS Transcribe 配合物联网设备构建一套支持多语种的语音到文本通知系统
- 在 Amazon EMR 上监控 Spark Streaming 应用程序
- 使用应用程序负载均衡器在私有子网内安全访问 Amazon EMR Web 接口
- 在 Amazon EMR 上使用 Dr. Elephant 与 Sparklens 实现 Hadoop 与 Spark 性能调优
- Bottlerocket:一套专用型容器操作系统
- 开发者指南:当 Amazon EFS 遇上 Amazon ECS 与 AWS Fargate——第一部分
- 聊聊 AWS Fargate 在容器世界中的角色定位