机器学习简述

加入了代码,如果不想看代码请直接跳过,这不会产生任何影响

文章来自于云栖社区,修改及补充了一些内容,增添了代码

文章目录

  • 机器学习简述
    • 机器学习算法:是使计算机具有智能的关键
    • 下面我们将选取几种常见的算法,一一介绍。
      • 1. 线性回归:找到一条直线来预测目标值
        • 线性回归运用简单举例
        • 波士顿房价预测:
      • 2. 逻辑回归:找到一条直线来分类数据
        • Python实现逻辑回归
        • 逻辑回归运用举例:研究生入学预测:
      • 3. K-近邻:用距离度量最相邻的分类标签
        • KNN运用举例,鸢尾花分类问题
      • 4. 朴素贝叶斯:选择后验概率最大的类为分类标签
        • 利用朴素贝叶斯解决鸢尾花分类问题
      • 5. 决策树:构造一棵熵值下降最快的分类树
        • 利用决策树解决鸢尾花分类问题
        • 泰坦尼克号生存分析
      • 6. 支持向量机(SVM):构造超平面,分类非线性数据
        • 利用支持向量机解决鸢尾花分类问题
      • 7. K-means:计算质心,聚类无标签数据
        • 利用k-means算法对鸢尾花数据进行聚类
      • 8. 关联分析(Association Analysis):挖掘啤酒与尿布(频繁项集)的关联规则
      • 9. PCA降维:减少数据维度,降低数据复杂度
      • 10人工神经网络:逐层抽象,逼近任意函数
      • 11.深度学习:赋予人工智能以璀璨的未来
    • - Anaconda:初学Python、入门机器学习的首选

认识人工智能,还需要理清几个概念之间的关系:人工智能是一个大的概念,是让机器像人一样思考甚至超越人类;而机器学习是实现人工智能的一种方法,是使用算法来解析数据、从中学习,然后对真实世界中的事件做出决策和预测;深度学习是机器学习的一种实现方式,通过模拟人神经网络的方式来训练网络;而统计学是机器学习和神经网络的一种基础知识。

机器学习最大的特点是利用数据而不是指令来进行各种工作,其学习过程主要包括:数据的特征提取、数据预处理、训练模型、测试模型、模型评估改进等几部分。接下来我们重点介绍机器学习过程中的常见算法。

机器学习算法:是使计算机具有智能的关键

算法是通过使用已知的输入和输出以某种方式“训练”以对特定输入进行响应。代表着用系统的方法描述解决问题的策略机制。人工智能的发展离不开机器学习算法的不断进步。 机器学习算法可以分为传统的机器学习算法和深度学习。传统机器学习算法主要包括以下五类:
• 回归:建立一个回归方程来预测目标值,用于连续型分布预测
• 分类:给定大量带标签的数据,计算出未知标签样本的标签取值
• 聚类:将不带标签的数据根据距离聚集成不同的簇,每一簇数据有共同的特征
• 关联分析:计算出数据之间的频繁项集合
• 降维:原高维空间中的数据点映射到低维度的空间中

下面我们将选取几种常见的算法,一一介绍。

1. 线性回归:找到一条直线来预测目标值

一个简单的场景:已知房屋价格与尺寸的历史数据,问面积为2000时,售价为多少?

此类问题可以用回归算法来解决。回归是指确定两种或两种以上变量间相互依赖的定量关系的一种统计分析方法,通过建立一个回归方程(函数)来估计特征值对应的目标变量的可能取值。 最常见的是线性回归(Y= a X + b),即找到一条直线来预测目标值。回归的求解就是求解回归方程的回归系数(a,b)的过程,并且使误差最小。 房价场景中,根据房屋面积和售价的关系,求出回归方程,则可以预测给定房屋面积时的售价。

线性回归的应用非常广泛,例如:
预测客户终生价值: 基于老客户历史数据与客户生命周期的关联关系,建立线性回归模型,预测新客户的终生价值,进而开展针对性的活动。
机场客流量分布预测: 以海量机场WiFi数据及安检登机值机数据,通过数据算法实现机场航站楼客流分析与预测。
货币基金资金流入流出预测: 通过用户基本信息数据、用户申购赎回数据、收益率表和银行间拆借利率等信息,对用户的申购赎回数据的把握,精准预测未来每日的资金流入流出情况。
电影票房预测: 依据历史票房数据、影评数据、舆情数据等互联网公众数据,对电影票房进行预测。

线性回归运用简单举例

  • 输入:[[0, 0], [1, 1], [2, 2]]——两个输入
  • 输出:[0, 1, 2]
  • 预测:[3, 3]
from sklearn.linear_model import LinearRegression'''
LinearRegression 的常用方法有: decision_function(X)
#返回 X 的预测值 y fit(X,y[,n_jobs])
#拟合模型 get_params([deep])
#获取 LinearRegression 构造方法的参数信息
predict(X) #求预测值
#同 decision_function
'''
clf=LinearRegression()             #构建相应模型
clf.fit([[0,0],[1,1],[2,2]],[0,1,2])#模型训练
pre=clf.predict([[3,3]])           #模型预测 ,得到预测值pre
print(clf.coef_)#系数, y=0.5*x1+0.5*x2
print(pre)

结果:

另一个经典案例:

波士顿房价预测:

'''波士顿房价数据集(Boston House Price Dataset)包含对房价的预测,以千美元计,给定的条件是房屋及其相邻房屋的详细信息。
该数据集是一个回归问题。每个类的观察值数量是均等的,共有 506 个观察,13 个输入变量和1个输出变量。
sklearn库的datasets包含该数据集( load_boston)
'''
from sklearn.datasets import load_boston
from sklearn.linear_model import LinearRegression
import matplotlib.pyplot as pltbosten=load_boston()#实例化
x_train=bosten.data[:,5:6]#选择住宅平均数那一列,猜测房价应该跟房价成正比
clf=LinearRegression()
clf.fit(x_train,bosten.target)#模型训练
print(clf.coef_) #回归系数
y_pre=clf.predict(x_train)#模型输出值
plt.scatter(x_train,bosten.target) #实际值,散点图
plt.plot(x_train,y_pre,color='red')#绘制拟合曲线
plt.show()

运行结果:


2. 逻辑回归:找到一条直线来分类数据

逻辑回归虽然名字叫回归,却是属于分类算法,是通过Sigmoid函数(或者称为Logistic函数,逻辑名称的由来)将线性函数的结果映射到Sigmoid函数中,预估事件出现的概率并分类。
也就是逻辑回归仅在线性回归分析的基础上套用了一个逻辑函数,用于预测二值型因变量。

Sigmoid是归一化的函数,可以把连续数值转化为0到1的范围,提供了一种将连续型的数据离散化为离散型数据的方法。
我们可以画出sigmoid函数:

因此,逻辑回归从直观上来说是画出了一条分类线。位于分类线一侧的数据,概率>0.5,属于分类A;位于分类线另一侧的数据,概率<0.5,属于分类B。
例如图中通过计算患肿瘤的概率,将结果分类两类,分别位于逻辑分类线的两侧。

逻辑回归是计算广告学的核心,逻辑回归可以通过历史数据预测用户未来可能发生的购买行为。

Python实现逻辑回归

初始化变量

class LogisticRegressionSelf:def __init__(self):"""初始化Logistic regression模型"""self.coef_ = None #维度self.intercept_ = None #截距self._theta = None#学习速率

实现sigmoid函数:

def _sigmoid(x):y = 1.0 / (1.0 + np.exp(-x))return y

实现损失函数:
关于公式的推导请看吴恩达机器学习教程-简化代价函数语梯度下降

#计算损失函数def J(theta,X_b,y):p_predcit = self._sigmoid(X_b.dot(theta))try:return -np.sum(y*np.log(p_predcit) + (1-y)*np.log(1-p_predcit)) / len(y)except:return float('inf')

然后还需实现损失函数的导数:

完整代码:

import numpy as npclass LogisticRegressionSelf:def __init__(self):"""初始化Logistic regression模型"""self.coef_ = None #维度self.intercept_ = None #截距self._theta = None#sigmoid函数,私有化函数def _sigmoid(self,x):y = 1.0 / (1.0 + np.exp(-x))return ydef fit(self,X_train,y_train,eta=0.01,n_iters=1e4):assert X_train.shape[0] == y_train.shape[0], '训练数据集的长度需要和标签长度保持一致'#计算损失函数def J(theta,X_b,y):p_predcit = self._sigmoid(X_b.dot(theta))try:return -np.sum(y*np.log(p_predcit) + (1-y)*np.log(1-p_predcit)) / len(y)except:return float('inf')#求sigmoid梯度的导数def dJ(theta,X_b,y):x = self._sigmoid(X_b.dot(theta))return X_b.T.dot(x-y)/len(X_b)#模拟梯度下降def gradient_descent(X_b,y,initial_theta,eta,n_iters=1e4,epsilon=1e-8):theta = initial_thetai_iter = 0while i_iter < n_iters:gradient = dJ(theta,X_b,y)last_theta = thetatheta = theta - eta * gradienti_iter += 1if (abs(J(theta,X_b,y) - J(last_theta,X_b,y)) < epsilon):breakreturn thetaX_b = np.hstack([np.ones((len(X_train),1)),X_train])initial_theta = np.zeros(X_b.shape[1]) #列向量self._theta = gradient_descent(X_b,y_train,initial_theta,eta,n_iters)self.intercept_ = self._theta[0] #截距self.coef_ = self._theta[1:] #维度return selfdef predict_proba(self,X_predict):X_b = np.hstack([np.ones((len(X_predict), 1)), X_predict])return self._sigmoid(X_b.dot(self._theta))def predict(self,X_predict):proba = self.predict_proba(X_predict)return np.array(proba > 0.5,dtype='int'

逻辑回归运用举例:研究生入学预测:

部分数据集截图:

数据的格式如下:

-admit :表示是否被录取(目标变量)
-gre:标准入学考试成绩,预测变量
-gpa:学业平均绩点,预测变量
-rank:母校排名(预测变量)

from sklearn.linear_model import LogisticRegression
from sklearn.model_selection import train_test_split
from sklearn.metrics import classification_report#分类报告
import pandas as pddata=pd.read_csv('LogisticRegression.csv')
data.shape#(400,4)
x_train,x_test,y_train,y_test=train_test_split(data.iloc[:,1:],data['admit'],test_size=0.2)#80%训练,20测试
clf=LogisticRegression()#逻辑回归模型加载
clf.fit(x_train,y_train)#拟合'
pre=clf.predict(x_test)
res=classification_report(y_test,pre)#参数(y_true,y_pre)
print(res)
print('逻辑回归的准确率为:{0:.2f}%'.format(clf.score(x_test, y_test)*100))

运行结果:



3. K-近邻:用距离度量最相邻的分类标签

一个简单的场景:已知一个电影中的打斗和接吻镜头数,判断它是属于爱情片还是动作片。当接吻镜头数较多时,根据经验我们判断它为爱情片。那么计算机如何进行判别呢?

可以使用K近邻算法,其工作原理如下:

  • 计算样本数据中的点与当前点之间的距离

  • 算法提取样本最相似数据(最近邻)的分类标签

  • 确定前k个点所在类别的出现频率. 一般只选择样本数据集中前k个最相似的数据,这就是k-近邻算法中k的出处,通常k是不大于20的整数

  • 返回前k个点所出现频率最高的类别作为当前点的预测分类

电影分类场景中,k取值为3,按距离依次排序的三个点分别是动作片(108,5)、动作片(115,8)、爱情片(5,89)。在这三个点中,动作片出现的频率为三分之二,爱情片出现的频率为三分之一,所以该红色圆点标记的电影为动作片。

K近邻算法的一个常见应用是手写数字识别。手写字体对于人脑来说,看到的数字是一幅图像,而在电脑看来这是一个二维或三维数组,那怎么对数字进行识别?

使用K近邻算法的进行识别的具体步骤为:
• 首先将每个图片处理为具有相同的色彩和大小:宽高是32像素x32像素。
• 将32x32的二进制图像矩阵转换成1x1024的测试向量。
• 将训练样本储存在训练矩阵中,创建一个m行1024列的训练矩阵,矩阵的每行数据存储一个图像。
• 计算目标样本与训练样本的距离,选择前k个点所出现频率最高的数字作为当前手写字体的预测分类。

KNN运用举例,鸢尾花分类问题

from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.neighbors import KNeighborsClassifier
iris =load_iris()#导入数据
data_tr, data_te, label_tr, label_te = train_test_split(iris.data,iris.target)
#test_size默认取0.25model = KNeighborsClassifier(n_neighbors=5)
model.fit(data_tr,label_tr)
pre=model.predict(data_te)#模型预测
print(pre)  #预测值
print(label_te)#实际值
model.score(data_te,label_te)#注意这里放的是data不是pre,在测试集的精度

运行截图:


4. 朴素贝叶斯:选择后验概率最大的类为分类标签

一个简单的场景:一号碗(C1)有30颗水果糖和10颗巧克力糖,二号碗(C2)有水果糖和巧克力糖各20颗。现在随机选择一个碗,从中摸出一颗糖,发现是水果糖。

问这颗水果糖(X)最有可能来自哪个碗?这类问题可以借助贝叶斯公式来计算,不需要针对目标变量建立模型。在分类时,通过计算样本属于各个类别的概率,然后取概率值大的类别作为分类类别。

P(X|C): 条件概率,C中X出现的概率
P©: 先验概率,C出现的概率
P(C|X): 后验概率,X属于C类的概率

假设有 C1 和 C2 两个类,由于 P(X)都是一样的,所以不需要考虑 P(X) 只需考虑如下:
如果 P(X|C1)P(C1) > P(X|C2)P(C2),则 P(C1|X) > P(C2|X),得 X 属于C1;
如果 P(X|C1) P(C1) < P(X|C2) P(C2),则 P(C2|X) < P(C2|X),得 X 属于C2。

例如上面的例子中: P(X): 水果糖的概率为5/8
P(X|C1): 一号碗中水果糖的概率为3/4
P(X|C2): 二号碗中水果糖的概率为2/4
P(C1)=P(C2): 两个碗被选中的概率相同,为1/2

则水果糖来自一号碗的概率为:
$P(C1|X)=P(X|C1)P(C1)/P(X)=(3/4)(1/2)/(5/8)=3/5
水果糖来自二号碗的概率为:
P(C2|X)=P(X|C2)P(C2)/P(X)=(2/4)(1/2)/(5/8)=2/5
P(C1|X)>P(C2|X)

因此这颗糖最有可能来自一号碗。

朴素贝叶斯的主要应用有文本分类、垃圾文本过滤,情感判别,多分类实时预测等。

利用朴素贝叶斯解决鸢尾花分类问题

from sklearn import  datasetsiris = datasets.load_iris() #载入数据from sklearn import naive_bayes
#高斯朴素贝叶斯
gnb = naive_bayes.GaussianNB()
y_pre = gnb.fit(iris.data,iris.target).predict(iris.data)
print("number of mislabeld points out of a total %d points :%d"%\(iris.data.shape[0],(iris.target != y_pre).sum()))#多项式朴素贝叶斯分类
gml = naive_bayes.MultinomialNB()
y_pre = gml.fit(iris.data,iris.target).predict(iris.data)
print("number of mislabeld points out of a total %d points :%d"%\(iris.data.shape[0],(iris.target != y_pre).sum()))#伯努利朴素贝叶斯
gbn = naive_bayes.BernoulliNB()
y_pre = gbn.fit(iris.data,iris.target).predict(iris.data)
print("number of mislabeld points out of a total %d points :%d"%\(iris.data.shape[0],(iris.target != y_pre).sum()))

运行结果:

number of mislabeld points out of a total 150 points :6
number of mislabeld points out of a total 150 points :7
number of mislabeldpoints out of a total 150 points :100


可以看到,高斯和多项式朴素贝叶斯方法预测的结果错误数只有6、7个。而伯努利朴素贝叶斯缺高达100个。这是因为高斯分布和多项式分布可以较好的近似鸢尾花数据,而伯努利分布(二项分布)不适用于鸢尾花数据。因此要根据实际数据来选用哪个模型。


5. 决策树:构造一棵熵值下降最快的分类树

一个简单的场景:
相亲时,可能首先检测相亲对方是否有房。如果有,则考虑进一步接触。如果没有房,则观察其是否有上进心,如果没有,直接Say Goodbye。如果有,则可以列入候选名单。

这就是一个简单的决策树模型。决策树是一种树型结构,其中每个内部结点表示在一个属性上的测试,每个分支代表一个测试输出,每个叶结点代表一种类别。采用的是自顶向下的递归方法,选择信息增益最大的特征作为当前的分裂特征。

决策树可以应于:用户分级评估、贷款风险评估、选股、投标决策等。

利用决策树解决鸢尾花分类问题

0))
from sklearn.datasets import load_iris  #导入数据
from sklearn.tree import DecisionTreeClassifier#导入模型
from sklearn.model_selection import train_test_split #划分数据
​
iris = load_iris()
data_tr, data_te, label_tr, label_te = train_test_split(iris.data, iris.target, test_size=0.2)
​
model = DecisionTreeClassifier() #增加迭代的次数
model = model.fit(data_tr,label_tr) #模型拟合
pre = model.predict(data_te)
pre
​
acc = sum(pre == label_te)/len(pre)
print("正确率:%.2f%%" %(acc*100))'''
正确率:93.33%
'''

泰坦尼克号生存分析

数据说明:

Index(['Survived', 'Pclass', 'Sex', 'Age'], dtype='object')
import pandas as pd
from sklearn.tree import DecisionTreeClassifier, export_graphviz
from sklearn.metrics import classification_reportdata = pd.read_csv('titanic_data.csv')
data #(891,5)#数据处理
data.drop('PassengerId', axis=1, inplace=True)   # 删除PassengerId 列
data.loc[data['Sex'] == 'male', 'Sex'] = 1       # 用数值1来代替male,用0来代替female
data.loc[data['Sex'] == 'female', 'Sex'] = 0
data.fillna(data['Age'].mean(), inplace=True)    # 用均值来填充缺失值Dtc = DecisionTreeClassifier(max_depth=5, random_state=8)    # 构建决策树模型
Dtc.fit(data.iloc[:, 1:], data['Survived'])       # 模型训练
pre = Dtc.predict(data.iloc[:, 1:])               # 模型预测
pre == data['Survived']                           # 比较模型预测值与样本实际值是否一致
classification_report(data['Survived'], pre)      # 分类报告

’ precision recall f1-score support
0 0.84 0.88 0.86 549
1 0.79 0.73 0.76 342
accuracy 0.82 891
macro avg 0.82 0.81 0.81 891
weighted avg 0.82 0.82 0.82 891’

import graphviz
dot_data = export_graphviz(Dtc, feature_names=['Pclass', 'Sex', 'Age'], class_names='Survived')
graph = graphviz.Source(dot_data)       # 决策树可视化
graph


局部截图:


6. 支持向量机(SVM):构造超平面,分类非线性数据

一个简单的场景:
要求用一根线将不同颜色的球分开,要求尽量在放更多球之后,仍然适用。 A、B两条线都可以满足条件。再继续增加球,线A仍可以将球很好的分开,而线B则不可以。

进一步增加难度,当球没有明确的分界线,用一条直线已经无法将球分开,该怎么解决?

这个场景中涉及支持向量机的的两个问题:

  1. 当一个分类问题,数据是线性可分时,只要将线的位置放在让小球距离线的距离最大化的位置即可,寻找这个最大间隔的过程,就叫做最优化。
  2. 一般的数据是线性不可分的,可以通过核函数,将数据从二维映射到高位,通过超平面将数据切分。
    不同方向的最优决策面的分类间隔通常是不同的,那个具有“最大间隔”的决策面就是SVM要寻找的最优解。这个真正的最优解对应的两侧虚线所穿过的样本点,就是SVM中的支持样本点,称为支持向量。
    SVM的应用非常广泛,可以应用于垃圾邮件识别、手写识别、文本分类、选股等。

利用支持向量机解决鸢尾花分类问题

from sklearn.datasets import load_iris  #导入数据
from sklearn.svm import LinearSVC #导入模型
from sklearn.model_selection import train_test_split #划分数据iris = load_iris()
data_tr, data_te, label_tr, label_te = train_test_split(iris.data, iris.target, test_size=0.2)model = LinearSVC(max_iter=10000) #增加迭代的次数
model = model.fit(data_tr,label_tr) #模型拟合
pre = model.predict(data_te)
preacc = sum(pre == label_te)/len(pre)
print("正确率:%.2f%%" %(acc*100))

SVC是支持向量机的一种
可以这样简单的理解:

  • SVM=Support Vector Machine 是支持向量
  • SVC=Support Vector Classification就是支持向量机用于分类,
  • SVR=Support Vector Regression.就是支持向量机用于回归分析


可以看到,支持向量机的分类效果还是非常好的


7. K-means:计算质心,聚类无标签数据

在上面介绍的分类算法中,需要被分类的数据集已经有标记,例如数据集已经标记为○或者×,通过学习出假设函数对这两类数据进行划分。而对于没有标记的数据集,希望能有一种算法能够自动的将相同元素分为紧密关系的子集或簇,这就是聚类算法。

举个具体的例子,例如有一批人的年龄的数据,大致知道其中有一堆少年儿童,一堆青年人,一堆老年人。

聚类就是自动发现这三堆数据,并把相似的数据聚合到同一堆中。如果要聚成3堆的话,那么输入就是一堆年龄数据,注意,此时的年龄数据并不带有类标号,也就是说只知道里面大致有三堆人,至于谁是哪一堆,现在是不知道的,而输出就是每个数据所属的类标号,聚类完成之后,就知道谁和谁是一堆了。

而分类就是,事先告诉你,少年儿童、青年人及老年人的年龄是什么样的,现在新来了一个年龄,输入它的年龄,输出她属于的分类。一般分类器是需要训练的,它才能识别新的数据。

K-Means算法是一种常见的聚类算法,其基本步骤为:

  1. 随机生成k个初始点作为质心;
  2. 将数据集中的数据按照距离质心的远近分到各个簇中;
  3. 将各个簇中的数据求平均值,作为新的质心,重复上一步,直到所有的簇不再改变。 两个分类间隔越远,则聚类效果越好。

K-means算法的一个案例是:客户价值细分,精准投资。
以航空公司为例,因为业务竞争激烈,企业营销焦点从产品中心转为客户中心;建立合理的客户价值评估模型,进行客户分类,进行精准营销,是解决问题的关键。

识别客户价值,通过五个指标:最近消费时间间隔R,消费频率F,飞行里程 M和折扣系数的平均值C,客户关系长度L(LRFMC模型)。采用K-Means算法对客户数据进行客户分群,聚成五类(需结合业务的理解与分析来确定客户的类别数量)绘制客户群特征雷达图。

客户价值分析:

  • 重要保持客户:C、F、M较高,R低。应将资源优先投放到这类客户身上,进行差异化管理,提高客户的忠诚度和满意度。

  • 重要发展客户:C较高,R、F、M较低。这类客户入会时长(L)短、当前价值低、发展潜力大,应促使客户增加在本公司和合作伙伴处的消费。

  • 重要挽留客户:C、F 或 M 较高,R较高 或 L变小,客户价值变化的不确定性高。应掌握客户最新信息、维持与客户的互动。

  • 一般和低价值客户:C、F、M、L低、R较高。这类客户可能在打折促销时才会选择消费。

K-means算法的一个比较有趣的案例是进行图像压缩。在彩色图像中,每个像素的大小为3字节(RGB),可以表示的颜色总数为256 256 256。利用K-means算法把类似的颜色分别放在K个簇中,因此只需要保留每个像素的标签,以及每个簇的颜色编码即可完成图像的压缩。

利用k-means算法对鸢尾花数据进行聚类

from sklearn.datasets import load_iris
import numpy as npiris = load_iris() #假设我们不知道有标签
data = iris.data  #data.shape=(150, 4)
n = len(data) #样本个数
k=3 #自定义k值
#1、选中心
center = data[:k,:] #选前k个样本作为类中心,shape=(k,4)
center_new = np.zeros([k,data.shape[1]])
dist = np.zeros([n,k+1])#shape=(n,4),最后一列填分类类型
#2、求距离
#构建距离矩阵
while True:for i in range(n):for j in range(k):#j是类别dist[i,j]=np.sqrt(sum((data[i,:]-center[j,:])**2))#欧氏距离#3、归类dist[i,k] = np.argmin(dist[i,:k]) #把每一行最小值的位置放入最后一列#4、求新类中心for i in range(k):index = dist[:,k]==icenter_new[i,:] = data[index,:].mean(axis=0) #按列求均值#5、判定if np.all(center == center_new): #样本中心不再发生变化breakcenter = center_new#利用真实值评估一下结果
print((iris.target != dist[:,k]).sum()/len(iris.target))

结果:


8. 关联分析(Association Analysis):挖掘啤酒与尿布(频繁项集)的关联规则

20世纪90年代美国沃尔玛超市中,超市管理人员分析销售数据时发现 “啤酒”与“尿布”两件看上去毫无关系的商品会经常出现在同一个购物篮中。经过调查发现,这种现象出现在年轻的父亲身上。在美国有婴儿的家庭中,一般是母亲在家中照看婴儿,年轻的父亲去超市买尿布时,往往会顺便为自己购买啤酒。如果在卖场只能买到两件商品之一,他很有可能会放弃购物而去另一家可以同时买到啤酒与尿布的商店。由此,沃尔玛发现了这一独特的现象,开始在卖场尝试将啤酒与尿布摆放在相同区域,让年轻的父亲可以同时找到这两件商品,从而获得了很好的商品销售收入。

“啤酒+尿布”故事中利用的就是关联算法,比较常见的一种关联算法是FP-growth算法。

算法中几个相关的概念:
• 频繁项集(Frequent Item Sets):在数据库中大量频繁出现的数据集合。例如购物单数据中{‘啤酒’}、{‘尿布’}、{‘啤酒’, ‘尿布’}出现的次数都比较多。

• 关联规则(Association Rules):由集合 X,可以在某置信度下推出集合 Y。关联规则是形如X->Y的蕴含表达式,X称为前件,Y称为后件,X和Y不包含相同的项。即如果 X 发生了,那么 Y 也很有可能会发生。
例如购买了{‘尿布’}的人很可能会购买{‘啤酒’}。 关联规则暗示两个物品之间可能存在很强的关系。

• 支持度(Support):指某频繁项集在整个数据集中的比例。假设数据集有 10 条记录,包含{‘啤酒’, ‘尿布’}的有 5 条记录,那么{‘啤酒’, ‘尿布’}的支持度就是 5/10 = 0.5。

• 置信度(Confidence):出现某些物品时,另外一些物品必定出现的概率,针对规则而言。
有关联规则如{‘尿布’} -> {‘啤酒’},它的 置信度 = 支持度{尿布,啤酒}/支持度{尿布}

假设{‘尿布’, ‘啤酒’}的支持度为 0.45,{‘尿布’}的支持度为 0.5,则{‘尿布’} -> {‘啤酒’}的置信度为 0.45 / 0.5 = 0.9。

关联分析应用比较广泛,例如: 用于制定营销策略。如同啤酒与尿布的例子,超市如果将啤酒和尿布放在相邻的位置,会增加两者的销量。 用于发现共现词。在浏览器中输入"普元"时,浏览器自动弹出如"普元平台","普元EOS"等备选记录。

FP-growth算法一个简单的案例:通过购物车数据,分析商品之间的关联关系。

分析步骤为:

  1. 从购物车数据中挖掘出频繁项集
  2. 从频繁项集中产生关联规则,计算支持度
  3. 输出置信度


根据结果,可以分析出购买了鞋子,极有可能会同时购买袜子;购买了鸡蛋与面包,极有可能会购买牛奶。
参考:关联分析


9. PCA降维:减少数据维度,降低数据复杂度

降维是指将原高维空间中的数据点映射到低维度的空间中。因为高维特征的数目巨大,距离计算困难,分类器的性能会随着特征数的增加而下降;减少高维的冗余信息所造成的误差,可以提高识别的精度。

比较常用的是主成分分析算法(PCA)。它是通过某种线性投影,将高维的数据映射到低维的空间中表示,并期望在所投影的维度上数据的方差最大,以此使用较少的数据维度,同时保留住较多的原数据点的特性。

例如对数字进行降维,当使用1个特征向量的时候,3的基本轮廓已经保留下来了,特征向量使用的越多就越与原始数据接近。


10人工神经网络:逐层抽象,逼近任意函数

前面介绍了九种传统的机器学习算法,现在介绍一下深度学习的基础:人工神经网络。 它是模拟人脑神经网络而设计的模型,由多个节点(人工神经元)相互联结而成,可以用来对数据之间的复杂关系进行建模。不同节点之间的连接被赋予了不同的权重,每个权重代表了一个节点对另一个节点的影响大小。每个节点代表一种特定函数,来自其他节点的信息经过其相应的权重综合计算。是一个可学习的函数,接受不同数据的训练,不断通过调整权重而得到契合实际模型,一个三层的神经网络可以逼近任意的函数。

例如利用单层神经网络实现逻辑与门和同或门。

多层神经网络的每一层神经元学习到的是前一层神经元值的更抽象的表示,通过抽取更抽象的特征来对事物进行区分,从而获得更好的区分与分类能力。例如在图像识别中,第一个隐藏层学习到的是 “边缘”的特征,第二层学习由“边缘”组成的“形状”的特征,第三层学习到的是由“形状”组成的“图案”的特征,最后的隐藏层学习到的是由“图案”组成的“目标”的特征。


11.深度学习:赋予人工智能以璀璨的未来

深度学习是机器学习的分支,是对人工神经网络的发展。深度学习是当今人工智能爆炸的核心驱动,赋予人工智能以璀璨的未来。

看一下深度学习与传统机器学习的区别。传统机器学习特征处理和预测分开,特征处理一般需要人工干预完成。这类模型称为浅层模型,或浅层学习,不涉及特征学习,其特征主要靠人工经验或特征转换方法来抽取。

要提高一种表示方法的表示能力,其关键是构建具有一定深度的多层次特征表示 。一个深层结构的优点是可以增加特征的重用性,从而指数级地增加表示能力。从底层特征开始,一般需要多步非线性转换才能得到较为抽象的高层语义特征。这种自动学习出有效特征的方式称为“表示学习”。

深度学习就是一种基于对数据进行表征学习的方法,使用多层网络,能够学习抽象概念,同时融入自我学习,逐步从大量的样本中逐层抽象出相关的概念,然后做出理解,最终做出判断和决策。通过构建具有一定“深度”的模型,可以让模型来自动学习好的特征表示(从底层特征,到中层特征,再到高层特征),从而最终提升预测或识别的准确性。

目前深度学习的应用十分广泛,例如图像识别、语音识别、机器翻译、自动驾驶、金融风控、智能机器人等。

关于神经网络: 从深度神经网络(DNN)到卷积神经网络(CNN)


- Anaconda:初学Python、入门机器学习的首选

入门机器学习的首选 已经了解了机器学习过程中使用的算法,那么该如何动手实践呢? Anaconda是初学Python、入门机器学习的首选。它是一个用于科学计算的Python发行版,提供了包管理与环境管理的功能,可以很方便地解决多版本python并存、切换以及各种第三方包安装问题。

集成包功能:

• NumPy:提供了矩阵运算的功能,其一般与Scipy、matplotlib一起使用,Python创建的所有更高层工具的基础,不提供高级数据分析功能
• Scipy:依赖于NumPy,它提供便捷和快速的N维向量数组操作。提供模块用于优化、线性代数、积分以及其它数据科学中的通用任务。
• Pandas:基于NumPy 的一种工具,该工具是为了解决数据分析任务而创建的,包含高级数据结构,以及和让数据分析变得快速、简单的工具
• Matplotlib:Python最著名的绘图库

其中, Scikit-Learn是Anaconda中集成的开源机器学习工具包,主要涵盖分类,回归和聚类算法,可以直接调用传统机器学习的算法进行使用。同时Anaconda也兼容Google开发的第二代人工智能系统TensorFlow,进行深度学习的开发。
最后通过一个基于Python的决策树案例,来直观了解一下机器学习的过程。 贷款申请的决策树,用以对未来的贷款申请进行分类。
具体实现过程:

  1. 准备数据集:从贷款申请样本数据表中,选取对训练数据具有分类能力的特征
  2. 构建树:选择信息增益最大的特征作为分裂特征构建决策树
  3. 数据可视化:使用Matplotlib对数据进行可视化
  4. 执行分类:用于实际数据的分类。例如输入测试数据[0,1],它代表没有房子,但是有工作,分类结果为“房贷”。

参考资料:
1、https://tianchi.aliyun.com/notebook-ai/detail?spm=5176.12282042.0.0.4e662042lnwuzX&postId=6239

2、《深度学习与图像识别:原理与实践》

3、泰迪挑战杯培训指导

拥抱人工智能--机器学习(附python代码)相关推荐

  1. 机器学习系列(12)_XGBoost参数调优完全指南(附Python代码)

    机器学习系列(12)_XGBoost参数调优完全指南(附Python代码) 原文链接:http://blog.csdn.net/han_xiaoyang/article/details/5266539 ...

  2. python重点知识归纳_一文了解机器学习知识点及其算法(附python代码)

    一文了解机器学习知识点及其算法(附python代码) 来源:数据城堡 时间:2016-09-09 14:05:50 作者: 机器学习发展到现在,已经形成较为完善的知识体系,同时大量的数据科学家的研究成 ...

  3. 教程 | 理解和实现自然语言处理终极指南(附Python代码)

     教程 | 理解和实现自然语言处理终极指南(附Python代码) 时间 2017-02-16 14:41:39 机器之心 原文  http://www.jiqizhixin.com/article ...

  4. XGBoost参数调优完全指南(附Python代码)

    XGBoost参数调优完全指南(附Python代码) 译注:文内提供的代码和运行结果有一定差异,可以从这里下载完整代码对照参考.另外,我自己跟着教程做的时候,发现我的库无法解析字符串类型的特征,所以只 ...

  5. python随机森林变量重要性_推荐 :一文读懂随机森林的解释和实现(附python代码)...

    原标题:推荐 :一文读懂随机森林的解释和实现(附python代码) 作者:WilliamKoehrsen:翻译:和中华:校对:李润嘉 本文约6000字,建议阅读15分钟. 本文从单棵决策树讲起,然后逐 ...

  6. 基于ANFIS的股票价格预测附Python代码

    基于ANFIS的股票价格预测附Python代码 在金融领域,股票价格预测一直是一个重要的问题.随着机器学习技术的发展,人们开始尝试使用神经网络等方法进行股票价格的预测. ANFIS(自适应网络基石推理 ...

  7. 基于TextRank算法的文本摘要(附Python代码)

    基于TextRank算法的文本摘要(附Python代码): https://www.jiqizhixin.com/articles/2018-12-28-18

  8. 从入门到入土:机器学习part01|python|代码分析|初步学习

    此博客仅用于记录个人学习进度,学识浅薄,若有错误观点欢迎评论区指出.欢迎各位前来交流.(部分材料来源网络,若有侵权,立即删除) 本人博客所有文章纯属学习之用,不涉及商业利益.不合适引用,自当删除! 若 ...

  9. python 合并工作簿_Excel:快速合并多张表格或多个文件(工作簿)的数据(附Python代码)...

    Excel:快速合并多张表格或多个文件(工作簿)的数据(附Python代码) 现实工作中经常遇到将零散的原始数据合并统计的工作要求,如月度统计或年度统计等.原始数据的收集大多是按时间(如日期或小时)进 ...

  10. Excel:快速合并多张表格或多个文件(工作簿)的数据(附Python代码)

    Excel:快速合并多张表格或多个文件(工作簿)的数据(附Python代码) 现实工作中经常遇到将零散的原始数据合并统计的工作要求,如月度统计或年度统计等.原始数据的收集大多是按时间(如日期或小时)进 ...

最新文章

  1. Strategy_Level2
  2. Oracle:ORA-12560和ORA-01031
  3. ARM汇编语言中的程序结构
  4. 二分平均值聚类 java_二分K-均值聚类算法
  5. DataX在数据迁移中的应用
  6. 迭代器(Iterator)遍历的两种方法(for和while)
  7. [Cnoi2019]须臾幻境(LCT维护最大生成树+主席树/分块)
  8. [floyd+路径输出]HDU1385 Minimum Transport Cost
  9. 西瓜书+实战+吴恩达机器学习(八)监督学习之朴素贝叶斯 Naive Bayes
  10. jni android rect.h,解决 fatal error: jni_md.h: No such file or directory #include “jni_md.h”
  11. Ajax 浏览器跨域访问控制
  12. xstream-0 使用入门
  13. Java 8新特性探究(十一)Base64详解
  14. ArcGIS中的GeoDatabase(地理数据库)功能,你可能不够了解
  15. C++笔试题目大全(笔试宝典)(转)
  16. CubeMX设置STM32 Timer预分频(PSC)
  17. 配置aconda_重装windows系统后配置Anaconda
  18. Android音视频开发:AudioRecord录制音频
  19. php 商户转账到微信零钱
  20. 深度学习(3):不同分类模型的评价指标(F1、Recall、P)

热门文章

  1. 彻底理解git 本地分支与远程分支,以及git pull与git fetch的区别, 以及git status输出的“Your branch is behind xxx”
  2. 什么是code-Behind技术?
  3. 微信浏览器禁止app下载链接怎么办怎么解决
  4. 字节跳动1/3员工不支持取消大小周!库克称iPhone将采用可回收材料生产;清华博士接亲被要求现场写代码|极客头条
  5. 算法——判断圆和矩形是否有重叠
  6. 安卓微信点击链接自动跳出微信在手机自带的浏览器中下载APK文件(IOS无需上架直接跳转 App Store)
  7. 登录Exchange 2013 OWA或ECP “HTTP 500内部服务器错误”的解决办法
  8. oracle周期成本取得,oracle成本核算
  9. Android 用adb pull或push 拷贝手机文件到到电脑上
  10. C#,哈夫曼编码(Huffman Code)压缩(Compress )与解压缩(Decompress)算法与源代码