文章目录
机器学习
机器学习是通过编程让计算机从数据中进行学习的科学(和艺术)。
- 更广义的概念:
机器学习是让计算机具有学习的能力,无需进行明确编程。 —— 亚瑟·萨缪尔,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]]