《机器学习实战 学习笔记》(一):机器学习介绍

文章目录

  • 第1章 机器学习介绍

      1 什么是机器学习
      2 为什么要使用机器学习
      3 机器学习的种类
         3.1 监督式/无监督式学习
            3.1.1 常用有监督学习算法
            3.1.2 常用无监督式学习算法
            3.1.3 半监督式学习算法
         3.2 批量学习和在线学习
         3.3 基于实例和基于模型的学习
             小例子:使用sklearn训练并运行一个线性模型
      4 机器学习的主要挑战
         4.1 训练数据的数量不足
         4.2 训练数据不具代表性
         4.3 质量差的数据
         4.4 无关特征
         4.5 训练数据过拟合
         4.6 训练数据欠拟合
      5 测试与验证

1. 什么是机器学习

   机器学习是一门能够让编程计算机从数据中学习的计算机科学。
   通俗理解就是让计算机模拟人类通过学习获得经验,作出正确的判断。有句话叫吃一堑长一智,就是通过不断的实践学习总结出一些经验教训,以后遇到类似的情况能够作出正确的抉择。比如,班里来了一位同学,长头发,花裙子,高跟鞋,奥,是女生,我们作出这种判断是在一定经验基础之上的,是父母老师的教导使我们学习到了这种认知能力,所以我们也希望计算机也具备这种能力,让它通过学习分辨出男女,这就是机器学习。

2. 为什么要使用机器学习

   如果要写一个垃圾邮件识别器,传统方式要写一堆的if else规则去检测,非常难以维护。如果用机器学习算法,程序简短,容易维护,并且可能还更准确。为什么呢?因为机器学习算法是基于大量数据去学习的,这种量级的数据往往超出了人类的认知判断范围。所以,机器学习通过大量数据训练出来的模型,相对人类有限认知写出来的规则更全面更精确。
   此外,如果垃圾邮件发送者注意到含有比如 ’ 4U ’ 字样的邮件被拦截了,他可能会改成 ’ For U ',那么传统编程方式要修改过滤规则,如果垃圾发送者围绕着你的拦截器工作,那你将永无休止的更新过滤规则。
   相比之下,基于机器学习的垃圾邮件识别器可以自动注意到’For U’字样开始在用户标记的垃圾邮件中出现的异常频繁。当这部分学习数据升级后,算法可自动学习到并标记为垃圾邮件,不需要人为干预就能实现自动化。
   总结:前面也提到过,假如一个现实问题通过传统编码方式实现太过于复杂或者根本无法实现(数据量超大而且很难抽象成人类的语言),而通过机器学习算法学习海量数据,却能够挖掘出那些有价值的模式和规则。其实这个过程称为数据挖掘。所以,机器学习其实是大数据时代下数据挖掘的一种手段。

3. 机器学习的种类

3.1 监督式/无监督式学习

   监督还是无监督是根据训练数据有无标签(label)来说的,如果训练数据有label就是监督学习,没有就是无监督学习。
   啥是label? 比如上面说的垃圾邮件,训练数据为:邮件1,是垃圾邮件;邮件2,是普通邮件;邮件3,是普通邮件;邮件4,是垃圾邮件… 是否为垃圾邮件就是label,通常实际的训练数据,可能有label也可能没有,有的就叫监督学习,没有的就叫无监督。很好理解吧,再通俗一点,有人告诉你这是垃圾邮件就是有监督,没人告诉你,不知道是啥类型邮件就是无监督。
   总结:有监督和无监督区别就是训练数据是否经过标记。
  • 3.1.1 常用监督式学习算法

    • K - 近邻算法 (k-Nearest Neighbors)
    • 线性回归(Linear Regression)
    • 逻辑回归(Logistic Regression)
    • 支持向量机(SVM,Support Vector Machines)
    • 决策树和随机森林(Decision Trees and Random Forests)
    • 神经网络(Neural networks)
        
  • 3.1.2 常用无监督式学习算法

    • 聚类算法
      • k - 平均算法(k-Means)
      • 分层聚类分析(Hierarchical Cluster Analysis,HCA)
      • 最大期望算法(EM,Expectation Maximization)
    • 可视化和降维
      • 主成分分析(PCA)
      • 核主成分分析(Kernel PCA)
      • 局部线性嵌入(LLE)
      • t - 分布随机近临嵌入(t-SNE)
    • 关联规则学习
      • Apriori
      • Eclat
    • 异常检测
      • 孤立森林(Isolation Forest,工业界常用)
      • OneClassSVM
  • 3.1.3 半监督式学习

    • 有些算法可以处理部分标记的训练数据,称为半监督式学习。通常训练数据是大量的未标记数据和少量的标记数据。大多数半监督学习算法都是有监督和无监督的结合。例如:
    • DBN(深度信念网络,基于RBM)
    • RBM(受限玻尔兹曼机):无监督进行训练,有监督进行微调。
  

3.2 批量学习和在线学习

   机器学习系统分类的另一个标准:是否可以从传入的数据中进行增量学习。
   在线学习:需要接收持续的数据流同时对数据流的变化做出快速自主的反应。通常整个过程是离线完成的,因此这个名字很容易误解,我们可以视为增量学习。

3.3 基于实例和基于模型的学习

   机器学习系统分类的另一个标准:看它们如何泛化。
   基于实例可以理解为死记硬背,比如给你一份试卷你把试题答案全部背下来,考试时假如题目变换了方式,你就大不出来,通常可以理解为过拟合。
   基于模型的学习可以理解为通过学习实例,构造出泛化能力好的模型,而不是死记硬背。
   注意:3.2和3.3这种划分方式或者说法,个人感觉不太常见,就当扫扫盲吧,防止别人说的时候我们不知道。
3.3 .1 小例子:使用sklearn训练并运行一个线性模型
   目的:统计分析各国GDP和生活满意度life satisfaction的关系,并建立模型。
   数据来源:OECD(经济合作与发展组织)。从OECD上下载了2016年全球部分国家GDP和生活指数(包括生活满意度等指数)。GDP也可以去IMF上下载。
   工具:Anaconda3、python3、pandas、matplotlib、numpy、sklearn
   直接上代码吧,代码描述了整个分析建模的过程。(如果用其他IDE比如pycharm跑代码的话请自己过滤一下代码)
import numpy as np
import matplotlib.pyplot as plt
import pandas as pd
import sklearn as sk
# cell中显示图表
%matplotlib inline
%config ZMQInteractiveShell.ast_node_interactivity="all"

# 加载数据文件
gdp_path = '../Data/OECD/GDP_perHead_2016.csv'
life_index_path = '../Data/OECD/better_life_index_2016.csv'
# GDP数据
gdp = pd.read_csv(gdp_path)
life = pd.read_csv(life_index_path)

# 观察数据
gdp.shape
gdp.info()
# gdp.head(2)
life.shape
life.info()
# life.head(2)

# 数据清洗
# 筛选出生活满意度
life2 = life[(life['Indicator'] == 'Life satisfaction') & (life['Inequality'] == 'Total')]
# gdp['Country'].value_counts()
# life2['Country'].value_counts()
gdp.shape
life2.shape
# 合并数据
res = pd.merge(gdp,life2,how='right',on='Country')
res.shape
# 筛选列 --------- 国家,GDP,GDP取值,生活满意度,满意度取值
res = res[['Country','Transaction','Value_x','Indicator','Value_y']].sort_values('Value_x',ascending=False)
res.columns = ['Country','GDP','GDP_Value','Life satisfaction','Lf_Value']
res.head(5)

# 可视化分析
X = res['GDP_Value']
y = res['Lf_Value']
pd.Series.corr(X,y)
plt.scatter(X, y, color='green')
# 从图中可以看出,貌似随着人均GDP的增加,生活满意度在逐步提升。


from sklearn.linear_model import LinearRegression
from sklearn.neighbors import KNeighborsRegressor 

# 线性回归
l_model = LinearRegression()
l_model.fit(X,y)
# k 近邻回归算法
clf = KNeighborsRegressor(n_neighbors = 3)
clf.fit(X,y)

# 模型预测,输入美国的人均GDP
print('美国的人均GDP:',52525.720170,'\n')
print('线性回归 预测 生活满意度:',l_model.predict(52525.720170))
print('k-近邻 预测 生活满意度:',clf.predict(52525.720170))

   可视化分析图:

《机器学习实战 学习笔记》(一):机器学习介绍_第1张图片

   结果如下:

《机器学习实战 学习笔记》(一):机器学习介绍_第2张图片

   我们只是描述了一个非常简单的过程,如果要是模型预测效果更好,还要做很多工作,比如交叉验证、训练时加入更多的属性(比如就业率、健康、空气污染等)等等,后面我们会慢慢介绍。

4. 机器学习的主要挑战

   机器学习的初衷:选择一个算法,并对某些数据进行训练。 所以,可能出现的问题无非是坏算法,坏数据

4.1 训练数据的数量不足

   这个很好理解,假设给你一个红色苹果,你之前没见过绿色苹果,那么你不会认为绿色的是苹果。但如果给你100个不同的苹果(红的绿的黄的大的小的等等),你会学习到苹果有那么多种类和颜色,当给你一个绿色苹果时,你会立刻判断出它是一个绿苹果。所以,足够的训练数据会使得算法模型更全面更精确。

4.2 训练数据不具代表性

   如果训练数据不能体现整个数据集的分布,那么训练出来的模型泛化能力也很差。为什么会这样?采样偏差。

4.3 质量差的数据

   如果训练数据满是错误、异常值和噪声,那就呵呵了。

4.4 无关特征

   著名理论:垃圾进,垃圾出。一个成功的机器学习项目,关键部分是提取出一组的用来训练的特征集

4.5 训练数据过拟合

   假如你在国外旅游,被taxi宰了一刀,那么你可能会说,这个国家所有taxi都是强盗,这就是过拟合。机器也可能会线路同样的陷阱,也就是说训练集上验证效果很好,但泛化时很差。
   解决方式:
   ① 简化模型。选择简单模型 或 用正则化的方式约束一下模型
   ② 增加数据量
   ③ 减少训练数据中的噪声

4.6 训练数据欠拟合

   跟上面相反。

5. 测试与验证

   模型训练好以后,需要进行测试与验证 它的泛化能力怎么样。
   方式:将训练数据分为训练集和测试集。 训练集进行训练,测试集进行模型效果的测试。正常来说,都会定义一个误差即评估标准,通过这个标准来量化模型的效果好坏。
   通常使用80%的数据进行训练,保留20%的数据来做测试。为了保证泛化能力,80%的训练集又会再分成训练集和验证集。

你可能感兴趣的:(机器学习,机器学习介绍,机器学习实战)