简单的说,机器学习就是让机器从数据中学习,进而得到一个更加符合现实规律的模型, 通过对模型的使用使得机器比以往表现的更好,这就是机器学习。
对上面这句话的理解:
数据:从现实生活抽象出来的一些事物或者规律的特征进行数字化得到。
学习:在数据的基础上让机器重复执行一套特定的步骤(学习算法)进行事物特征的萃取, 得到一个更加逼近于现实的描述(这个描述是一个模型它的本身可能就是一个函数)。我 们把大概能够描述现实的这个函数称作我们学到的模型。
更好:我们通过对模型的使用就能更好的解释世界,解决与模型相关的问题。
过拟合的第一个原因,就是建模样本抽取错误,包括(但不限于)样本数量太少, 抽样方法错误,抽样时没有足够正确考虑业务场景或业务特点,等等导致抽出 的样本数据不能有效足够代表业务逻辑或业务场景;
过拟合的第二个原因,就是样本里的噪音数据干扰过大,大到模型过分记住了噪音 特征,反而忽略了真实的输入输出间的关系;
过拟合的第三个原因,就是在决策树模型搭建中,如果我们对于决策树的生长没有 合理的限制和修剪的话,决策树的自由生长有可能每片叶子里只包含单纯的事件 数据(event)或非事件数据(no event),可以想象,这种决策树当然可以完 美匹配(拟合)训练数据,但是一旦应用到新的业务真实数据时,效果是一塌糊涂。
过拟合的第四个原因,就是建模时的“逻辑假设”到了模型应用时已经不能成立了。任 何预测模型都是在假设的基础上才可以搭建和应用的,常用的假设包括:假设历 史数据可以推测未来,假设业务环节没有发生显著变化,假设建模数据与后来的 应用数据是相似的,等等。如果上述假设违反了业务场景的话,根据这些假设搭 建的模型当然是无法有效应用的。
过拟合的第五个原因,就是建模时使用了太多的输入变量,这跟上面第二点(噪音数据) 有些类似,数据挖掘新人常常犯这个错误,自己不做分析判断,把所有的变量交给 软件或者机器去“撞大运”。须知,一个稳定优良的模型一定要遵循建模输入变量“ 少而精”的原则的。
上面的原因都是现象,但是其本质只有一个,那就是“业务理解错误造成的”,无论是抽样, 还是噪音,还是决策树,神经网络等等,如果我们对于业务背景和业务知识非常了解, 非常透彻的话,一定是可以避免绝大多数过拟合现象产生的。因为在模型从确定需求, 到思路讨论,到搭建,到业务应用验证,各个环节都是可以用业务敏感来防止过拟合 于未然的。
当你使用较小的数据集进行机器学习时,容易产生过度拟合,因此使用较大的数据量能避免过度拟合现象。但是当你不得不使用小型数据集进行建模时候,可以使用被称为交叉验证的技术。在这种方法中数据集被分为两节,测试和训练数据集,测试数据集只测试模型,而在训练数据集中,数据点被用来建模。
在该技术中,一个模型通常是被给定有先验知识的数据集(训练数据集)进行训练,没有先验知识的数据集进行测试,交叉验证的思想是:在训练阶段,定义一个数据集用来测试模型
1.dropout:训练神经网络模型时,如果训练样本较少,为了防止模型过拟合, Dropout可以作为一种trikc供选择。
2.early stop结合cross validation使用。
3.尽可能的扩大 training dataset,增加训练集的全面性和数量
机器学习的各种方法如下:
概念与分类学习(Concept Vs Classification Learning)。
符号与统计学习(Symbolic Vs Statistical Learning)。
归纳与分析学习(Inductive Vs Analytical Learning)。
贝叶斯分类是一类分类算法的总称,这类算法均以贝叶斯定理为基础,故统称为贝叶斯分类。公式如下:
该公式最大的优点就是可以忽略AB 的联合概率直接求其条件概率分布。
而朴素贝叶斯为什么如此朴素,因为他假定所有的特征在数据集中的作用是同样重要和独立的。正如我们所知,这个假设在现实世界中是很不真实的,因此说朴素贝叶斯真的很“朴素”。
朴素贝叶斯分类是一种非常简单的分类算法,其思想是朴素的。即:对于给出的待分类项,求解在此项出现的条件下各个类别出现的概率,那个最大,就认为此待分类项属于那个类别。
理论上,朴素贝叶斯模型与其他分类方法相比具有最小的误差率。但是实际上并非总是如此,这是因为朴素贝叶斯模型给定输出类别的情况下,假设属性之间相互独立,这个假设在实际应用中往往是不成立的,在属性个数比较多或者属性之间相关性较大时,分类效果不好。而在属性相关性较小的时,朴素贝叶斯性能最为良好。对于这一点,有半朴素贝叶斯之类的算法通过考虑部分关联性适度改进。
结合二分类法
修改二进制纳入多类学习法。
页面统计可以帮我们知晓某个页面被多少人访问了多少次,行为统计是指用户在界面上的操作行为,应用最多的是按钮的点击次数。
下面是欧式距离的公式(分别是二维空间,三维空间,n维空间):
曼哈顿距离表示的是两个点在标准坐标系上绝对轴距之和,是种使用在几何度量空间的几何学用语。
例如在平面上,坐标(x1, y1)的i点与坐标(x2, y2)的j点的曼哈顿距离为:
d(i,j)=|X1-X2|+|Y1-Y2|
如图所示,很直接明了的理解欧氏距离和曼哈顿距离: image.png
图中红线代表曼哈顿距离,绿色代表欧氏距离,也就是直线距离,而蓝色和黄色代表等价的曼哈顿距离。
欧氏距离和曼哈顿距离的Python实现:
import numpy as np
def manhattan_distance(vec1, vec2):
"""
This method implements the manhattan distance metric
:param p_vec: vector one
:param q_vec: vector two
:return: the manhattan distance between vector one and two
"""
return np.sum(np.fabs(vec1 - vec2))
def edclidean_distance(vec1, vec2):
"""
This method implements the edclidean distance metric
:param vec1: vector one
:param vec2: vector two
:return: the edclidean distance between vector one and two
"""
# 方法一
distance = np.sqrt(np.sum(np.square(vec1 - vec2)))
# method 2
dist = np.linalg.norm(vec1 - vec2)
return distance
抽象成数学问题:
明确问题是进行机器学习的第一步。机器学习的训练过程通常都是一件非常耗时的事情,胡乱尝试时间成本是非常高的。这里的抽象成数学问题,指的我们明确我们可以获得什么样的数据,目标是一个分类还是回归或者是聚类的问题,如果都不是的话,如果划归为其中的某类问题。
获取数据:
数据决定了机器学习结果的上限,而算法只是尽可能逼近这个上限。数据要有代表性,否则必然会过拟合。而且对于分类问题,数据偏斜不能过于严重,不同类别的数据数量不要有数个数量级的差距。而且还要对数据的量级有一个评估,多少个样本,多少个特征,可以估算出其对内存的消耗程度,判断训练过程中内存是否能够放得下。如果放不下就得考虑改进算法或者使用一些降维的技巧了。如果数据量实在太大,那就要考虑分布式了。
特征预处理与特征选择:
良好的数据要能够提取出良好的特征才能真正发挥效力。特征预处理、数据清洗是很关键的步骤,往往能够使得算法的效果和性能得到显著提高。归一化、离散化、因子化、缺失值处理、去除共线性等,数据挖掘过程中很多时间就花在它们上面。这些工作简单可复制,收益稳定可预期,是机器学习的基础必备步骤。筛选出显著特征、摒弃非显著特征,需要机器学习工程师反复理解业务。这对很多结果有决定性的影响。特征选择好了,非常简单的算法也能得出良好、稳定的结果。这需要运用特征有效性分析的相关技术,如相关系数、卡方检验、平均互信息、条件熵、后验概率、逻辑回归权重等方法。
训练模型与调优:
直到这一步才用到我们上面说的算法进行训练。现在很多算法都能够封装成黑盒供人使用。但是真正考验水平的是调整这些算法的(超)参数,使得结果变得更加优良。这需要我们对算法的原理有深入的理解。理解越深入,就越能发现问题的症结,提出良好的调优方案。
模型诊断:如何确定模型调优的方向与思路呢?这就需要对模型进行诊断的技术。过拟合、欠拟合判断是模型诊断中至关重要的一步。常见的方法如交叉验证,绘制学习曲线等。过拟合的基本调优思路是增加数据量,降低模型复杂度。欠拟合的基本调优思路是提高特征数量和质量,增加模型复杂度。误差分析 也是机器学习至关重要的步骤。通过观察误差样本,全面分析误差产生误差的原因:是参数的问题还是算法选择的问题,是特征的问题还是数据本身的问题。诊断后的模型需要进行调优,调优后的新模型需要重新进行诊断,这是一个反复迭代不断逼近的过程,需要不断地尝试, 进而达到最优状态。
模型融合:
一般来说,模型融合后都能使得效果有一定提升。而且效果很好。工程上,主要提升算法准确度的方法是分别在模型的前端(特征清洗和预处理,不同的采样模式)与后端(模型融合)上下功夫。因为他们比较标准可复制,效果比较稳定。而直接调参的工作不会很多,毕竟大量数据训练起来太慢了,而且效果难以保证。 上线运行:这一部分内容主要跟工程实现的相关性比较大。工程上是结果导向,模型在线上运行的效果直接决定模型的成败。 不单纯包括其准确程度、误差等情况,还包括其运行的速度(时间复杂度)、资源消耗程度(空间复杂度)、稳定性是否可接受。这些工作流程主要是工程实践上总结出的一些经验。并不是每个项目都包含完整的一个流程。这里的部分只是一个指导性的说明,只有大家自己多实践,多积累项目经验,才会有自己更深刻的认识。
import numpy
i = numpy.array([[520,13,14],[25,9,178]])
print("i:\n{}".format(i))
import numpy as np #取别名np
from scipy import sparse
matrix = np.eye(6) #eye函数生成6*6矩阵,其中对角线为1
sparse_matrix = sparse.csr_matrix(matrix) #吧np数值转换成csr格式的scipy稀疏矩阵(只会存取非0的元素)
print("对角矩阵:\n{}".format(matrix))
print("稀疏矩阵: \n{}".format(sparse_matrix))
import pandas
import numpy as np
import matplotlib.pyplot as plt
data ={"Name":["小米","小红","小面","小张"],
"City":["北京","上海","广州","深圳"],
"Age":["28","29","26","30"]}
data_frame = pandas.DataFrame(data)
display(data_frame)
display(data_frame[data_frame.City!="北京"])
x = np.linspace(-20,20,10)
y = x**3 + 2*x**2 + 6*x +5
plt.plot(x,y,marker = "o")
plt.show()
通常我们这么用:
自动化测试
自动化运维
测试开发
爬虫
大数据分析
科学计算
AI人工智能
机器学习和数据分析本质上都是迭代过程,由数据驱动分析。这些过程必须要有快速迭代和易于交互的工具。
正则化方法是其他算法(回归算法)的延伸,根据算法的复杂度对算法进行调整。正则化方法通常对简单模型予以奖励而对复杂算法予以惩罚。基于正则化方法的扩展 (典型是基于regression回归方法) 可能比较复杂,越简单可能会利于推广,下面列出的正则化方法是因为它们比较流行 强大简单。
岭回归数值计算方法 Ridge Regression
至少绝对的收缩和选择算子 LASSO
弹性网络 Elastic Net
决策树方法是建立一种基于数据的实际属性值的决策模型。决策使用树型结构直至基于一个给定记录的预测决策得到。决策树的训练是在分类和回归两方面的数据上进行的。
分类回归树 Classification and Regression Tree ,CART
迭代二叉树3代 Iterative Dichotomiser 3 ,ID3
卡方自动交互检测 CHAID
多元自适应回归样条 MARS
梯度推进机 Gradient Boosting Machines ,GBM
单层决策树 Decision Stump
类似群集clustering方法, 降维是寻求和利用数据的内在结构,但在这种情况下,使用无监督的方式只能较少的信息总结或描述数据。以监督方式使用是有用的,能形成可视化的三维数据或简化数据。
主成分分析 Principal Component Analysis ,PCA
偏最小二乘回归 Partial Least Squares Regression ,PLS
萨蒙映射 Sammon Mapping
多维尺度 Multidimensional Scaling ,MDS
投影寻踪 Projection Pursuit
关联规则的学习方法是提取那些能解释观察到的变量之间的数据关系的规则。这些规则可以用于在大型多维数据集里,以便能发现重要的和商业上对某个组织或公司有用的的关联。
关联规则的挖掘过程主要包括两个阶段:第一阶段为从海量原始数据中找出所有的高频项目组;第二极端为从这些高频项目组产生关联规则。关联规则挖掘技术已经被广泛应用于金融行业企业中用以预测客户的需求,各银行在自己的ATM 机上通过捆绑客户可能感兴趣的信息供用户了解并获取相应信息来改善自身的营销。
Apriori 算法
Eclat 算法