浅谈AI机器学习及实践总结 | 社区征文

社区征文机器学习
机器学习基础

什么是机器学习

机器学习是一种从数据生成规则、发现模型,来帮助我们预测、判断、分组和解决问题的技术。(机器学习是一种从数据中生产函数,而不是程序员直接编写函数的技术)

说起函数就涉及到自变量和因变量,在机器学习中,把自变量叫做特征(feature)多个自变量分别可以定义为X1,X2..Xn,因变量叫做标签(label),可定义为Y,而一批特征和标签的集合,就是机器学习的数据集。

机器学习的学习过程就是在已知的数据集的基础上,通过反复的计算,选择最准确的函数去描述数据集中自变量X1,X2....Xn 和因变量Y之间的因果关系。这个过程就称之为机器学习的训练也叫拟合。

这里还需要明确几个概念,训练集、验证集、测试集

训练集,最开始用来训练的数据集被称为训练集。

验证集,验证模型是否能够被推广、泛化,评估模型是否过拟合

测试集,用来评估模最终模型的泛化能力,相当于举一反三的能力

机器学习分类

主要分类是根据机器学习在训练过程中是否有标签。

  • 监督学习:训练的数据集全部都有标签,根据标签的特点 监督学习可以分为两类问题:回归和分类,回归问题的标签是连续的数值,比如预测房价、股市等,分类问题的标签是离散的数值,比如人脸识别、判断是否正确等,判断两款运营策略哪种更有效。

image.png

分类算法:逻辑回归、决策树分类、SVM分类、贝叶斯分类、随机森林、XGBoost、KNN...

回归算法:线性回归、 决策树回归、SVN回归、贝叶斯回归...

  • 无监督学习:训练数据集没有标签,多应用在聚类、降维等有限的场景中,比如说为用户做分组画像,另外通常也会作为数据预处理的一个子步骤中。

降维算法、聚类算法...

  • 半监督学习:有的数据有标签、有的数据没有标签。往往是因为获取数据标签的难度很高,半监督学习与监督学习是很相似的,主要在与多了伪标签生成环节,也就是给无标签的数据人工 贴标签。

半监督分类、半监督回归、半监督聚类、半监督降维

  • 强化学习:针对于一些既不能用监督学习也不能用半监督和无监督学习来解决,这时候强化学习就上场了,它针对是智能体(可以理解成一种机器学习模型)如何基于环境而做出行动反应,以获得最大化的累积奖励。其与监督学习的差异在于监督学习是从数据中进行学习,而强化学习是从环境给他的奖惩中学习。

Q-learning,SARSA,深度强化网络、蒙特卡洛学习...

image.png

如何理解深度学习

常说的深度学习是一种使用深层神经网络的模型,可以应用于上述四类机器学习中,深度学习擅长处理非结构化输入,在视觉处理和自然语言处理方面都很厉害。

深度学习,能对非结构的数据集进行自动的复杂特征提取,完全不需要人工干预。

机器学习落地思路

做机器学习项目,首先要先明确要解决的问题,其次,再针对问题选择一个算法,然后用对数据进行训练,找到一族函数中最合适的那一个形成最后的模型。

机器学习入门环境准备

背景:

大多数互联网企业都提供有类似Notebook类的产品,采用交互式的方式进行数据分析、数据建模及数据可视化。主要实现大多都是基于jupyter 、Zeppelin进行定制化开发,重点会打通大数据计算、存储及底层资源管理,支持常见的机器学习和深度学习计算框架,算法分析及建模中最常见的是采用jupyter notebook,能够在浏览器中,通过编写python脚本 运行脚本,在脚本块下方展示运行结果。

jupyter notebook 可以交互式的开发,再加上拥有丰富的的文本格式、可以图文并茂的展示结果,迅速的展现数据分析师的想法。

安装Jupyter Notebook

Anaconda 安装管理Juypter Notebook

Anaconda是一个免费的开发环境,能帮你管理众多的Python库,支持Jupyter Notebook、Spyder等工具,还有许多科学包,通过可以从官网上直接下载安装Anaconda,启动Anaconda后 安装Juypter就比较简单,直接Anaconda界面上启动就好了,默认Anaconda会安装好Juypter和相关科学库。

使用pip命令安装

在命令行中通过python3安装,安装之前建议升级下pip,,解决老版本的pip在安装Jupyter Notebook过程中或面临依赖项无法同步安装的问题,这种情况下如果需要其他科学包及其依赖项就需要手动去安装了。

pip3 install --upgrade pip ## 更新
pip3 install jupyter  ## 安装
jupyter notebook --port <port_number>  ## 启动可以指定端口号,不指定默认8888 当
# 还可以指定其他参数具体可以 jupyter notebook -h

使用Docker安装

docker安装启动jupyter就比较简单了

比如:docker run -it -d --name=test. tensorflow/tensorflow:2.2.0-jupyter -p 8888:8082

实践Juypter notebook

在Juypter中使用Plotly 绘图

简介

Plotly 是一个非常强大的开源数据可视化框架,它通过构建基于 HTML 的交互式图表来显示信息,可创建各种形式的精美图表。本文所说的 Plotly 指的是 Plotly.js 的 Python 封装,plotly本身是个生态非常复杂的绘图工具,它对很多编程语言提供接口,交互式和美观易用应该是 Plotly 最大的优势

绘制漏斗图

在一个电商购物场景下,用户购买 商品会涉及到多个流程,从下载APP、注册APP、搜索商品,购买商品,每个流程都会潜在的流失率,通过漏斗图可以用来呈现用户流失情况,我们收集到每个阶段数据后就可以利用Plotly进行漏斗图的绘制了。

绘制流程

  • 安装Plotly包
pip install plotly
  • 详细代码

这里绘制个稍微复杂的代码,分别绘制男女生适用产品的组合型漏斗


import plotly.express as px # 导入需要的模块,命名为px
import pandas as pd

stages = ["访问数", "下载数", "注册数", "搜索数", "付款数"]
#漏斗的数据
data = pd.DataFrame(dict( #准备漏斗数据
    number=[59, 32, 18, 9, 2],
    stage=stages))
data['性别']='男'
print(data)

data2 = pd.DataFrame(dict( #准备漏斗数据
    number=[40, 30, 22, 10, 5],
    stage=stages))

data2['性别']='女'

df = pd.concat([data,data2],axis=0) # 拼接漏斗数据,pandas函数拼接支持DataFrame类型
print(df)
fig = px.funnel(df,x='number',y='stage',color='性别') #把数据传入漏斗
fig.show()  # 显示漏斗数据
  • 结果显示

image.png

  • 结果分析

通过这个漏洞图发现通过整个APP购买流程,发现每个阶段都有用户流程,还有就是女性用户购买的比例明显大点,这些现象可以启发产品运营同学可以聚焦某个环节 去减少某个流程中的流失率

机器学习工程实践的五个步骤

定义问题

需要我们剖析业务场景,设定清晰的目标,明确当前问题属于哪一种机器学习类型。

场景:比如一个场景,微信公众号推广文案的运营效率分析,收集了大量的软文数据,包括点赞数、转发数和浏览量等。因为公众号阅读超过十万之后,就不能显示它的具体阅读量了,所以针对这个问题,目标是建立一个机器学习模型,根据点赞数和转发数等指标,估计一篇文章能实现多大的浏览量。

要估计浏览量,数据集包含 点赞数、转发数、热度指数、文章评级,这几个字段是特征,浏览量就是标签,跟进机器学习分类,这里数据带有标签,因此这是一个监督学习,再加上标签是连续的数值,因此它是一个回归问题。

收集数据和预处理

为机器学习模型提供好燃料,数据好,模型才能跑得更带劲。。

其中收集数据和预处理完整的步骤如下:

  1. 收集数据

收集数据方法有多种,现实中要在运营环节中做很多数据埋点、获取用户消费等行为信息和兴趣偏好信息,网上爬取数据等等。 可参考极客时间-《数据分析实战45讲》中的方法。

  1. 数据可视化

作用是通过可视化观察下数据,看一看特征和标签之间可能存在的关系、看看数据里有没有脏数据和离群点等,为选择具体的机器学习模型找找感觉。

#加载数据
import pandas as pd # 导入pandas数据处理工具包
df_ads= pd.read_csv('test.csv') #读入数据
df_ads.head(10) #显示前几行数据

python数据可视化必备工具包:一个是python画图工具库Matplotlib,另外一个是统计学数据可视化工具Seaborn。

#散点图来观察数据之间分布关系
import matplotlib.pyplot as plt
import seaborn as sns
plt.plot(df_ads['点赞数'],df_ads['浏览量'],'r.',label='Training data')
plt.xlabel('goods')
plt.ylabel('views')
plt.legend()
plt.show()

如下图所示:

基本可以看出呈现线性相关性。

接下来看下箱线图:


data = pd.concat([df_ads['浏览量'], df_ads['热度指数']], axis=1) # 浏览量和热度指数
fig = sns.boxplot(x='热度指数', y="浏览量", data=data) # 用seaborn的箱线图画图
fig.axis(ymin=0, ymax=800000); #设定y轴坐标
  1. 数据清洗

洗菜洗得越干净,模型效果越好,主要数据清洗分为四种情况:

  • 第一种是处理缺失的数据,如果备份系统里面有缺了的数据,尽量去补录。如果没有可以剔除残缺的数据,也可以用其他数据记录的平均值、随机值或者0来补值,这个补值的过程叫数据修复。
  • 第二种是处理重复的数据,如果完全重复的数据删掉就行,如果同一个主键出现两行不同的数据,就需要看看有没有其他辅助的信息可以帮助我们判断(如时间戳),要是无法判断的话,只能随机删除或者全部保留。
  • 第三种是处理错误数据:比如商品的销售量、销售金额出现负值,这时候需要删除或者转化为有意义的值,再比如表示百分比或者概率的字段,如果值大于1,也属于逻辑错误数据
  • 第四种处理不可用的数据,这指的是整理数据的格式,比如有些商品是以人民币为单位,有些以美元为单位,就需要线统一,另外就是把是和否转换为1、0 值再输入机器学习模型。

如何查看数据集中的数据需要清洗了?

可以通过DataFrame的isna().sum()函数来统计所有的NaN的个数。NaN意思是Not A Number,在python中,它代表无法表示、也无法处理的值也就是典型的脏数据。

   df_ads.isna().sum() # Nan出现的个数。

可以使用dropna()这个API把出现了NaN的数据行删掉

df_ads = df_ads.dropna()#把出现了NaN的数据行删掉

还有其他数据清洗的方法,需要针对具体的项目和数据集进行处理。

  1. 特征工程

特征工程是一个专门的机器学习子领域,它是数据处理过程中最有创造力的环节,特征工程做的好不好,非常影响机器学习模型的效率。

什么是特征工程了?比如说评估身体健康状况的一个指标BMI,它等于体重除以身高的平方,这就是一个特征工程。经过了这个过程,BIM这一个指数就替代了原来的两个特征-体重和身高,而且完全能客观地描绘我们身材情况。

这样的好处是什么?通过BMI这个特征,降低了特征数据集的维度。数据集中每多一个特征,模型拟合的特征空间就更大、运算量也就更大。所以,摒弃掉冗余的特征、降低特征的维度,能使机器学习模型训练得更快。

  1. 构建特征集和标签集

特征就是所收集的各个数据点,是要输入机器学习模型的变量,而标签是要预测、判断或者分类的内容。对于所有监督学习,我们需要像模型中输入“特征集”和“标签集”这两组数据。

通常从一个包含了特征和标签的数据,构建特征数据集和一个标签数据集合,只需要从原数数据删除不需要的数据就行了。

比如:

X=df_ads.drop['浏览量'],axis=1):
Y=df_ads.浏览量

无监督学习不需要这样的步骤

  1. 拆分训练集、验证集和测试集合

从原数据集从列的维度纵向拆分成了特征集和标签集后,还需要进一步从行的维度横向拆分。主要原因是机器学习并不是通过训练数据集找出一个模型就结束了,我们要用验证数据集看看这个模型好不好,然后用测试数据集看看模型在新数据上能不能用。

拆分依据数据量来看,比如20%或30% ,具体的拆分,通常会用机器学习工具包scikit-learn 里的数据拆分工具train_test_split来完成

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)

收集数据和预处理总结:

选择算法和训练模型

选择依据

主要是根据特征和标签之间的关系,选出一个合适的算法,并找出与之对应的合适算法包,然后通过调用这个算法包来建立模型,通过上一个步骤,这个数据集里的某些特征和标签之间存在着近似线性的关系。而且这个数据集的标签是连续变量,因此适合用回归分析来寻找从特征到标签的预测函数。

所谓的回归分析(regression analysis)就是确定两种或两种以上变量间相互依赖的定量关系的一种统计分析,说白了就是当自变量变化的时候,研究一下因变量是怎么跟着变化的,它可以用来预测客流量、降雨量、销售量等。

回归分析的算法有多种,如线性回归、多项式回归、贝叶斯回归等等。具体根据特征和标签 之间的关系来决定。初始时特征和标签可能存在线性关系可以用最简单、最基础的机器学习算法线性回归来建模,线性回归是给每一个特征变量找参数的过程。

比如数学中一元线性回归公式:y = a*x +b 对于机器学习来说,我们把斜率a叫做权重(weight) ,用英文字母w代表,把截距b叫做偏置(bias) ,用英文字母b代表,机器学习中一元线性回归公式表示为:

Y = w*x +b

机器学习算法包

常用的算法工具包是scikit-learn ,简称sklearn 它是使用最广泛的开源python机器学习库,sklearn提供了大量用于数据挖掘的机器学习工具,覆盖数据预处理、可视化、交叉验证和多种机器学习算法。

建立模型

调用LinearRegression建立模型非常简单,如下

from sklearn.liner_model import LinerRegression # 导入线性回归算法模型
linereg_model = LinearRegression() #    使用线性回归创建模型

模型参数有两种,内部参数和外部参数。内部参数是属于算法本身的一部分,不用我们人工来确定,比如线性回归中的权重w和截距b,都是线性回归的内部参数;而外部参数也叫做超参数,他们的值是在创建模型时,由我们自己设定的。LinearRegression模型外部参数主要包含两个布尔值:

fit_intercept ,默认值为True,代表是否计算模型的截距

normalize,默认值为Flase代表是否对特征X在回归之前做规范化。

训练拟合模型

训练模型就是用训练集中的特征变量和已知标签,根据样本大小的损失大小来逐渐拟合函数,确定最优的内部参数,最后完成模型。

linereg_model.fit(x_train,y_train) # 用训练集数据,训练机器,拟合函数,确定内部参数
  

主要得益于机器学习库的存在,直接通过fit完成模型训练,fit内部核心就是优化其内部参数减少损失,使函数对特征到标签的模拟越来越贴切, 针对所有样本,找到一组平均损失较小的模型参数。 这其中的关键就是:通过梯度下降,逐步优化模型的参数,使训练集误差值达到最小。

梯度下降:通过求导的方法,找到每一步的方向,确保总是往更小的损失方向前进。

评估并优化模型性能

在验证集和测试集进行模型效果评估的过程中,我们则是通过最小化误差来实现超参数(模型外部参数)的优化。机器学习包中(如scikit-learn)都会提供常用的工具和指标,对验证集和测试集进行评估,进而计算当前的误差。比如R方或者MSE均方误差指标,就可以用于评估回归分析模型的优劣。

预测方法:

通常就直接使用模型中的predict方法进行:

y_pred = linereg_model.predict(x_test) #预测测试集的Y值

比较测试数据集的原始特征数据、原始标签值和模型对标签的预测值组合一起显示、比较

df_ads_pred= X_test.copy() #测试集特征数据
df_ads_pred['浏览量真值'] = y_test
df_ads_pred['浏览量预测值'] = y_pred
df_ads_pred

查看模型长得什么样?通过LinearRegression的coef_和intercept_属性打印出各个特征的权重和模型的偏置来,它们就是模型的内部参数。

linereg_model.coef_
linereg_model.intercept_

模型的评估分数:常用于评估回归分析模型的指标有两种:R方分数和MSE指标,并且大多数机器学习工具包中都会提供相关的工具,以下是用R方分数来评估模型

  linears_model.score(x_test,y_test)

机器学习项目是一个循环迭代的过程,优秀的模型都是一次次迭代的产物模型评估 需要反复评测,找到最优的超参数,确定最终模型。

模型在线服务

主流模型服务方法:

模型服务有多种部署部署模式,比如预存结果、基于模型 PMML 模型转换及上线、Tensorflow Serving 服务。其中前两种并不是端到端的训练和模型部署,PMML 的话对于复杂的深度学习模型服务来说,表达能力比较有限,还不足以支持复杂的深度学习模型,所以深度学习模型就需要借助 Tesorflow Serving 来完成了。

  • 预存推荐结果

离线预测生成结果,存储在如 redis 之类的线上数据库中,在线上环境中直接取出预存数据返回给应用

  • 利用 PMML 转换和部署模型

PMML(预测模型标记语言):JPMML 作为序列化 xml 和解析 PMML 文件的 Library 库

  • TensorFlow Serving

Tesorflow 模型上线流程主要是,先离线把模型序列化存储到文件系统,Tensorflow Serving 把模型文件载入到模型服务器,还原模型推断过程,对外以 HTTP 接口或 gRPC 接口的方式提供模型服务

总结

本文首先介绍了机器学习,了解了机器学习是一种从数据生成规则、发现模型,来帮助我们预测、判断、分组和解决问题的技术,并对机器学习的分类以及深度学习做了总结,

其次,介绍了怎么利用juypter进行机器学习的环境准备,安装相关机器学习包进行可视化数据的处理、分析及展示。

接着,介绍了在实际工作中机器学习的整个流程,从数据收集和数据预处理,再到选择算法和确定模型,接着就是选择算法训练模型、再到模型评估及模型性能优化,以及最终模型训练完成之后的离线批量预测以及模型的线上服务整个流程。

整个机器学习流程大概就是如此,具体应用到业务当中,就需要从具体业务出发确定需要解决的业务问题,针对问题收集相关的数据,接着实验不同的算法,评估模型对业务带来的效果,每一个步骤的话都会涉及到不同的工具和服务,从大数据离线批处理、实时流处理、机器学习、深度学习训练框架如spark、flink、tensorflow、Pytorch都会涉及到。

本文参考从零开始学习机器学习,加入自己的理解和相关内容,充其量就是一个入门的总结,整个机器学习涉及到许多内容,不仅仅是算法而且还有大量AI数据工程、后端技术栈,要想精通需要在后端技术、AI算法方面多下功夫,同时需要结合业务背景,进行实战。

参考资料

https://zhuanlan.zhihu.com/p/74874291

逻辑回归(logistics regression)_激进的蜗牛-CSDN博客_逻辑回归

极客时间:从零开始学习机器学习专栏

https://zhuanlan.zhihu.com/p/33794257

文章来源:https://xie.infoq.cn/article/4859710a026ca2d058606887b

637
1
0
0
关于作者
相关产品
评论
未登录
看完啦,登录分享一下感受吧~
暂无评论