《蜥蜴书》_讲义及源码解读_01


image-20211016230113562.png

机器学习

机器学习是通过编程让计算机从数据中进行学习的科学(和艺术)。

  • 更广义的概念:
    机器学习是让计算机具有学习的能力,无需进行明确编程。 —— 亚瑟·萨缪尔,1959
  • 工程性的概念:
    计算机程序利用经验 E 学习任务 T,性能是 P,如果针对任务 T 的性能 P 随着经验 E 不断增长,则称为机器学习。 —— 汤姆·米切尔,1997
传统方法和机器学习的对比:

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

机器学习善于:
  • 需要进行大量手工调整或需要拥有长串规则才能解决的问题:机器学习算法通常可以简化代码、提高性能
  • 问题复杂,传统方法难以解决:机器学习算法可以找到解决方案
  • 环境有波动:机器学习算法可以适应新数据
  • 洞察复杂问题和大量数据(数据挖掘)。
机器学习系统的类型

机器学习有多种类型,可以根据如下规则进行分类:

  • 是否在人类监督下进行训练(监督、非监督、半监督和强化学习)
  • 是否可以动态渐进学习(在线学习 、批量学习)
  • 是否在训练数据时只通过新旧数据对比,还是同时进行模式识别,以建立一个预测模型(基于实例学习 、基于模型学习)
  • 规则并不仅限于以上的,你可以将他们进行组合
监督学习

在监督学习中,用来训练算法的训练数据包含了答案,称为标签(label)

典型的监督学习任务是:分类(如垃圾邮件分类)
在这里插入图片描述

典型的监督学习任务是:预测目标数值(回归,如预测房屋价格)
在这里插入图片描述

回归算法也可以用来进行分类,反之亦然。逻辑回归就通常用于分类。

重要的监督学习算法:

  • K 近邻算法
  • 线性回归
  • 逻辑回归
  • 支持向量机(SVM
  • 决策树和随机森林
  • 神经网络
非监督学习

在非监督学习中,训练数据是没有加标签。系统在没有老师的条件下进行学习。
在这里插入图片描述

重要的非监督学习算法:

聚类

  • K 均值 (K-mean)
  • 层次聚类分析(Hierarchical Cluster Analysis,HCA)
  • DBSCAN
异常检测和新颖性检测

在这里插入图片描述

  • 单类SVM
  • 孤立森林

可视化和降维:
在这里插入图片描述

  • 主成分分析(Principal Component Analysis,PCA)
  • 核主成分分析局部线性嵌入(Locally-Linear Embedding,LLE)
  • t-分布邻域嵌入算法(t-distributed Stochastic Neighbor Embedding,t-SNE)

关联性规则学习:

  • Apriori 算法
  • Eclat 算法
半监督学习

处理部分带标签的训练数据,通常是大量不带标签数据加上小部分带标签数据。

多数半监督学习算法是非监督和监督算法的结合。例如,深度信念网络(deep belief networks)是基于被称为互相叠加的受限玻尔兹曼机(restricted Boltzmann machines,RBM)的非监督组件。RBM是先用非监督方法进行训练,再用监督学习方法对整个系统进行微调。

强化学习

强化学习非常不同。学习系统在这里被称为智能体(Agent),可以对环境进行观察、选择和执行动作,并获得奖励作为回报(负奖励是惩罚)。然后它必须自己学习哪个是最佳方法(称为策略,Policy),以得到长久的最大奖励。策略决定了智能体在给定情况下应该采取的行动。
在这里插入图片描述

批量和在线学习
批量学习(离线学习)

通常会占用大量时间和计算资源训练所有可用数据,然后部署在生产环境且停止学习,它只是使用已经学到的策略。

在线学习(增量学习)

循序地给系统提供训练数据,是用数据实例持续地进行训练,可以一次一个或一次几个实例(称为小批量)。每个学习步骤都很快且廉价。
在这里插入图片描述

基于实例和基于模型

基于实例 ,就是用记忆学习,通过使用相似度度量来比较新旧实例,然后推广到新的实例预测中。
在这里插入图片描述

基于模型,从样本集进行归纳的方法是建立这些样本的模型,然后使用这个模型进行预测。
在这里插入图片描述

机器学习的主要挑战

训练数据量不足

训练数据不具代表性 (不平衡)

低质量数据(异常值和噪声)

无关特征(特征工程的重要性)

欠拟合训练数据(模型太简单)

过拟合训练数据(模型过于复杂)

测试与验证

将数据分成两个集合:训练集和测试集。用训练集进行训练,用测试集进行测试。

通过模型对测试集的评估,你可以预估这个错误。从而评价模型对新样本的性能。

如果训练错误率低,但测试错误率高,意味着模型对训练数据过拟合

两个模型之间犹豫不决(比如一个线性模型和一个多项式模型):如何做决定呢?一种方法是两个都训练,然后比较在测试集上的效果。

源码解读:

https://github.com/ageron/handson-ml2

导入相关库,并运行环境需求检测:
import sys
assert sys.version_info >= (3, 5)
#断言python版本大于3.5,否则报错
import sklearn
assert sklearn.__version__ >= "0.20"
#断言sklearn版本大于0.20,否则报错
%matplotlib inline
import matplotlib as mpl
mpl.rc('axes', labelsize=14)
mpl.rc('xtick', labelsize=12)
mpl.rc('ytick', labelsize=12)
import matplotlib.pyplot as plt
import numpy as np
import pandas as pd
import sklearn.linear_model
下载数据
import urllib.request
import os
datapath = os.path.join("datasets", "lifesat", "")
DOWNLOAD_ROOT = "https://raw.githubusercontent.com/ageron/handson-ml2/master/"
os.makedirs(datapath, exist_ok=True)
for filename in ("oecd_bli_2015.csv", "gdp_per_capita.csv"):
    print("Downloading", filename)
    url = DOWNLOAD_ROOT + "datasets/lifesat/" + filename
    urllib.request.urlretrieve(url, datapath + filename)
# 下载csv文件到当前目录下的 datapath(datasets/liftsat)
# urllib.urlretrieve(url[, filename[, reporthook[, data]]]) 
加载并可视化数据
#pandas加载本地csv文件中数据,gdp数据估计特别,用到千分符、编码、分隔符,n/a数据等参数
oecd_bli = pd.read_csv(datapath + "oecd_bli_2015.csv", thousands=',')
gdp_per_capita = pd.read_csv(datapath + 
                "gdp_per_capita.csv",thousands=',',delimiter='\t',
                encoding='latin1', na_values="n/a")

# pd数据oecd_bli:(3292, 17)
# pd数据gdp_per_capita :(190,6)
# 准备数据,将2数据拼接合并按gdp排序后,得到country_stats(29,2)
country_stats = prepare_country_stats(oecd_bli, gdp_per_capita)

X = np.c_[country_stats["GDP per capita"]]  #准备训练数据
y = np.c_[country_stats["Life satisfaction"]] #准备标签数据

# 散点图可视化数据
country_stats.plot(kind='scatter', x="GDP per capita", y='Life satisfaction')
plt.show()

在这里插入图片描述

选择模型并训练
# 选择线性回归模型并训练、预测
import sklearn.linear_model
model = sklearn.linear_model.LinearRegression()
model.fit(X, y)
X_new = [[22587]]  
print(model.predict(X_new)) #输出预测值(满意度): [[ 5.96242338]]

# 选择K-近邻回归模型,K=3,训练,预测
import sklearn.neighbors
model1 = sklearn.neighbors.KNeighborsRegressor(n_neighbors=3)
model1.fit(X,y)
print(model1.predict(X_new)) #输出预测值(满意度): [[5.76666667]]

归结演绎推理是一种基于逻辑推理的方法,通过对已知事实和规则进行推理,得出结论。Python可以通过实现归结演绎推理来进行逻辑推理。 以下是一个简单的归结演绎推理的Python实现: 1. 定义规则和事实 ``` # 规则 rules = [ ('penguin', 'bird'), # 企鹅是鸟类 ('bird', 'animal'), # 鸟类是动物 ('lizard', 'animal'), # 蜥蜴是动物 ('bird', 'fly') # 鸟类可以飞 ] # 事实 facts = [ 'tweety is a penguin', # 特维是一只企鹅 'penguin is black and white' # 企鹅是黑白相间的 ] ``` 2. 定义归结演绎推理函数 ``` def resolve(a, b): """ 归结规则 """ for fact_a in a: for fact_b in b: if fact_a == ('not', fact_b) or fact_b == ('not', fact_a): # a和b中有相反的事实,无法归结 continue if fact_a == fact_b: # a和b中有相同的事实,无需归结 continue for i in range(len(fact_a)): if fact_a[i] != fact_b[i]: # 找到不同的部分,进行归结 new_fact = fact_a[:i] + fact_a[i+1:] + fact_b[:i] + fact_b[i+1:] if new_fact not in a and new_fact not in b: # 新的事实不在a和b中,加入a a.append(new_fact) return True return False def resolution(rules, facts): """ 归结演绎推理 """ while True: pairs = [(rules[i], rules[j]) for i in range(len(rules)) for j in range(i+1, len(rules))] new_rules = [] for pair in pairs: a, b = pair new_fact = resolve(a, b) if new_fact: # 归结出新的规则,加入新规则列表 new_rules.append(new_fact) if new_rules: # 有新规则,加入规则列表 rules += new_rules continue for fact in facts: if ('not', fact) in rules: # 有矛盾的事实,返回False return False # 执行完毕,返回True return True ``` 3. 测试归结演绎推理函数 ``` if resolution(rules, facts): print('Tweety can fly') else: print('Tweety cannot fly') ``` 输出结果为:`Tweety can fly`,即特维可以飞。因为根据规则,企鹅是鸟类,鸟类可以飞,所以特维可以飞。 这是一个简单的归结演绎推理的Python实现,可以根据实际需要进行扩展和优化。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值