1. 安装开发环境
对于机器学习初学者来说,只需要 Jupyter Notebook 即可:
- Python: AI 开发最常见的编程语言;
- Jupyter Notebook: 基于网页交互式计算环境,可以直接在网页上编写代码和运行代码,轻量级的机器学习项目 Jupyter Notebook 完全搞得定。如果需要处理比较复杂的深度学习,要构建深度网络处理大量数据时,可以使用 Kaggle 在线 Jupyter Notebook 平台、Google Colaboratory 或者阿里云天池实验室等在线资源。
- Anaconda: 用于管理工具包和环境的图形用户界面,能够帮助管理众多的 Python 库,并支持 Jupyter Notebook、JupyterLab、Spyder 等工具,我们选择个人免费版本下载安装。
安装 Anaconda 后,选择启动 Jupyter Notebook,随后在默认浏览器中打开本机默认目录:
- Visual Studio Code: 轻量级但功能强大的集成开发环境,首次运行 ipynb 文件会提示安装 Jupyter 扩展插件:
2. Jupyter Notebook 入门
- 新建项目: 选择一个目录并新建 Notebook 笔记:
- pip: 安装包
pip install plotly #安装Plotly包
- Import: 导包
import plotly.express as px #导入Plotly.express工具
- 单元格类型: Jupyter Notebook 有两种主要的单元格类型
- Code 类型: 表示可执行的单元格;
- Markdown 类型: 表示富文本类型的单元格,用于对代码添加说明文字。
- In[2]: In 表示可执行单元,中括号中的数字表示执行顺序
- 输入模式: 绿色框是编辑模式,蓝色框是命令模式
- 案例代码:
pip install plotly # 安装Plotly包
import plotly.express as px # 导入Plotly.express工具
import pandas as pd # 导入Pandas
# 建立数据
stages = ["访问数", "下载数", "注册数", "搜索数", "付款数"] # 漏斗的阶段
# 漏斗的数据
df_male = pd.DataFrame(dict(number=[30, 15, 10, 6, 1], stage=stages))
df_male['性别'] = '男'
df_female = pd.DataFrame(dict(number=[29, 17, 8, 3, 1], stage=stages))
df_female['性别'] = '女'
df = pd.concat([df_male, df_female], axis=0) # 把男生女生的数据连接至一个新的Dataframe对象df
fig = px.funnel(df, x='number', y='stage', color='性别') # 把df中的数据传进漏斗
#显示漏斗图
fig.show()
3. 微信软文浏览量线性回归教学案例
基本步骤: 定义问题 – 收集数据 – 预处理数据 – 选择算法和建模 – 评估模型和优化 – 部署模型。
3.1 定义问题:估计软文浏览量
- 特征:点赞数、转发数、热度指数、文章评级
- 标签:浏览量
- 学习方式:输入数据是有标签的,所以是监督学习
- 问题分类:浏览量是连续变量,所以是回归问题
3.2 收集数据
3.3 预处理数据
1、数据可视化
读取原始数据集,并使用散点图、箱线图等工具猜测特征和标签可能存在的关系:
- 散点图: 在二维平面上显示某一维度特征与标签的关系:
plt.plot(df_ads['点赞数'],df_ads['浏览量'],'r.', label='Training data') # 用matplotlib.pyplot的plot方法显示散点图
plt.xlabel('点赞数') # x轴Label
plt.ylabel('浏览量') # y轴Label
plt.legend() # 显示图例
plt.show() # 显示绘图结果!
- 箱线图: 箱线图是由五个数值点组成,在统计学上成为 “五数概括”,能够展示数据的分布和离散程度;
- 五数: 最小值、下四分位数 (Q1)、中位数、上四分位数(Q3)和最大值;
- 最大值和最小值的含义: 箱线图中的最大值和最小值并不总是数据中的实际最大值和最小值。箱线图中的最大值是数据中小于或等于Q3+1.5IQR(IQR为四分位距,等于Q3-Q1)的最大值,而最小值是数据中大于或等于 Q1-1.5IQR 的最小值;
- 离群点: 超出最大值和最小值范围的数据点。
2、数据清洗
处理缺失、重复、错误或不可用的数据,提高数据质量,为后续分析提供可靠的基础。这里我们删除数据集中的 NaN 数据,如果 NaN 数据过多,也说明数据集的数据质量不好:
df_ads = df_ads.dropna() # 把出现了NaN的数据行删掉
df_ads.isna().sum() # NaN出现的次数
3、构建特征集和数据集
将原始数据集就被拆分为的特征集和标签集:
- 特征集: 从数据集中删除 “浏览量” 标签生成特征集;
- 标签集: 从原始数据集中保留 “浏览量” 标签生成标签集。
4、拆分训练集、验证集和测试集:
将特征数据集和标签数据集分别按照 2:8 的比例拆分验证集和训练集,由于本项目比较简单,所以验证集也承担测试集的功能:
- 特征训练集(X_train)
- 特征测试集(X_test)
- 标签训练集(y_train)
- 标签测试集(y_test)
3.4 选择算法和建模
在定义问题阶段,我们观察到数据集的标签是连续变量,这是一个回归问题。回归分析的算法有线性回归、多项式回归和贝叶斯回归等,在数据可视化阶段,我们观察到特征和标签之间存在近似线性的关系,因此我们使用线性回归算法来建模。既然我们有 4 个特征输入,那么我们的目标函数自然是:
y = w_1·x_1 + w_2·x_2 + w_3·x_3 + w_4·x_4 + b
对于机器学习来说,最常用的算法工具包是开源的 scikit-learn 机器学习库,sklearn 提供了大量用于数据挖掘的机器学习工具,覆盖数据预处理、可视化、交叉验证和多种机器学习算法。这里我们使用其中的 LinearRegression 建模:
from sklearn.linear_model import LinearRegression # 导入线性回归算法模型
linereg_model = LinearRegression() # 使用线性回归算法创建模型
调整外部参数:
from sklearn.linear_model import LinearRegression # 导入线性回归算法模型
linereg_model = LinearRegression(fit_intercept = True) # 使用线性回归算法创建模型,并指定外部参数 fit_intercept
3.5 训练模型
将特征训练集和标签训练集输入给模型,这里我们只需要把数据传入到 fit 方法就可以。虽然训练模型是机器学习的核心环节,但由于有很多优秀的机器学习库存在,我们只需要很少的代码技能实现强大的学习功能。
linereg_model.fit(X_train, y_train) # 用训练集数据,训练机器,拟合函数,确定内部参数
3.6 评估模型和优化
在初步完成模型训练后,我们就可以使用模型在任何同类型的数据集上预测真值,可以应用于验证集和测试集。如果预测的效果不好,我们就调整模型参数或更改模型,这是一个循环迭代优化的过程。
# 预测
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 #显示数据
在进行模型效果的评估时,我们最小化误差来实现外部参数的评估和优化。机器学习库都会提供常用的指标,例如 R^2 和 MSE 均方误差指标就可以评估回归分析模型的效果。scikit-learn 的 LinearRegression 模型的 score 方法使用的就是 R^2 分数指标。R^2 的取值在 0 ~ 1 之前,R^2 越大说明模型拟合的效果:
print("线性回归预测评分:", linereg_model.score(X_test, y_test)) # 输入特征测试集和标签测试集评估模型
线性回归预测评分: 0.7085754407718876
输出目标函数参数信息:
print('当前模型的4个特征的权重分别是: ', linereg_model.coef_)
print('当前模型的截距(偏置)是: ', linereg_model.intercept_)
输出预测值与真实值的散点图:
plt.scatter(y_test, y_pred, color='blue')
plt.plot([y_test.min(), y_test.max()], [y_test.min(), y_test.max()], '--k')
plt.xlabel('真实值')
plt.ylabel('预测值')
plt.title('线性回归')
plt.show()
3.7 对比不同外部参数组合
上面我们已经使用默认参数训练出一种模型,现在对比不同外部参数训练出来的效果:
fit_intercept_list = [True, False]
# normalize_list = [True, False]
for item in itertools.product(fit_intercept_list): # , normalize_list):
fit_intercept = item[0]
# normalize = item[1]
# 训练模型
linereg_model = LinearRegression(fit_intercept = fit_intercept)
linereg_model.fit(X_train, y_train)
# 预测测试集对的y值
y_pred = linereg_model.predict(X_test)
# 给出模型评分
print(f'参数组合: fit_intercept = {fit_intercept}','线性回归预测评分:', linereg_model.score(X_test, y_test))