使用 Python 进行基于机器学习的数据预测
机器学习,大家可能没有听说过,但大家一定听说过 AI,机器学习就是 AI 的底层技术之一。
本篇文章,我们会尝试使用 Python 构建一个机器学习模型,实现对数据的预测。
数据准备
本次使用的是简书文章收益排行榜数据,共有 2900 条,记录了 29 天来每天文章收益排行榜前 100 篇文章的数据。
我们需要构建一个机器学习模型,根据文章的排名对收益进行预测。
我们使用 Jupyter Notebook 进行交互式开发。
先来导入我们所需的库:
import pandas as pd
import numpy as np
import sqlite3
如果在导入过程中出现ImportError
,请使用pip install 包名
安装库,然后尝试重新导入。
我们的数据已经放在了项目目录下,是一个 SQLite 数据库,名称为ArticleFPRankList.db
。
使用以下代码将数据转换为 Pandas DataFrame:
conn = sqlite3.connect("ArticleFPRankList.db")
df = pd.read_sql_query("SELECT * FROM articlefpranklistdata", conn)
我们来简单查看一下数据:
df.head(10)
image
df.info()
image
我们可以看出,数据共有 10 列,但中间几列的数据用处不大,真正有用的是后面的三列和前面的 ranking(排名)列。
数据有缺失,这是作者主动删除文章造成的,但关键的几列数据都是完整的,不影响我们的分析。
初步分析
在构建模型之前,我们需要对数据有大致的了解。
导入 plotly 库用于绘图:
import plotly.express as px
plotly 对 DataFrame 中数据的绘图操作做了很完善的封装,所以我们只需要这样一行代码:
px.bar(df, x="date", y="total_fp")
image
得到的结果是一张堆积柱形图,其中每一列代表一天的数据,收益高的文章排在下方。
从中我们可以看出,每天的收益分配总量是大致保持不变的,而每个名次的文章,其获得的资产量也大致相同,所以我们判定这些数据是可预测的。
数据预处理
在构建模型前,我们需要对数据进行预处理。
简单说明一下模型预测的流程:我们需要两个由二维数组构成的数据集,分别为标志集(x)和数值集(y),将这两个数据集传入,程序会拟合出一个算法,用于描述 y 随 x 的变动关系,也可以称为 y=f(x)。
现在让我们来构建 x 和 y:
x = np.array(df["ranking"]).reshape(-1, 1)
y = np.array(df["total_fp"]).reshape(-1 ,1)
这里的 reshape() 函数是为了将一维数组转换成二维数组。
为了对模型进行打分,我们需要将数据集分为两部分:训练集和测试集。顾名思义,训练集用于对模型进行训练,测试集用于检验训练效果。
sklearn 中已经集成了这个功能,我们只需要导入:
from sklearn.model_selection import train_test_split
然后:
x_train, x_test, y_train, y_test = train_test_split(x, y, train_size=0.2)
现在来看看我们的训练集,以 y_train 为例:
image(由于一些问题,这里展示的图片是一个三列数据的数组,实际数据是一个一列的数组)
不错不错,现在可以开始训练了。
模型训练
在分析阶段中,我们发现数据的变化幅度并不是很大,所以这次使用的算法是LogisticRegression
(普通最小二乘法),它的原理我们暂时不需要了解,只要导入模块:
from sklearn.linear_model import LinearRegression
然后使用以下两行代码训练模型:
model = LinearRegression()model.fit(x_train, y_train)
接下来,我们使用测试集的数据对模型打分:
model.score(x_test, y_test)
在我的操作中,这个模型的准确率为 22.31%,看起来不是很高,为什么呢?因为数据集太少了,对每个排名,只有二十九个数据,其中还有五分之一用于测试。
如果数据量增加到一万甚至更高,模型的准确率就会大幅度上升。
对模型调用 predict 函数即可预测数据,例如:
model.predict([[1]])
我得到的结果是array([820.82074298])
,由于训练集的拆分是随机的,所以你的结果可能有所不同。
模型的保存与使用
我们使用 Python 自带的数据持久化库 pickle 来保存模型。
import picklewith open("model.pkl", "wb") as file: pickle.dump(model, file)
运行之后,项目目录中会生成一个名为model.pkl
的文件,这就是我们的模型。
这个模型本质上只是储存了一个函数的参数,所以不会很大,但如果使用更高级的模型,预测更加准确的同时也会增加模型的体积。
而真正的 AI 中使用的是神经网络模型,保存时要存储所有神经元的权重信息,有时大小能达到几十 GB,当然,训练时间也大多是按天计算的。
创建 predict.py
文件,输入以下代码:
import picklewith open("model.pkl", "rb") as file: model = pickle.load(file)x = [[int(input("请输入您要预测的文章排名:"))]]result = model.predict(x)[0]print(f"文章的预估收益为 {round(result, 3)}")
运行程序,输入文章排名,返回的结果与刚刚的完全一致。
拓展:使用 Streamlit 搭建网页
Streamlit 是一个 Python 库,旨在帮助数据科学从业者更高效地搭建展示应用。
创建web_app_with_streamlit.py
文件,输入以下代码:
import streamlit as stimport pickle@st.cache()def GetModel(file_name): with open(file_name, "rb") as file: return pickle.load(file)@st.cache()def GetPerdictResult(model, x): return model.predict([[x]])[0]st.title("文章收益预测工具")file_name = st.text_input("模型文件名", value="model.pkl")x = st.number_input("文章排名", min_value=1, max_value=100)model = GetModel(file_name)result = GetPerdictResult(model, x)st.write(f"文章预期收益为 **{round(result, 3)}**")
保存文件,然后输入以下命令:
streamlit run web_app_with_streamlit.py
浏览器会自动打开,你将看到一个网页:
image你可以更改输入框中的值,程序将实时计算出结果,并显示在下方。
如果你把这个程序上传到服务器,他人就可以通过访问网页直接使用,不需要训练模型,设备上甚至不需要安装 Python。
你可以在服务端随时修改代码,或是将模型文件进行替换,只需要刷新网页,就可以应用最新的更改。
总结
本篇文章讲述了使用 sklearn 进行数据预测的基本过程,同时编写了一个 Web App 供用户直接使用。
受篇幅所限,有很多知识没有在本文中提到,例如:
- 机器学习模型的选择
- 模型参数优化
- 更高效的模型存储格式
- Streamlit 网页的部署
如果大家感兴趣,可以自行查阅相关资料。
现在,我们所使用的翻译网站、语音助手、人脸识别等服务,其原理都是机器学习技术。数据经过采集、预处理等一系列环节之后,被工程师变成一个个模型文件,其中存储了无数参数,用来描述数据的内在规律,继而对新的数据进行预测。
人工智能研究团队 OpenAI 训练的人工智能模型 GPT-3 拥有 1750 亿参数,训练使用的数据量多达 45TB,但他们并没有公开这个模型,只提供了一些 API 供人们进行使用。
因为他们担心,这样强大的人工智能技术可能对社会产生不利影响。
当今社会,你使用的每一个 App 都可能收集你的行为数据,将你的操作转化为某个神经元中的一个权重参数,然后用这个模型实现更好的推荐机制,继而提高用户的留存率。
作为一名技术人,也许我们需要先掌握它,然后才能回答这个问题:
技术发展到这个高度,对人类真的有益吗?