大家好!我是新人唱跳 rap 打篮球,是一个立志 2025 年开始每周都能水一篇文章的人
之前我们介绍了什么是机器学习,机器学习是一种从数据生成规则、发现模型,来帮助我们预测、判断、分析和解决问题的技术。
了解了这些我们就可以尝试跑一些例子了,但你还需要掌握一个知识点,机器学习项目分为哪些步骤,才能开始你的训练
一个机器学习项目大致分为五个步骤:定义问题、收集数据和预处理、选择算法和确定模型、训练拟合模型、评估并优化模型性能。
今天来一起学习下定义问题和预处理数据
在定义问题这个环节中,我们要剖析业务场景,设定清晰的目标,同时还要明确当前问题属于哪一种机器学习类型。
首先我们得了解一下我们项目的业务场景。假设你是网络平台的运营人员,对微信推广文案的运营效率进行分析。
你收集了大量文案的数据,包括点赞数、转发数和浏览量等等,就像下面一样
点赞数 | 转发数 | 热度指数 | 文章评级 | 浏览量 |
---|---|---|---|---|
2646 | 1347 | 7 | 5 | 260004 |
816 | 816 | 4 | 6 | 100004 |
1224 | 612 | 6 | 5 | 164502 |
1261 | 1261 | 6 | 6 | 163001 |
1720 | 1720 | 7 | 5 | 260401 |
1541 | 1541 | 7 | 5 | 220002 |
微信公众号阅读量超过 10 万之后,就不能显示它的具体阅读量了。
针对这个问题,我们的目标,建立一个机器学习模型,根据点赞数和转发数等指标,估计一篇文章能实现多大的浏览量。
估计浏览量,所以在这个数据集中:点赞数、转发数、热度指数、文章评级,这个 3 个字段都是特征,浏览量就是标签。
这里已经有要估计的标签了,所以这是一个监督学习问题。
再加上我们的标签是连续性的数值,因此它是一个回归问题。
在这个数据集中,特征和标签之间明显呈现一种相关性。
点赞数、转发数多的时候,往往浏览量也多。
但是,这种相关性可以通过哪个具体的函数来描述呢?目前我们还不知道,所以我们在这个项目中的任务就是找到这个函数。
数据的收集和预处理 在所有机器学习项目中都会出现,它的作用是为机器学习模型提供好的材料。
数据好,模型才跑得好,数据的收集和预处理其实包含了很多步骤,大致分为下面六个步骤
在神经网络和深度学习出来后,这些步骤的投入也不像以前那么多了
我们的项目中,已经把它做好了,你可以在这里下载现有的数据集
我们可以使用下面的代码进行这些步骤
import pandas as pd
# 可视化
df_ads = pd.read_csv('data.csv')
print(df_ads.head())
# 导入数据可视化所需要的库
import matplotlib.pyplot as plt
import seaborn as sns
# 设置全局字体为 SimHei(黑体)[3,7,11](@ref)
plt.rcParams['font.sans-serif'] = ['SimHei']
# 解决负号显示异常[5,11](@ref)
plt.rcParams['axes.unicode_minus'] = False
plt.plot(df_ads['点赞数'], df_ads['浏览量'],'r.',label='Training data')
plt.xlabel('点赞数')
plt.ylabel('浏览量')
plt.legend()
plt.show()
图
从这种图中可以看出来,这些数据基本上集中在一条线附近
它的标签和特征之间,好像是真的存在着线性的关系,这可以为我们选模型提供参考信息。
使用 Seaborn 的 boxplot 工具画个箱线图
看这个数据集里有没有 “离群点”,这里随便选择了热度指数这个特征,你也可以为其他特征试试绘制箱线图。
data = pd.concat([df_ads['浏览量'], df_ads['热度指数']], axis=1) # 浏览量和热度指数
fig = sns.boxplot(x='热度指数', y="浏览量", data=data) # 用seaborn的箱线图画图
fig.axis(ymin=0, ymax=800000); #设定y轴坐标
输出的箱线图:
箱线图是由五个数值点组成,分别是最小值(min)、下四分位数(Q1)、中位数(median)、上四分位数(Q3)和最大值(max)。
在统计学上,这叫做五数概括。这五个数值可以清楚地为我们展示数据的分布和离散程度。
这个图中下四分位数、中位数、上四分位数组成一个 “带有隔间的盒子”,就是所谓的箱。
上四分位数到最大值之间建立一条延伸线,就是所谓的线,也叫 “胡须”
胡须的两极就是最小值与最大值,此外,箱线图还会将离群的数据点单独绘出。
箱线图,热度指数越高,浏览量的中位数越大。
还可以看到,有一些离群的数据点,比其他的文章浏览量打了很多,这些 “离群点” 就是我们说的 “爆款文章” 了
这个数据集可以看到有些 “转发数” 的值为 “NaN”,意思是 Not A Number。
在 python 中,它代表无法表示、也无法处理的值,这种就是典型的脏数据
df_ads.isna().sum()
通过上面的函数统计 NaN 的个数
df_ads = df_ads.dropna()
通过上面的函数把出现 NaN 的数据行删除
离群点算脏数据吗?这个没有固定的答案,需要根据实际的情况评估,这里我们不删除这些离群点
特征工程是一个专门的机器学习了领域,而且我认为它是数据处理过程中最有创造力的环节,特征工程做得好不好,非常影响机器学习模型的效率。
在数据集中,每多一个特征,模型拟合时的特征空间就更大,运算量也就更大。
所以,摈弃掉冗余的特征、降低特征的维度,能使机器学习模型训练练得更快。
特征工程还能更好地表示业务逻辑,并提升机器学习模型的性能。
我们的项目问题相对简单,对特征工程的要求不高,这里不做特征工程。
特征是所收集的各个数据点,是要输入机器学习模型的变量。
而标签是要预测、判断或者分类的内容。
对于所有监督学习算法,我们都需要向模型中输入 “特征集” 和 “标签集” 这两组数据。
因此,在开始机器学习的模型搭建之前,我们需要先构建一个特征数据集和一个标签数据集。
特征集将原始数据集的 “浏览量” 删除就行了
X = df_ads.drop(['浏览量'],axis=1)
标签是我们想要预测的浏览量
y = df_ads.浏览量
我们可以看看特征集和标签集里面都有什么数据
X.head()
y.head()
原始数据被拆分成了机器学习的特征集和标签集。
这里还需要进一步从行的维度横向拆分。
为了简化流程,经常会省略验证的环节。只拆分训练集和测试集,此时测试集就肩负着验证和测试双重功能了。
留做测试的数据比例一般是 20% 或 30%。
如果你的数据量非常庞大,比如超过一百万的时候,那你也不一定非要留这么多。
一般来说有上万条的测试数据就足够了。
这里我们按 8/2 的比例拆分数据
# pip install scikit-learn
from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=0)
这里请注意一下,虽然随机分割,但要指定一个 random_state 值,这样都保证程序每次运行都分割一样的训练集和测试集。
训练集和测试集每次拆分都不一样的话,那比较模型调参前后的优劣就失去了固定的标准。
现在,训练集和测试集拆分也完成了,你会发现原始数据变成了四个数据集
到这里,我们全部的数据预处理工作就结束了。
这里我们介绍了机器学习实战 5 步中的前两步:定义问题以及数据的收集和预处理。
步明确定义要解决的问题,我们就没办法有的放矢地选择模型。
简单聊了一下数据收集和预处理的六个小步
数据可视化和特征工程,因为无定法可循,所以很考验经验,它是我们对已有数据找感觉的过程,也是下一步把数据给模型之前的必要准备。
注意:
好了,今天就到这里了,晚安!
我是新人唱跳 rap 打篮球,是一个立志 2025 年开始每周都能水一篇文章的人,希望我的文章可以给你带来好心情!