共计 4467 个字符,预计需要花费 12 分钟才能阅读完成。
前言
机器学习 作为人工智能畛域的外围组成,是计算机程序学习数据教训以优化本身算法,并产生相应的“智能化的”倡议与决策的过程。
一个经典的机器学习的定义是:
A computer program is said to learn from experience E with respect to some class of tasks T and performance measure P, if its performance at tasks in T, as measured by P, improves with experience E.
1 机器学习概论
机器学习是对于计算机基于数据分布,学习构建出概率统计模型,并使用模型对数据进行剖析与预测的办法。依照学习数据分布的形式的不同,次要能够分为 监督学习和非监督学习:
1.1 监督学习
从有标注的数据 (x 为变量特色空间, y 为标签) 中,通过抉择的模型及确定的学习策略,再用适合算法计算后学习到最优模型,并用模型预测的过程。
依照模型预测后果 Y 的取值无限或者有限的,可再进一步分为 分类模型或者回归模型;
1.2 非监督学习:
从无标注的数据(x 为变量特色空间),通过抉择的模型及确定的学习策略,再用适合算法计算后学习到最优模型,并用模型发现数据的统计法则或者外在构造。
依照利用场景,能够分为聚类,降维和关联剖析等模型。
2 机器学习建模流程
2.1 明确业务问题
明确业务问题是机器学习的先决条件,这里须要形象出事实业务问题的解决方案:须要学习什么样的数据作为输出,指标是失去什么样的模型做决策作为输入。
(如:一个简略的新闻分类问题的场景,就是学习已有的新闻及其类别标签数据,失去一个文本分类模型,通过模型对每天新的新闻做类别预测,以归类到每个新闻频道。)
2.2 数据抉择:收集及输出数据
数据决定了机器学习后果的下限,而算法只是尽可能迫近这个下限。
意味着数据的品质决定了模型的最终成果,在理论的工业利用中,算法通常占了很小的一部分,大部分工程师的工作都是在找数据、提炼数据、剖析数据。数据抉择须要关注的是:
① 数据的代表性:代表性差的数据,会导致模型拟合成果差;
② 数据工夫范畴:监督学习的特色变量 X 及标签 Y 如与工夫先后无关,则须要明确数据工夫窗口,否则可能会导致 数据透露,即存在和利用因果颠倒的特色变量的景象。(如预测今天会不会下雨,然而训练数据引入今天温湿度状况);
③ 数据业务范畴:明确与工作相干的数据表范畴,防止缺失代表性数据或引入大量无关数据作为乐音;
2.3 特色工程:数据预处理及特征提取
特色工程就是将原始数据加工转化为模型可用的特色,按技术手段个别可分为:
① 数据预处理:缺失值 / 异样值解决,数据离散化,数据标准化等;
② 特征提取:特色示意,特色衍生,特征选择,特色降维等;
2.3.1 数据预处理
- 异样值解决
收集的数据因为人为或者天然因素可能引入了异样值(乐音),这会对模型学习进行烦扰。
通常须要解决人为引起的异样值,通过业务 / 技术手段 (如 3σ 准则) 断定异样值,再由(python、正则式匹配)等形式筛选异样的信息,并联合业务状况删除或者替换数值。
- 缺失值解决
数据缺失的局部,通过联合业务进行填充数值、不做解决或者删除。
依据缺失率状况及解决形式分为以下状况:① 缺失率较高,并联合业务能够间接删除该特色变量。教训上能够新增一个 bool 类型的变量特色记录该字段的缺失状况,缺失记为 1,非缺失记为 0;
② 缺失率较低,联合业务可应用一些缺失值填充伎俩,如 pandas 的 fillna 办法、训练随机森林模型预测缺失值填充;
③ 不做解决:局部模型如随机森林、xgboost、lightgbm 可能解决数据缺失的状况,不须要对缺失数据做任何的解决。
- 数据离散化
数据离散化能减小算法的工夫和空间开销(不同算法状况不一),并能够使特色更有业务解释性。
离散化是将间断的数据进行分段,使其变为一段段离散化的区间,分段的准则有等间隔、等频率等办法。
- 数据标准化
数据各个特色变量的量纲差别很大,能够应用数据标准化打消不同重量量纲差别的影响,减速模型收敛的效率。罕用的办法有:
① min-max 标准化:
将数值范畴缩放到(0,1), 但没有扭转数据分布。max 为样本最大值,min 为样本最小值。
② z-score 标准化:
将数值范畴缩放到 0 左近, 通过解决的数据符合标准正态分布。u 是平均值,σ 是标准差。
2.3.2 特征提取
- 特色示意
数据须要转换为计算机可能解决的数值模式。如果数据是图片数据须要转换为 RGB 三维矩阵的示意。
字符类的数据能够用多维数组示意,有 Onehot 独热编码表示、word2vetor 分布式示意及 bert 动静编码等;
- 特色衍生
根底特色对样本信息的表述无限,可通过特色衍生出新含意的特色进行补充。特色衍生是对现有根底特色的含意进行某种解决(聚合 / 转换之类),罕用办法如:
① 联合业务的了解做衍生:
聚合的形式是指对字段聚合后求平均值、计数、最大值等。比方通过 12 个月工资能够加工出:均匀月工资,薪资最大值 等等;
转换的形式是指对字段间做加减乘除之类。比方通过 12 个月工资能够加工出:当月工资支出与收入的比值、差值等等;
② 应用特色衍生工具:如 Featuretools 等;
- 特征选择
特征选择筛选出显著特色、摒弃非显著特色。特征选择办法个别分为三类:
① 过滤法:依照特色的发散性或者相关性指标对各个特色进行评分后抉择,如方差验证、相关系数、IV 值、卡方测验及信息增益等办法。
② 包装法:每次抉择局部特色迭代训练模型,依据模型预测成果评分抉择特色的去留。
③ 嵌入法:应用某些模型进行训练,失去各个特色的权值系数,依据权值系数从大到小来抉择特色,如 XGBOOST 特色重要性抉择特色。
- 特色降维
如果特征选择后的特色数目仍太多,这种情景下常常会有数据样本稠密、间隔计算艰难的问题(称为“维数劫难”),能够通过特色降维解决。
罕用的降维办法有:主成分分析法(PCA),线性判别分析法(LDA)等。
2.4 模型训练
模型训练是抉择模型学习数据分布的过程。这过程还须要根据训练后果调整算法的(超)参数,使得后果变得更加低劣。
- 2.4.1 数据集划分
训练模型前,个别会把数据集分为训练集和测试集,并可再对训练集再细分为训练集和验证集,从而对模型的泛化能力进行评估。
① 训练集(training set):用于运行学习算法。
② 开发验证集(development set)用于调整参数,抉择特色以及对算法其它优化。罕用的验证形式有穿插验证 Cross-validation,留一法等;
③ 测试集(test set)用于评估算法的性能,但不会据此扭转学习算法或参数。
- 2.4.2 模型抉择
常见的机器学习算法如下:
模型抉择取决于数据状况和预测指标。能够训练多个模型,依据理论的成果抉择体现较好的模型或者模型交融。
- 2.4.3 模型训练
训练过程能够通过调参进行优化,调参的过程是一种基于数据集、模型和训练过程细节的实证过程。
超参数优化须要基于对算法的原理的了解和教训,此外还有主动调参技术:网格搜寻、随机搜寻及贝叶斯优化等。
2.5 模型评估
模型评估的规范:模型学习的目标使学到的模型对新数据能有很好的预测能力(泛化能力)。事实中通常由训练误差及测试误差评估模型的训练数据学习水平及泛化能力。
- 2.5.1 评估指标
① 评估分类模型:
罕用的评估规范有查准率 P、查全率 R、两者和谐均匀 F1-score 等,并由混同矩阵的统计相应的个数计算出数值:查准率是指分类器分类正确的正样本(TP)的个数占该分类器所有预测为正样本个数(TP+FP)的比例;
查全率是指分类器分类正确的正样本个数(TP)占所有的正样本个数(TP+FN)的比例。
F1-score 是查准率 P、查全率 R 的和谐均匀:
② 评估回归模型:
罕用的评估指标有 RMSE 均方根误差 等。反馈的是预测数值与理论值的拟合状况。③ 评估聚类模型:可分为两类形式,一类将聚类后果与某个“参考模型”的后果进行比拟,称为“内部指标”(external index):如兰德指数,FM 指数 等;
另一类是间接考查聚类后果而不利用任何参考模型,称为“外部指标”(internal index):如紧凑度、拆散度 等。 - 2.5.2 模型评估及优化
依据训练集及测试集的指标体现,剖析起因并对模型进行优化,罕用的办法有:
2.6 模型决策
决策是机器学习最终目标,对模型预测信息加以分析解释,并利用于理论的工作畛域。
须要留神的是工程上是后果导向,模型在线上运行的成果间接决定模型的成败,不仅仅包含其精确水平、误差等状况,还包含其运行的速度(工夫复杂度)、资源耗费水平(空间复杂度)、稳定性的综合思考。
3 Python 实战
# 这是一个简略的 demo。应用 iris 动物的数据,训练 iris 分类模型,通过模型预测辨认种类。import pandas as pd
# 加载数据集
data = load_iris()
df = pd.DataFrame(data.data, columns=data.feature_names)
df.head()
# 应用 pandas_profiling 库剖析数据状况
import pandas_profiling
df.profile_report(title='iris')
# 划分标签 y,特色 x
y = df['class']
x = df.drop('class', axis=1)
#划分训练集,测试集
from sklearn.model_selection import train_test_split
train_x, test_x, train_y, test_y = train_test_split(x, y)
# 模型训练
from xgboost import XGBClassifier
# 抉择模型
xgb = XGBClassifier(max_depth=1, n_estimators=1)
xgb.fit(train_x, train_y)
from sklearn.metrics import precision_score, recall_score, f1_score, accuracy_score, roc_curve, auc
def model_metrics(model, x, y, pos_label=2):
"""评估函数"""
yhat = model.predict(x)
result = {'accuracy_score':accuracy_score(y, yhat),
'f1_score_macro': f1_score(y, yhat, average = "macro"),
'precision':precision_score(y, yhat,average="macro"),
'recall':recall_score(y, yhat,average="macro")
}
return result
# 模型评估后果
print("TRAIN")
print(model_metrics(xgb, train_x, train_y))
print("TEST")
print(model_metrics(xgb, test_x, test_y))
# 模型预测
xgb.predict(test_x)