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]]

Logo

CSDN联合极客时间,共同打造面向开发者的精品内容学习社区,助力成长!

更多推荐