Machine Learning 初探
前置知识
pandas
- 读取文件:
read_csv
- 查看信息
describe
:查看整体信息,包括每列的平均值、最大最小值、标准差等head
:输出头部几行数据columns
:输出所有列名loc
:查询数据,或是根据索引取对应的数据dropna
:去掉所有为空NA
的数据
Machine Learning
大体上来说,机器学习就是给定一部分数据,让机器去“学习”这部分有什么特征,每个特征上有什么规律,以此形成一个模型model,然后用这个model去预测新的数据的结果
scikit-learn
简单高效的python包,可用于可预测的数据分析,官网在这里,可以自行查阅相关模型的原理或是API
下面以决策树模型的使用过程来大致展示一下机器学习的整体过程
决策树:DecisionTree
非常简单易懂的监督模型,可理解为给定一系列相关特征(比如n个),每个特征的结果只有两个(不确定是不是只能有两个),整个决策树就像是二叉树,预测时根据每个特征的是或否的回答选择路径,一次决策就像是二叉树从根节点到某个叶子节点的一条路径
可用于classification
(DecisionTreeClassifier)或是regression
(DecisionTreeRegressor)
训练模型的整体流程:以回归模型为例
- 准备数据:用
pandas
读取数据,并挑选出所需要的特征列和想预测的目标列- 数据分离train_test_split:注意不要把所有数据都拿来用于训练,要从中选出一部分数据用于验证训练出来的模型是否可信
import pandas as pd from sklearn.model_selection import train_test_split src_data = pd.read_csv('...') features = ['column_1', ...] X = src_data[features] # 特征列 y = src_data.target_column # 目标列 train_X, val_X, train_y, val_y = train_test_split(X, y, random_state = 0) # 分离成用于训练的 train_... 和用于预测的 val_...
- 初始化模型:直接导入后创建即可
- 可指定随机数种子
random_state
,相同的值能保证每次运行脚本时得到相同的结果
from sklearn.tree import DecisionTreeRegressor ... dt_model = DecisionTreeRegressor(random_state=N)
- 可指定随机数种子
- 数据拟合fit:用训练数据去训练模型
dt_model.fit(train_X, train_y)
- 预测结果predict:用检验数据进行预测
predicted_data = dt_model.predict(val_X) # val_X: 用于预测的数据的特征列
- 评估结果:检验预测的结果与实际结果之间的差距,可以有不同的方法,在此仅介绍一种MAE
评估结果:mean_absolute_error(MAE)
计算方式为:依次计算预测结果与实际结果的差值的绝对值,最后求和后除以结果数量
即与实际结果间的平均差值
On average, our predictions are off by about X.
代码也很简单,导入后调用即可
from sklearn.metrics import mean_absolute_error
...
mean_absolute_error(y, predicted_data) # y: 实际结果
两个问题
- 过拟合 overfitting:与训练数据贴合得过于完美,可能会学到一些实际数据中并不存在的特性,导致预测结果与实际数据相差较大(就像是下图竖线的右边部分,训练数据上的评估结果很好但实际表现不好)
- 欠拟合 underfitting:与训练数据贴合得不够,可能是特征学习得不足,导致不能很好地判定实际数据的特征,所以预测结果与实际数据相差也很大(就像下图竖线的左边部分,在两个数据集上的表现都不好)
- 寻找最佳点:可通过梯度测试等方式,不断调试参数,找到能让在实际数据上的表现最好的参数(就像下图的黄色感叹号处)
决策树的改进
- 控制树高:树高相关的参数可以说直接影响决策树的效率和预测结果 —— 树越高,对应的就是特征越多,则源数据被分化得越细致,对于每个部分的训练数据都能进行贴合,但相应的每个叶子部分的数据就越少,也就是说对于该条路径的训练可能不够,导致学习到的特征不够贴合实际数据(过拟合);反之,则是源数据被分割的不够,每个叶子节点都存在大量数据,对于特征的学习可能不够细致(欠拟合)
- 创建模型的时候可以通过
max_leaf_node
指定叶子个数限制,或是max_depth
指定最大深度。那么经过测试不同叶子限制或是树高的情况下MAE的值,选取使其到达最低点的参数进行创建模型,就能达到最佳效果
- 创建模型的时候可以通过
- 使用更复杂的模型(比如
随机森林RandomForestRegressor
)from sklearn.ensemble import RandomForestRegressor