机器学习基础理解

{% if theme.baidu_push %} {% endif %}

机器学习基础理解

数据挖掘是什么

数据挖掘也叫机器学习,是由人工智能之父艾伦.图灵提出,其最大的成就就是图灵测试。简单理解为就是一个人和一个机器跟你去聊天,你不知道对方是人还是机器,如果经过聊天后,你分辨不出谁是人谁是机器则说明这个机器通过了图灵测试。

机器学习是实现人工智能的一种技术手段,官方给出的人工智能诠释为:“机器学习就是从【数据】中自动分析获得【规律(模型)】,并利用规律对未知数据进行【预测】”。在通俗点讲就是“机器学习”开始是一位普通的厨师,通过不断的锻炼和菜谱(算法模型),将样本数据(食材)变为一道道美食,最终成为一位米其林大厨。

数据挖掘基础

  • 需要明确的几点:
    1.机器学习最终进行预测出来的结果其实都是通过相关的算法计算出来的结果!所以说在机器学习中算法是核心,数据是计算的基础。
    2.找准定位:大部分复杂模型的算法设计都是算法工程师(博士,硕士)在做,而我们只需要:
    • 学会分析问题,使用机器学习相关算法完成对应的需求
    • 掌握算法的基本思想,学会对不同问题选择对应的算法去解决
    • 学会利用框架和库解决问题

数据挖掘算法分类

  • 分类和回归问题
    • 分类算法基于的是【标签数据】为【离散型】数据
      回归算法基于的是【标签数据】为【连续型】数据
    • 结论:在社会中产生的数据必然是离散型或者是连续型的数据,那么企业针对数据所产生的需求也无非是分类问题或者回归问题。
  • 分类问题应用:
    • 人脸识别图像处理
    • 文本分类
    • 银行分类客户贷款风险
  • 回归问题应用:
    • 股票
    • 房价预测

数据挖掘开发流程

  • 1.数据采集
    • 公司内部产生的数据
    • 和其他公司合作获取的数据
    • 购买的数据
  • 2.分析数据所对应要解决需求或者问题是什么?根据目标数据推断问题属于回归还是分类!
  • 3.数据的基本处理
    • 数据清洗
    • 合并
    • 级联等
  • 4.特征工程:对特征进行处理
    • 特征抽取
    • 特征预处理
    • 降维等
  • 5.选择合适的模型,然后对其进行训练
  • 6.模型的评估
  • 7.上线使用

数据挖掘中的数据类型

  • 机器学习中的数据类型分为:
    1.离散型数据:
    • 取值范围是有限个值或者一个数列构成的,表示分类情况,如:企业数量 产品数量等
    • 离散变量则是通过计数方式取得的,即是对所要统计的对象进行计数,增长量非固定的,如:一个地区的企业数目可以是今年只有一家,而第二年开了十家;一个企业的职工人数今年只有10人,第二年一次招聘了20人等。
      2.连续型数据:
    • 连续变量是一直叠加上去的,增长量可以划分为固定的单位,即:1,2,3…… 例如:一个人的身高,他首先长到1.51,然后才能长到1.52,1.53……。
    • 取值范围是一个区间,它可以在该区间中连续取值,即连续型变量可以取到区间中的任意值,并且有度量单位。例如:身高、年龄、体重、金额
      注意:
    • 连续型数据的增长是有规律的,离散型数据的增长是没有规律的。
    • 连续性数据是区间可分的,而离散型数据是区间不可分的。

数据挖掘数据集划分

是从数据中自动分析获得规律,并利用规律对未知数据进行预测。换句话说,我们的模型一定是要经过样本数据对其进行训练,才可以对未知数据进行预测的。
问:我们得到数据后,是否将数据全部用来训练模型呢?
当然不是的啦!因为我们如果模型(数据的规律)都是从数据中得来的,那么该模型的性能评估如何进行呢?还是基于对原先的数据进行预测吗?可想不是的,如果模型对原先的数据进行预测,由于模型(数据的规律)本来就是从该数据中获取的,所以预测的精度几乎会是百分之百。所以想要评估模型的好坏,需要使用一组新数据对模型进行评估。
因此我们需要将原先的样本数据拆分成两部分:
训练集:训练模型
测试集:评估模型
不同类型的模型对应的评估方式是不一样的

  • 数据集划分的API
    from sklearn.model_selection import train_test_split
    train_test_split(x,y,test_size,random_state)参数介绍:
    x:特征
    y:目标
    test_size:测试集的比例
    random_state:打乱的随机种子
    返回值:训练特征,测试特征,训练目标,测试目标

特征工程

  • 为什么需要特征工程
    样本数据中的特征有可能会存在缺失值,重复值,异常值等等,那么我们是需要对特征中的相关的噪点数据进行处理的,那么处理的目的就是为了营造出一个更纯净的样本集(数据集越纯净则越便于让模型总结出数据集中潜在的规律),让模型基于这组数据可以有更好的预测能力。当然特征工程不是单单只是处理上述操作!

  • 什么是特征工程
    特征工程是将原始数据转换为更好的能代表模型能够处理数据的潜在问题对应特征的过程,从而提高对未知数据预测的准确性。所以特征工程就是对特征的相关处理!
    比如AlphaGo学习的数据中既有棋谱,又有食谱还有歌词,那么一些干扰的数据绝对会影响AlphaGo的学习。

  • 特征工程的意义
    直接影响模型预测的结果

  • 如何实现特征工程
    工具:sk-learn

  • sklean介绍

    • 是python语言中的机器学习工具,包含了很多知名的机器学习算法的实现,其文档完善,容易上手。
      功能:
      分类模型
      回归模型
      聚类模型
      特征工程

特征抽取

目的:
我们所采集到样本中的特征数据往往很多时候为字符串或者其他类型的数据,我们知道电脑只可以识别二进制数值型的数据,如果把字符串给电脑,电脑是看不懂的。机器学习学习的数据如果不是数值型的数据,它是识别不了的。

字符串类型的数据我们也可以成为分类变量

  • 无序分类变量

    • 说明事物类别的一个名称,如性别有男女两种,二者无大小之分,无顺序之分,还有如血型、民族等
  • 有序分类变量

    • 也是说明事物类型的一个名称,但是有次序之分,例如:满意度分为满意 一般 不满意,三者是有顺序的,you大小之分

特征值化:将非数值型的特征转换成数值型的特征

效果演示:
将字符串转换成数字

1
2
3
4
5
from sklearn.feature_extraction.text import CountVectorizer
vector = CountVectorizer()
res = vector.fit_transform(['lift is short,i love python','lift is too long,i hate python'])
print(res.toarray())

输出:[[0 1 1 0 1 1 1 0]
[1 1 1 1 0 1 0 1]]

演示后得出:
特征抽取对文本等数据进行特征值化。特征值化是为了让机器更好的理解数据。

字典特征抽取——OneHot编码

img

  • 为什么需要onehot编码呢?
    • 特征抽取主要目的就是对非数值型的数据进行特征值化!如果现在需要对下图中的human和alien进行手动特征值化Alien为4,human
      img
  • 对其进行One-Hot编码后:
    img
1
2
3
#基于pandas实现one-hot编码
# pd.get_dummies(df['col'])

总结:

  • 理想情况下,无序分类变量的特征使用one-hot编码进行特征值化,有序分类变量的特征用map映射。

文本特征抽取

  • 作用:对文本数据进行特征值化
  • API:from sklearn.feature_extraction.text import CountVectorizer
  • fit_transform(X):X为文本或者包含文本字符串的可迭代对象,返回sparse矩阵
  • inverse_transform(X):X为array数组或者sparse矩阵,返回转换之前的格式数据
  • get_feature_names()
  • toarray():将sparse矩阵换成数组
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
from sklearn.feature_extraction.text import CountVectorizer

alist = [

'left is is short,i love python',

'left is too long,i hate python'

]

tool = CountVectorizer()

ret = tool.fit_transform(alist)

print(tool.get_feature_names())

print(ret.toarray())

['hate', 'is', 'left', 'long', 'love', 'python', 'short', 'too']
[[0 2 1 0 1 1 1 0]
[1 1 1 1 0 1 0 1]]

上述文本抽取一般是给英文文章使用的,如果是中文文章,就要使用到“jieba分词”插件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
#jieba分词安装
pip install jieba

#jieba分词的基本使用
import jieba
s = '分词作用到文本特征抽取的综合使用'
ret = list(jieba.cut(s))
print(ret)

#分词作用到文本特征抽取的综合使用
import jieba
alist = [
'对有标点符号的中文文本进行特征抽取',
'因为在自然语言处理中,我们是需要将一段中文文本中相关的词语'
]


jieba_alist = []
for item in alist:
ret = list(jieba.cut(item))
s_ret = ' '.join(ret)#ret==>[你好,我也好] ' '.join(list)==>"你好 我也好"
jieba_alist.append(s_ret)

tool = CountVectorizer()
ret = tool.fit_transform(jieba_alist)
print(tool.get_feature_names())
print(ret.toarray())

特征的预处理

对数值性数据一般进行无量纲化处理

  • 无量纲化:

    • 在机器学习算法实践中,我们往往有着将不同规格的数据转换到同一规格,或不同分布的数据转换到某个特定分布的需求这种需求统称为将数据“无量纲化”。
    • 譬如梯度和矩阵为核心的算法中,譬如逻辑回归,支持向量机,神经 网络,无量纲化可以加快求解速度;
    • 而在距离类模型,譬如K近邻,K-Means聚类中,无量纲化可以帮我们提升模型精度,避免某一个取值范围特别大的特征对距离计算造成影响。
    • 一个特例是决策树和树的集成算法们,对决策 树我们不需要无量纲化,决策树可以把任意数据都处理得很好。
      那么预处理就是用来实现无量纲化的方式。
      含义:特征抽取后我们就可以获取对应的数值型的样本数据啦,然后就可以进行数据处理了。
      概念:通过特定的统计方法(数学方法),将数据转换成算法要求的数据
      方式:
      • 归一化
      • 标准化
  • 归一化的实现:

    • API:from sklearn.preprocessing import MinMaxScaler
    • 参数:feature_range表示缩放范围,通常使用(0,1)
    • 作用:使得某一个特征对最终结果不会造成很大的影响
    • 问题:如果数据中存在的异常值比较多,会对结果造成什么样的影响?
      • 结合着归一化计算的公式可知,异常值对原始特征中的最大值和最小值的影响很大,因此也会影响对归一化之后的值。这个也是归一化的一个弊端,无法很好的处理异常值。
    • 归一化总结:
      • 在特定场景下最大值和最小值是变化的,另外最大最小值很容易受到异常值的影响,所以这种归一化的方式具有一定的局限性。因此引出了一种更好的方式叫做:标准化!!!
  • 标准化的处理

    • 当数据按均值中心化后,再按标准差缩放,数据就会服从为均值为0,方差为1的正态分布(即标准正态分 布),而这个过程,就叫做数据标准化(Standardization,又称Z-score normalization)。
    • API
      • 处理后,每列所有的数据都聚集在均值为0,标准差为1范围附近
      • 标准化API:from sklearn.preprocessing import StandardScaler
        • fit_transform(X):对X进行标准化
        • mean_:均值
        • var_:方差
  • 归一化和标准化总结:

    • 对于归一化来说,如果出现了异常值则会响应特征的最大最小值,那么最终结果会受到比较大影响
    • 对于标准化来说,如果出现异常点,由于具有一定的数据量,少量的异常点对于平均值的影响并不大,从而标准差改变比较少。
  • StandardScaler和MinMaxScaler选哪个?

    • 看情况。大多数机器学习算法中,会选择StandardScaler来进行特征缩放,因为MinMaxScaler对异常值非常敏感。在PCA,聚类,逻辑回归,支持向量机,神经网络这些算法中,StandardScaler往往是最好的选择。 MinMaxScaler在不涉及距离度量、梯度、协方差计算以及数据需要被压缩到特定区间时使用广泛,比如数字图像处理中量化像素强度时,都会使用MinMaxScaler将数据压缩于[0,1]区间之中。
    • 建议先试试看StandardScaler,效果不好换MinMaxScaler。

特征选择

从特征中选择出有意义对模型有帮助的特征作为最终的机器学习输入的数据!

  • 切记:

    • 在做特征选择之前,有三件非常重要的事:跟数据提供者联系,跟数据提供者沟通,跟数据提供者开会。
    • 一定要抓住给你提供数据的人,尤其是理解业务和数据含义的人,跟他们聊一段时间。技术能够让模型起飞,前提是你和业务人员一样理解数据。所以特征选择的第一步,其实是根据我们的目标,用业务常识来选择特征。
  • 特征选择的原因:

    • 冗余:部分特征的相关度高,容易消耗计算机的性能
      • 在房价预测中,有高度和楼层这两个特征
    • 噪点:部分特征对预测结果有偏执影响
      • 在房价预测中,其中有户主血型这个特征
  • 特征选择的实现:

    • 人为对不相关的特征进行主观舍弃
    • 当然了,在真正的数据应用领域,比如金融,医疗,电商,我们的数据特征非常多,这样明显,那如果遇见极端情况,我们无法依赖对业务的理解来选择特征,该怎么办呢?
      • 在已有特征和对应预测结果的基础上,使用相关的工具过滤掉一些无用或权重较低的特征
        • 工具:
          • Filter(过滤式)【主要讲解】
          • PCA降维
          • 相关性分析
  • Filter过滤式(方差过滤):

    • 原理:这是通过特征本身的方差来筛选特征的类。比如一个特征本身的方差很小,就表示样本在这个特征上基本没有差异,可能特征中的大多数值都一样,甚至整个特征的取值都相同,那这个特征对于样本区分没有什么作用。所以无论接下来的特征工程要做什么,都要优先消除方差为0或者方差极低的特征。
      • 比如:朝阳区的房价预测,其中样本有一列特征为温度,则要知道朝阳区包含在样本中的房子对应的气象温度几乎一致或者大同小异,则温度特征则对房价的区分是无意义的。
    • API:from sklearn.feature_selection import VarianceThreshold
    • VarianceThreshold(threshold=x)threshold方差的值,删除所有方差低于x的特征,默认值为0表示保留所有方差为非0的特征
    • fit_transform(X)#:X为特征
  • PCA降维(主成分分析):是一种分析,简化数据集的技术,也是【矩阵分解算法】的核心算法

    • 降维的维度值的就是特征的种类。
    • 思想:如何最好的对一个立体的物体用二维表示
      img
    • 当然,第四张二维图片可以比较好的标识一个立体三维的水壶。但是也要清楚,用一个低纬度去表示高纬度的物体时,一定会造成一些信息的差异。可以让低纬度也可以能正确的表示高纬度的事物,或者信息差异最小。
    • 目的:特征数量达到上百,上千的时候,考虑数据的优化。使数据维度压缩,尽可能降低源数据的维度(复杂度),损失少量信息。
    • 作用:可以削减回归分析或者聚类分析中特征的数量
    • PCA语法
      • from sklearn.decomposition import PCA
      • pca = PCA(n_components=None)
        • n_components可以为小数(保留特征的百分比),整数(减少到的特征数量)
      • pca.fit_transform(X)
      • 相关系数进行特征选择
      • 希望样本的特征之间相关性越低越好
      • pandas中有个一方法corr可以计算df每一列的相关系数
  • 相关系数:(不重要)

    • 作用:用来衡量两组数据之间的相关性
    • 相关系数的取值范围是:1,-1
    • 相关系数越接近1:说明两组数据之间越呈现正相关,否则呈现负相关。
    • 在相关系数实现的特征选择中,我们只考虑特征之间的相关性不具体考虑正负相关
    • 规律:相关系数大于0.6就表示两组数据之间呈现高相关性