机器学习从理论到实践(常见算法)

1机器学习引言

1.1

机器学习是什么?先看下面这张图片
在这里插入图片描述我们人是怎么分辨的,可能是通过是否有胡须,喉结,长发短发等特征区别的。那么机器如何完成这个过程。
“学习”的概念
请分别讨论下列各组数据的内部关系,并填空。
在这里插入图片描述 y 1 y_1 y1 = x 1 x_1 x1 + 1.5
在这里插入图片描述 y 2 y_2 y2 = x 2 2 x_2^2 x22 + 1.5
在这里插入图片描述 y = x 1 3 2 + x 2 2 + 1 y = x_1^\frac{3}{2} + x_2^2 + 1 y=x123+x22+1

下列鸢尾花分别属于哪一类:setosa、versicolor、virginica
在这里插入图片描述如果我们没有相关的生物知识可能无法区分,那么机器如何学习呢
在这里插入图片描述机器能不能通过上面的数据进行学习,其实是可以的
在这里插入图片描述机器学习的概念
1 致力于研究如何通过计算的手段,利用经验(历史数据)来改善系统自身的性能[机器学习]。
2从数据中产生模型的算法,即“学习算法”。
下面看周志华西瓜书的一个例子
在这里插入图片描述

1.2机器学习的基本术语

还是以判断好瓜坏瓜为例
在这里插入图片描述• 学习(训练):从数据中学得模型的过程
• 训练集:参与模型训练的样本集合
• 测试:学得模型后,使用其样本进行预测的过程
• 测试集:被预测的样本集合
• 假设:学得模型对应的关于数据的某种潜在规律
• 分类:输出结果是离散值
• 回归:输出结果是连续值
• 监督学习:训练样本有标记
• 无监督学习:训练样本无标记
• 泛化能力:学得模型适用于新样本的能力
• 独立同分布:样本空间的全体样本都服从一个未知的分布,且相互独立

假设就是,比如上面的 y 1 y_1 y1 = x 1 x_1 x1 + 1.5,这就是对所属数据集的一种假设
泛化能力是评判模型性能好坏的重要标准

1.3假设空间

归纳与演绎
归纳:
从特殊到一般的“泛化”:从样例(训练样本)中学习。
演绎:
从一般到特殊的“特化”:从数学公理推导出定理。
机器学习属于第一种,归纳
归纳
根据已知数据集总结满足何种条件的西瓜是好瓜

  • 色泽乌黑、根蒂蜷缩、敲声浊响的就是好瓜?
  • 色泽乌黑、根蒂稍蜷、敲声沉闷的就不是好瓜?

在这里插入图片描述

好瓜的假设空间
若色泽、根蒂、敲声皆有3种取值,加上某种属性什么都不取和没有好瓜这个概念,则假设空间共有 4 X 4 X 4 + 1 =65种假设(规则)
比如
在这里插入图片描述
我们可以假设符合上面条件的就是好瓜,当然也可以假设其他条件,这样的规则总共又65种
在这里插入图片描述我们需要从中找到可以推到其他西瓜上的假设

与训练集一致的假设的集合称为“版本空间” ,下侧数据集好瓜的版本空间如下:
在这里插入图片描述好瓜的版本空间
在这里插入图片描述在上述的历史数据集中这三条假设都满足是好瓜,也就是好瓜的版本空间
上述三条假设都成立,那么我们选择哪一条,三条都选择吗?我们要从中选择一条假设,这就是归纳偏好

1.4归纳偏好

• 新西瓜:(色泽=青绿:根蒂=蜷缩;敲声=沉闷),是否为好瓜?
• 对新样本,不同假设可能输出不同结果。问题:该相信哪条假设?
• 模型(学习器)应该有偏好
在这里插入图片描述新西瓜根据假设A应该是好瓜,但是根据假设B就不是好瓜,选择不同的假设会导致模型预测结果不同。在历史样本中可能存在多条假设,但是在推理到新样本的时候可能会存在矛盾,所以在得到版本空间后要进行取舍,只保留一条假设。至于保留哪一条就是归纳偏好的问题。

示例:回归问题的假设空间
已有训练集6个样例(x,y),要学得与其一致的模型,相当于找到一条穿过所有点的曲线。 模型A与模型B孰优孰劣?
学习算法必有偏好
归纳偏好原则一:奥卡姆剃刀(简单优先)
在这里插入图片描述通过这六个点可以画无数条曲线,且每一条曲线都有对应的方程式,只是复杂程度不同。我们可以根据奥卡姆剃刀原则简单优先,选择曲线A

2模型性能与评估

2.1经验误差与过拟合

在这里插入图片描述可以明显看出第4个样本预测错误
在这里插入图片描述
误差:模型输出与样本真实值之间的差异,衡量误差可以通过下面四个指标
• 错误率:分类错误样本数占总样本数比例
• 精度:1-错误率
• 训练误差:模型在训练集上的误差
• 泛化误差:模型在新样本上的误差

• 目标:得到泛化误差小的模型/学习器
• 实际:新样本未知 以经验误差代表泛化误差
• 模型从训练样本中学得适用于所有潜在样本的“普遍规律”


• 过拟合:用力过猛
• 欠拟合:用力不足
在这里插入图片描述

2.2评估方法

因为我们不知道新样本的标签,所以通常要把训练集进行划分,一部分用于模型的训练,另一部分进行预测(因为我们知道训练集的标签)
训练集与测试集
• 目标:对于模型/学习器的泛化 误差进行评估
• 专家样本:训练集+测试集
• 训练集:训练误差
• 测试集:测试误差
在这里插入图片描述因为我们测试的时候训练集并没有参与训练,所以测试集对于模型就是新样本,所以可以用测试集的样本误差代替泛化样本误差。要求样本是独立同分布的
计算测试样本误差的方法
• 留出法
• 交叉验证
• 自助法


首先是留出法
• 训练集+测试集:互斥互补
• 训练集训练模型,测试集测试模型
• 合理划分、保持比例
• 单次留出与多次留出
• 多次留出法:如对专家样本随机进行100次训练集/测试集划分, 评估结果取平均

多个类别进行划分的时要注意合理划分:比如分层抽样,男性20%,女性20%


交叉验证法
• K折交叉验证:将专家样本等份划分为K个数据集,轮流用K-1个用于训练,1个用于测试
• P次K折交叉验证
下面看10折交叉验证流程图
在这里插入图片描述前面两种方式训练集都是少于专家样本数量的,可以让训练集和专家样本数量相同,充分利用专家样本,可以用自助法


自助法
留出法与交叉验证法的训练集数据少于样本数据
• 给定m个样本的数据集D,从D中有放回随机取m次数据,形成训练集D’
• 用D中不包含D’的样本作为测试集
• D中某个样本不被抽到的概率: 在这里插入图片描述

• 测试集数据量:
在这里插入图片描述

• 缺点:改变了初始数据集的分布
比如原始样本中样本a只出现了一次,用自助法a可能出现3次4次甚至更多,那么a这个样本对应的规则对模型的权重可能会上升。

2.3性能度量

模型大体上可以分为分类和回归两类
回归任务的评价标准:均方误差
在这里插入图片描述分类样品的评估
错误率:分类错误样本数占总样本数比例
在这里插入图片描述

精度:1-错误率,分类正确样本数占总样本数比例
在这里插入图片描述
但是我们对应实际的应用,只用错误率和精度进行评价是不太准确的
这要考虑到犯错的代价
犯错的代价:
• 2004年12月26日印尼海啸与1999年“弗洛伊德” 飓风, 真正率、假正率,印尼海啸的灾难预报与保险公司。

当时海啸已经被预测到了,但是由于种种原因没有发布消息,造成了非常严重的后果(把1预测成0)。还有就是99年的飓风预测发生但是没有发生,很多人收到预警后进行转移造成交通的拥挤(把0预测成1)虽然同样都预测错误但是显然后一种错误造成的损失较低

查准率和查全率
• 查准率/准确率(precision): P = TP/(TP+FP)
• 查全率/召回率/灵敏度(recall):R = TP/(TP+FN)
• “1”代表正例,“0”代表反例

混淆矩阵
在这里插入图片描述TP正确预测正例,FN错误预测为反例,FP错误预测为正例,TN正确预测为反例。
在这里插入图片描述
假设男性为正例

在这里插入图片描述对于海啸,我们希望把所有可能发生的都预测出来,也就查全率(召回率);而做用户推荐可能更关心查准率,推送用户喜欢的
查准率/准确率(precision): P = TP/(TP+FP)

from sklearn.metrics import precision_score

y_true = [1, 0, 1, 1, 0]
y_pred = [1, 0, 1, 0, 0]
precision_score(y_true, y_pred, average=None) # average=None,则返回每个类的分数

F1系数
• 综合查准率与查全率:
在这里插入图片描述

• 更一般的形式:
在这里插入图片描述

• 其中 β \beta β 为正数,度量了查全率对查准率的相对重要性
β = 1 \beta=1 β=1标准的F1系数
β > 1 \beta>1 β>1 查全率有更大影响
β < 1 \beta<1 β<1查准率有更大影响

F1系数越大模型性能越好

多次训练/测试时的F1系数
• 先分后总:先分别计算各混淆矩阵的查准率和查全率,再以均值汇总
在这里插入图片描述

• 先总后分:先将各混淆矩阵的对应元素(TP、FP、TN、FN)进行汇总平均,再求P、R、F1值
在这里插入图片描述

from sklearn.model_selection import cross_val_score
from sklearn.datasets import load_iris
from sklearn.svm import SVC
iris = load_iris() 
clf = SVC(kernel='linear', C=1)
scores = cross_val_score(clf, iris.data, iris.target, cv=5)

2.4偏差与方差

测试误差能代表泛化误差吗?
• 详见周志华:《机器学习》2.4比较检验 泛化错误率的构成:偏差+方差+噪声
• 偏差:模型输出与真实值的偏离程度,刻画了算法的拟合能力
• 方差:同样大小的训练集的变动导致的学习性能的变化,即数据扰动造成的影响
• 噪声:当前学习器所能达到的泛化误差的下限
• 偏差大:拟合不足/欠拟合;方差大:过拟合
在这里插入图片描述

• 详见周志华:《机器学习》2.5偏差与方差

3回归分析

3.1线性回归的基本形式

线性模型试图学得一个通过属性的线性组合来进行预测(目标属性)的函数
在这里插入图片描述

在这里插入图片描述
线性模型的优点
• 形式简单,易于建模
• 蕴含机器学习的基本思想
• 是其他非线性模型的基础
• 权重体现出各属性重要性,可解释性强
在这里插入图片描述在这里插入图片描述目标函数(单变量)
均方误差最小化(最小二乘法)
• 找到一条直线,使所有样本到直 线上的欧式距离之和最小
在这里插入图片描述令目标函数对w 和b 的偏导为零可解得:
在这里插入图片描述举一个简单的例子有一组数据(1,6),(3,5),(5,7),(6,12),要找出一条与这几个点最为匹配的直线 : y = A + Bx
有如下方程:
6 = A + B
5 = A + 3B
7 = A + 5B
12 = A + 6B
很明显上面方程是超定线性方程组,要使左边和右边尽可能相等;采用最小二乘法:
L(A,B)= [ 6 − ( A + B ) ] 2 + [ 5 − ( A + 3 B ) ] 2 + [ 7 − ( A + 5 B ) ] 2 + [ 12 − ( A + 6 B ) ] 2 [6-(A + B)]^2 + [5-(A + 3B)]^2 + [7-(A + 5B)]^2 +[12-(A + 6B)]^2 [6(A+B)]2+[5(A+3B)]2+[7(A+5B)]2+[12(A+6B)]2使得L的值最小:这里L是关于A,B的函数;那么我们可以利用对A,B求偏导,进而求出A,B的值使得L最小
d ( L ) d ( A ) = 8 A − 60 + 30 B = 0 \frac{d(L)}{d(A)}=8A-60+30B=0 d(A)d(L)=8A60+30B=0
d ( L ) d ( B ) = 71 B + 15 A − 128 = 0 \frac{d(L)}{d(B)}=71B+15A-128=0 d(B)d(L)=71B+15A128=0
A=-12.98 B= -5.46
所以
Y=-5.56X-12.98

目标函数(多变量)
在这里插入图片描述

3.2线性回归模型的python实现

sklearn.linear_model中的LinearRegression可实现线性回归 LinearRegression 的构造方法:

LinearRegression( fit_intercept=True, #默认值为 True,表示 计算随机变量,False 表示不计算随机变量 
normalize=False, #默认值为 False,表示在回归前是否对回归因子X进行归一化True 表示是, 
copy_X=True )

LinearRegression 的常用方法有:
• decision_function(X) #返回 X 的预测值 y
• fit(X,y[,n_jobs]) #拟合模型
• get_params([deep]) #获取 LinearRegression 构造方法的参数信息
• predict(X) #求预测值 #同 decision_function

from sklearn.linear_model import LinearRegression
clf = LinearRegression()
clf.fit([[0, 0], [1, 1], [2, 2]], [0, 1, 2])  # 模型训练
print(clf.predict([[3, 3]]))          # 预测
"""
[3.]
"""
clf.coef_     # 系数    array([0.5, 0.5])
clf.intercept_    # 截距项  1.1102230246251565e-16
"""
y=0.5*x1+0.5*x2+1.1102230246251565e-16
"""

3.3波士顿房价的预测

波士顿房价数据集(Boston House Price Dataset)
数据说明
• 波士顿房价数据集(Boston House Price Dataset)包含对房价的预测, 以千美元计,给定的条件是房屋及其相邻房屋的详细信息。
• 该数据集是一个回归问题。每个类的观察值数量是均等的,共有 506 个观 察,13 个输入变量和1个输出变量。
• sklearn库的datasets包含该数据集( load_boston)
导入数据

from sklearn.datasets import load_boston

boston = load_boston()
boston.feature_names
"""
array(['CRIM', 'ZN', 'INDUS', 'CHAS', 'NOX', 'RM', 'AGE', 'DIS', 'RAD',
       'TAX', 'PTRATIO', 'B', 'LSTAT'], dtype='<U7')
"""

变量名说明
• CRIM:城镇人均犯罪率。
• ZN:住宅用地超过 25000 sq.ft. 的比例。
• INDUS:城镇非零售商用土地的比例。
• CHAS:查理斯河空变量(如果边界是河流,则为1;否则为0)。
• NOX:一氧化氮浓度。
• RM:住宅平均房间数。
• AGE:1940 年之前建成的自用房屋比例。
• DIS:到波士顿五个中心区域的加权距离。
• RAD:辐射性公路的接近指数。
• TAX:每 10000 美元的全值财产税率。
• PTRATIO:城镇师生比例。
• B:1000(Bk-0.63)^ 2,其中 Bk 指代城镇中黑人的比例。

波士顿房价预测的部分数据
在这里插入图片描述直觉告诉我们:上表的第6列(住宅平均房间数)与最终房价一般是成正比的, 具有某种线性关系。我们利用线性回归来验证想法。 同时,作为一个二维的例子,可以在平面上绘出图形,进一步观察图形。

from sklearn.datasets import load_boston
from sklearn.linear_model import LinearRegression
import matplotlib.pyplot as plt

boston = load_boston()
clf = LinearRegression()
clf.fit(boston.data[:, 5:6], boston.target)
pre = clf.predict(boston.data[:, 5:6])
fe = plt.figure()
plt.scatter(boston.data[:, 5:6], boston.target)
plt.plot(boston.data[:, 5:6], pre,'r')
plt.show()
plt.savefig('1.jpg')

在这里插入图片描述

3.4逻辑回归

• 分类和回归二者不存在不可逾越的鸿沟。就波士顿房价预测作为例子:如果将 房价按高低分为“高级”、“中级”和“普通”三个档次,那么这个预测问题 也属于分类问题。
• 准确地说,逻辑回归(Logistic Regression)是对数几率回归,属于广义线性 模型(GLM),它的因变量一般只有0或1.
• 需要明确一件事情:线性回归并没有对数据的分布进行任何假设,而逻辑回归 隐含了一个基本假设 :每个样本均独立服从于伯努利分布(0-1分布)。
• 伯努利分布属于指数分布族,这个大家庭还包括:高斯(正态)分布、多项式 分布、泊松分布、伽马分布、Dirichlet分布等。
对数几率回归/逻辑回归(logistic regression)
• 对数线性回归
在这里插入图片描述

• 将线性回归模型的预测值和实际值关联起来
在这里插入图片描述y^=lny是联系函数,可以把线性函数变成非线性,也可以把非线性变成线性

• 更一般的形式:广义线性模型
• g(x)称为联系函数 y = g − 1 ( w T x + b ) y=g^{-1}(w^Tx+b) y=g1(wTx+b)
• 二分类问题的理想联系函数:单位阶跃函数
在这里插入图片描述
但是单位阶跃函数是非连续的,进行数学推导时可能不太方便,可以选择对数几率函数替代

在这里插入图片描述联系函数的目的是将线性模型推广到非线性模型上去
阶跃函数的代替函数:Sigmoid函数
y = 1 1 + e − z y=\frac{1}{1+e^{-z}} y=1+ez1
带入线性模型可得
y = 1 1 + e − ( w T x + b ) y=\frac{1}{1+e^{-(w^Tx+b)}} y=1+e(wTx+b)1

l n ( y 1 − y ) = w T x + b ln(\frac{y}{1-y})=w^Tx+b ln(1yy)=wTx+b
y 1 − y \frac{y}{1-y} 1yy称为几率,表示样本取正例的可能性比例; l n ( y 1 − y ) ln(\frac{y}{1-y}) ln(1yy)称为对数几率
在这里插入图片描述

目标:寻找合适的w,b ,使函数输出逼近真实类别 y = 1 1 + e − ( w T x + b ) y=\frac{1}{1+e^{-(w^Tx+b)}} y=1+e(wTx+b)1
在这里插入图片描述目标函数求解方法:梯度下降法、牛顿法
上面只介绍了逻辑回归解决二分类问题,但实际上逻辑回归也可以解决多分类问题,多分类问题可以拆解为多个二分类。
比如0,1,2可以分为0和非0,非0可以分为1,2
感兴趣的可以自己搜索了解

3.5研究生入学预测的python实现

通过分析不同的因素对研究生录取的影响来预测一个人是否会被录取
数据的格式如下:
在这里插入图片描述• admit :表示是否被录取(目标变量)
• gre:标准入学考试成绩,预测变量
• gpa:学业平均绩点,预测变量
• rank:母校排名(预测变量)
• ——LogisticRegression.csv文件
链接:https://pan.baidu.com/s/14ESfN7-zIU4NDnauNEUuZQ
提取码:6txe

sklearn. model_selection随机划分训练集和测试集
• train_test_split是交叉验证中常用的函数,功能是从样本中随机的按比例选取 train data和testdata,形式为:

X_train,X_test, y_train, y_test =cross_validation.train_test_split(train_data,train_target,test_size=0.4, random_state=0)

train_test_split参数解释:
• train_data:所要划分的样本特征集
• train_target:所要划分的样本结果
• test_size:样本占比,如果是整数的话就是样本的数量 • random_state:是随机数的种子。
• 随机数种子:其实就是该组随机数的编号,在需要重复试验的时候,保证得到 一组一样的随机数。比如你每次都填1,其他参数一样的情况下你得到的随机 数组是一样的。但填0或不填,每次都会不一样。
• 随机数的产生取决于种子,随机数和种子之间的关系遵从以下两个规则:
• 种子不同,产生不同的随机数;种子相同,即使实例不同也产生相同的随机数。

from sklearn.linear_model import LogisticRegression
from sklearn.model_selection import train_test_split
from sklearn.metrics import classification_report
import pandas as pd
import numpy as np

df = pd.read_csv(r'D:\编程资料\Python机器学习实战人邮版 '
                 r'(6)\Python机器学习实战-数据&代码\3回归分析\LogisticRegression.csv')
clf = LogisticRegression()
X_train,X_test,y_train,y_test=train_test_split(df.iloc[:, 1:], df.iloc[:, 0],test_size=0.2)
clf.fit(X_train,y_train)
pre=clf.predict(X_test)
res=classification_report(y_test,pre)
print(res)
"""
              precision    recall  f1-score   support

           0       0.74      0.95      0.83        57
           1       0.57      0.17      0.27        23

    accuracy                           0.73        80
   macro avg       0.66      0.56      0.55        80
weighted avg       0.69      0.72      0.67        80
"""

4.决策树

4.1决策树的概念

1现想象一个女孩的母亲要给这个女孩介绍男朋友,于是有了下面的对话:
女儿:多大年纪了?
母亲:26
女儿:长的帅不帅?
母亲:挺帅的
女儿:收入高不?
母亲:不算很高,中等情况。
女儿:是公务员不?
母亲:是,在税务局上班呢。
女儿:那好,我去见见。

在这里插入图片描述在这里插入图片描述

2天气情况对是否打高尔夫球的影响
在这里插入图片描述挖掘天气,温度,起风,湿度这四个特征和标签是否打球的关系
在这里插入图片描述决策数就是一系列的if else 组成的规律集合,现在还有一个疑问,那就是为什么第一个根节点选择天气,这里要用到信息论的一些知识

4.2决策树拆分属性选择

属性选择的先后顺序
• 熵值
• 信息增益
• 信息增益率

问题:对于给定样本集,如何判断应该在哪个属性上进行拆分
• 每次拆分都存在多种可能,哪个才是较好的选择呢?
• 理想情况:在拆分过程中,当叶节点只拥有单一类别时,将不必继续拆分。
• 目标是寻找较小的树,希望递归过程尽早停止
• 较小的树意味着什么?
• 当前最好的拆分属性产生的拆分中目标类的分布应该尽可能地单一(单纯),多数类占优。

信息论中的熵:是信息的度量单位,是一种 对属性“不确定性的度量”。 属性的不确定性越大,把它搞清楚所需要的信息量也就越大,熵也就越大。对于一个确定的事件熵为0

首先介绍通过信息增益选择特征
信息量的计算公式
在这里插入图片描述越小概率的事情发生了产生的信息量越大

信息量度量的是一个具体事件发生了所带来的信息,而熵则是在结果出来之前对可能产生的信息量的期望——考虑该随机变量的所有可能取值,即所有可能发生事件所带来的信息量的期望。即
在这里插入图片描述
打球数据集的熵为:
在这里插入图片描述条件熵
定义为X给定条件下,Y的条件概率分布的熵对X的数学期望
在这里插入图片描述天气属性的条件熵
• 晴:打球记录2条,不打球记录为3条
在这里插入图片描述
• 阴:打球记录4条,不打球记录0条
在这里插入图片描述• 雨:打球记录3条,不打球记录2条
在这里插入图片描述

信息增益恰好是:信息熵-条件熵。
原本明天下雨的信息熵是2,条件熵是0.01(因为如果知道明天是阴天,那么下雨的概率很大,信息量少),这样相减后为1.99。在获得阴天这个信息后,下雨信息不确定性减少了1.99,不确定减少了很多,所以信息增益大。也就是说,阴天这个信息对明天下午这一推断来说非常重要。

天气属性的信息增益
在这里插入图片描述起风属性的信息增益: 0.048
所以选择天气作为第一个拆分的特征(信息增益最大的选为根节点)

4.3四种决策树算法

ID3算法的详细实现步骤如下:
在这里插入图片描述
ID3算法是决策树系列中的经典算法之一,它包含了决策树作为机器学习算法的主要思想,缺点是:

• 由于ID3决策树算法采用信息增益作为选择拆分属性的标准, 会偏向于选择取值较多的,即所谓高度分支属性, 而这类属性并不一定是最优的属性。
极端例子比如把日期作为拆分项,日期只需要拆分一次就会停止生长,每个分支都只有一个样本,如果把日期看做一个属性,它的信息增益会是0.94把熵直接降低为0,所以ID3倾向于选择属性取值多的特征

• ID3算法只能处理离散属性,对于连续型的属性, 在分类前需要对其进行离散化。

常用的决策树算法见下表:
在这里插入图片描述• 基尼(Gini,总体发散性) CART
• 熵(entropy,信息量)
• 信息增益(Gain) ID3
• 信息增益率 C4.5,C5.0

4.4泰坦尼克号生还者预测

这个例子是经典的Kaggle101问题——泰坦尼克生还预测,部分数据如下:
在这里插入图片描述为了说明的方便,数据集有许多属性被删除了。通过观察可知:列Survived是指是否存 活,是类别标签,属于预测目标;列Sex的取值是非数值型的。我们在进行数据预处理 时应该合理应用Pandas的功能,让数据能够被模型接受。
代码:

import pandas as pd
import numpy as np
from sklearn.tree import DecisionTreeClassifier
from sklearn.metrics import classification_report

df = pd.read_csv(r'D:\编程资料\Python机器学习实战人邮版 (6)\Python机器学习实战-数据&代码\4决策树\titanic_data.csv')
df.head(15)
"""
    Survived  PassengerId  Pclass     Sex   Age
0          0            1       3    male  22.0
1          1            2       1  female  38.0
2          1            3       3  female  26.0
3          1            4       1  female  35.0
4          0            5       3    male  35.0
5          0            6       3    male   NaN
Age存在缺失值
"""
df['Age'].fillna(df.Age.mean(), inplace=True)
df.drop(['PassengerId'], axis=1, inplace=True)
df.loc[df['Sex']=='male','Sex'] = 1
df.loc[df['Sex']=='female','Sex'] = 0

clf = DecisionTreeClassifier(max_depth=5,random_state=8)
clf.fit(df.iloc[:,1:],df['Survived'])
pre = clf.predict(df.iloc[:,1:])
pre == df['Survived']
res=classification_report(df['Survived'],pre)
print(res)

关于pandas和numpy的使用方法可以参考我的另一篇文章传送门
画出这颗决策树

from sklearn.tree import export_graphviz   # 
nn=export_graphviz(clf,feature_names=['Pclass', 'Sex', 'Age'],class_names='Survived')
graphviz.Source(nn)

如要将决策树可视化,还需要安装Graphviz下载(跨平台的、基于命令行的绘图工具),并将安装路径下的bin目录添加至系统变量如果还报错failed to execute ‘dot’, make sure the Graphviz executables are on your syst,重启电脑,生成的效果图如下:
在这里插入图片描述

优点:
1易于理解
2只需要很少的准备数据
3能够同时处理连续和离散数据
4能够处理多输出问题
5采用白盒模型
6使用统计测试可以验证模型
7即使假设有点错误也可以表现很好

缺点:
1对大量样本生成复杂的树
2可以创建复杂树但不能很好的推广
3如果一些类占主导地位创建的树就有偏差

5.聚类

5.1聚类分析概述

聚类分析与之前的几种算法不同,是无监督的学习

分类与聚类
分类:学习/训练过程 有监督,训练样本有明确标签
聚类:学习/训练过程 无监督,样本无明确标签

分类模型
在这里插入图片描述

在这里插入图片描述聚类模型
在这里插入图片描述

在这里插入图片描述
聚类的概念
• 聚类是把各不相同的个体分割为有更多相似性子集合的工作。
• 聚类生成的子集合称为簇
聚类的要求
• 生成的簇内部的任意两个对象之间具有较高的相似度
• 属于不同簇的两个对象间具有较高的相异度 聚类与分类的区别在于聚类不依赖于预先定义的类,没有预定义的类和样 本——聚类是一种无监督的数据挖掘任务
在这里插入图片描述下面看一个例子
有16张牌如何将他们分组
在这里插入图片描述你可能将花色相同的分为一组,也可能按照数字的不同分组
分成四组
每组里花色相同 ,组与组之间花色相异
在这里插入图片描述分成两组
每组里数字相同 ,组与组之间数字相异

在这里插入图片描述应用领域

客户价值分析 文本分类 基因识别 空间数据处理 卫星图片分析 数据分析、统计学、机器学习、空间数据库技术、生物学和市场学也推动了聚类分析研究的进展

常用的聚类算法

1.K-均值聚类(K-Means)
2.K-中心点聚类(K-Medoids)
3.密度聚类(Densit-based SpatialClustering of Application with Noise, DBSCAN)
4.层次聚类(系谱聚类 Hierarchical Clustering, HC)
5.期望最大化聚类(Expectation Maximization, EM)
需要说明的是,这些算法本身无所谓优劣,而最终运用于数据的效果却存在 好坏差异,这在很大程度上取决于数据使用者对于算法的选择是否得当。

5.2相似性度量

相似度如何衡量:距离

变量大致可以分为两类:
1.定量变量,也就是通常所说的连续变量。
2.定性变量,这些量并非真有数量上的变化,而只有性质上的差异。 这些量可以分为两种,一种是有序变量,另一种是名义变量。

连续型变量距离
       典型的距离定义
在这里插入图片描述
定性的变量用相似系数衡量

两个仅包含二元属性的对象之间的相似性度量也称相似系数 两个对象的比较有四种情况:f00 = x取0并且y取0的属性个数;f01 =x取0并且y取1的属性个数;f10 = x取 1并且y取0的属性个数;f11 = x取1并且y取1的属性个数
1.简单匹配系数:SMC =值匹配的属性个数 / 属性个数 = (f11 +f00) / (f01 + f10 + f11 + f00)
2.Jaccard(杰卡德) 系数 :J = 匹配的个数 / 不涉及0-0匹配的属性个数 = (f11) / (f01 + f10 +f11)

两个二元向量:
x=(1,0,0,0,0,0,0,0,0,0)
y=(0,0,0,0,0,0,1,0,0,1)
f00 =7 (x取0并且y取0的属性个数)
f01 =2 (x取0并且y取1的属性个数)
f10 =1 (x取1并且y取0的属性个数)
f11 =0 (x取1并且y取1的属性个数)
简单匹配系数:SMC= (f11 +f00) / (f01 + f10 + f11 + f00) =(0+7)/(2+1+0+7)=0.7
Jaccard系数:J = (f11) / (f01 + f10 +f11) =0/2+1+0 =0

还有余弦相似系数(如计算两文档间相似系数):
cos( x1, x2 ) = (x1• x2) / ||x1|| ||x2|| , 其中•表示向量的点积(内积),||x||表示向量的范数。

例向量:x1 = (3,2,0,5,0,0,0,2,0,0)
x2 = (1,0,0,0,0,0,0,1,0,2)
则余弦相似系数为:cos( x1, x2 ) = 5/(6.481*2.245)=0.3436

例:两篇文档的相似性度量
余弦相似系数(如计算两文档间相似系数):
在这里插入图片描述

5.3K-means

看下面这个例子
例:某餐饮公司欲通过客户消费记录寻找VIP客户,进行精准营销。
在这里插入图片描述
算法步骤

  1. 随机选取K个样本作为类中心;
  2. 计算各样本与各类中心的距离;
  3. 将各样本归于最近的类中心点;
  4. 求各类的样本的均值,作为新的类中心;
  5. 判定:若类中心不再发生变动或达到迭代次数,算法结束,否则回到第2步。

在这里插入图片描述回到刚才的问题,寻找VIP客户
选定样本a和b为初始类中心,中心值分别为1、2
在这里插入图片描述

5.4利用K-means算法对鸢尾花进行分类

用代码实现就是

from sklearn.datasets import load_iris
import numpy as np


iris=load_iris()
X= iris.data
y= iris.target

k=3  # 初始类中心的个数
n=len(X)
# 创建存储中间结果的表单
data=np.zeros([n,k+1])
# 类中心
center=X[:k,:]
center_new=np.zeros([k,X.shape[1]])
while True:
    for i in range(n):
        for j in range(k):
            data[i,j]=np.sqrt(sum((X[i,:]-center[j,:])**2))
        data[i,k]=np.argmin(data[i,:k])
    for i in range(k):
        index=data[:,k]==i
        center_new[i,:]=X[index,:].mean(axis=0)
    if np.all(center_new==center):
        break
    center = center_new

print(data)

5.5聚类结果的性能度量

性能度量:簇内相似度与簇间相似度
外部指标:将聚类结果与实际结果进行比较
内部指标:不依赖于任何参考模型,直接考察聚类结果

外部指标的使用情况较少,一般适用于在知道标签的情况下,不使用标签进行训练。
在这里插入图片描述
在这里插入图片描述集合DS包含了在C中属于不同簇但是在 C ∗ C^* C中属于相同簇
集合DD包含了在C中属于不同簇在 C ∗ C^* C中也不属于相同簇
a=1,b=2,c=1,d=2
注:参考模型就是实际的类别,a是SS中的样本对 数
a+b+c+d= m(m-1)/ 2

外部指标的三种形式
Jaccard系数(Jaccard Coefficent,JC)
在这里插入图片描述

FM指数(Fowlkes as Mallows Index,FMI)
在这里插入图片描述

Rand指数(Rand Index,RI)
在这里插入图片描述

上述指标结果均在[0,1]区间,值越大越好
看下面这个例子,找出较好的聚类模型
在这里插入图片描述我们比较一下1和3
在这里插入图片描述显然聚类结果3比聚类结果1好。
下面我们看一下没有外部指标(标签)的情况下如何评判聚类结果的好坏。
内部指标(internal index)
Compactness(紧密性)(CP):各样本到聚类中心的平均距离
在这里插入图片描述 C P i CP_i CPi表示第i类,样本用 x i x_i xi表示,类中心用 u i u_i ui表示

Separation(间隔性)(SP):各类中心间的平均距离

在这里插入图片描述CP越小越好,SP越大越好。但是不能单一的追求最大最小,比如10个样本聚成10类,那么CP=0,但是没有意义

出来CP,SP还有一些其他的指标

DB指数(Davies-Bouldin Index,DBI)
在这里插入图片描述

Dunn指数(Dunn Index,DI)

在这里插入图片描述
在这里插入图片描述
DBI值越小约好,DI值越大越好

比如
在这里插入图片描述在这里插入图片描述
在这里插入图片描述

K-means对球状簇比较适合,非球型的簇不太适合
在这里插入图片描述
优点: 1. 算法简单,易于理解
2. 对球形簇样本聚类效果好
3. 二分k均值等变种算法运行良好,不受初始化问题的影响。

缺点: 1. 不能处理非球形簇、不同尺寸和不同密度的簇
4. 对离群点、噪声敏感

聚类算法出来K-means还有K-Medoids,层次聚类(系谱聚类 Hierarchical Clustering, HC)

5.6调用sklearn实现聚类分析

在这里插入图片描述官网
代码

from sklearn.cluster import KMeans
from sklearn.datasets import load_iris

data=load_iris().data

model=KMeans(n_clusters=3).fit(data)

model.labels_   # 预测的标签

评估方法有很多
在这里插入图片描述

6. 支持向量机

6.1间隔与支持向量

1.相比于传统的机器学习算法,它的性能比较优秀
2.数学理论扎实,可解释性强

鸢尾花数据集setosa, versicolor两类样本数据
在这里插入图片描述存不存在一条线将上面的两类样本分开,显然存在不只一条这样的直线。
哪条线(超平面)是区分两类样本最优方案?
最优超平面(直线):对训练样本局部扰动的“容忍性”最好,即最具鲁棒性。
在这里插入图片描述比如C线上有一个样本,如果样本轻微变化可能就到了线的另一边,说明C鲁棒性不好。
如何寻找最优超平面呢?
在这里插入图片描述

在这里插入图片描述

当前是二维平面有两个自变量 x 1 , x 2 x_1,x_2 x1,x2,1表示正例,-1表示反例
所有的橙色样本带入方程全部>=1,而所有的绿色样本带入方程全部<=-1,需要找到这样的一个超平面
在这里插入图片描述也就是确定w和b的取值使上图的两条虚线直接的距离最大(r最大)
在这里插入图片描述
两条虚线上的样本就是支持向量
向量:因为一个样本是有多个特征构成的,一个样本就是一个向量
支持:r的取值是由虚线上的样本决定的(前提是找到合适的w和b使得这两条虚线刚好可以穿过边界样本)

在这里插入图片描述图中的红框是由
在这里插入图片描述所以求最优超平面就转化成,下面两个数学式的求解
在这里插入图片描述s.t:限制条件
这个数学式怎么求,下面会进行介绍

6.2对偶问题

首先看一个问题
在这里插入图片描述可能很多人都会用下面这种求解方式
在这里插入图片描述接下来介绍一下有关凸二次优化的问题
凸函数:开口朝一个方向(向上或向下) 数学关系,对任意自变量都有:
在这里插入图片描述几种常见的凸函数
在这里插入图片描述其实对于这种函数可以使用拉格朗日法求解

在这里插入图片描述下面回到刚才的求r最大的问题
在这里插入图片描述在这里插入图片描述
求解这个对偶问题,要用到SMO算法(求出最大值时的 α \alpha α取值)

在这里插入图片描述故求解 α \alpha α为核心步骤

对偶问题本身为组合优化问题,且随着训练样本数(m)增大,计算开销也会激增,所以需用更高效的算法。
在这里插入图片描述

6.3核函数

线性不可分(非凸数据集)问题
无法用一个超平面(线)对不同样本进行划分 思考:如何解决此类样本分类问题?

在这里插入图片描述

实际上在工程上更多的遇见的是这种线性不可分数据集
方法:将样本映射至高维空间
在这里插入图片描述数学定理:如果原始样本空间是有限维,即属性数有限,那么一定存在一个高维特征空间使样本线性可分
在这里插入图片描述从低维到高维映射
在这里插入图片描述在这里插入图片描述
在这里插入图片描述核函数就是我们构造的用来代替高维空间函数映射,接下来就是求出k( x 1 , x 2 x_1,x_2 x1x2
其实常见的核函数总共就几种,可以根据自己的需求直接选择合适的核函数
在这里插入图片描述

6.4软间隔与正则化

经过高维映射后的样本是否完全线性可分?

很难找到一个合适的核函数, 将原始样本映射到高位空间 后完全线性可分。
在这里插入图片描述比如上图中,超平面左侧由一个绿点,右侧由一个橙色。存在一定的误差

在目标函数中加入软间隔的值
目标函数变成:
在这里插入图片描述利用拉格朗日乘子法得到其对偶问题:
在这里插入图片描述最后再利用SMO算法即可求解出目标函数

6.5 支持向量机算法的python实现

from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.svm import LinearSVC

iris=load_iris()

X_train,X_test,y_train,y_test=train_test_split(iris.data,iris.target)

model=LinearSVC(max_iter=5000).fit(X_train,y_train)
pre = model.predict(X_test)

print(pre)
print(y_test)

参考资料
[1]通俗理解条件熵
[2]首都经济贸易大学 教师 卡伊粥
[3]sklearn官网
[4]支持向量机SMO(五)JerryLead
[5]周志华 《机器学习》

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

开始King

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值