机器学习

一.机器学习的概述

在这里插入图片描述

1.什么是机器学习

  • 机器学习是人工智能的一个分支,是实现人工智能的一个途径;
  • 机器学习是一门多领域交叉学科,研究计算机怎样模拟或实现人类的学习行为,以获取新的知识或技能
  • 机器学习算法是一类从数据中自动分析获得规律(模型),并利用规律对未知数据进行预测的算法;
  • 数据分析和挖掘是机器学习重要的领域之一.

2.开发机器学习应用程序的步骤

(1)收集数据
如:制作网络爬虫从网站上抽取数据、从RSS反馈或者API中得到信息、设备发送过来的实测数据。
(2)准备输入数据
得到数据之后,还必须确保数据格式符合要求。
(3)分析输入数据
这一步的主要作用是确保数据集中没有垃圾数据。如果是使用信任的数据来源,那么可以直接跳过这个步骤
(4)训练算法
机器学习算法从这一步才真正开始学习。如果使用无监督学习算法,由于不存在目标变量值,故而也不需要训练算法,所有与算法相关的内容在第(5)步
(5)测试算法
这一步将实际使用第(4)步机器学习得到的知识信息。当然在这也需要评估结果的准确率,然后根据需要重新训练你的算法
(6)使用算法
转化为应用程序,执行实际任务。以检验上述步骤是否可以在实际环境中正常工作。如果碰到新的数据问题,同样需要重复执行上述的步骤

3.机器学习的环境准备

NumPy
这是一个非常有名的数据分析库。从计算数据分布的中位数,到处理多维数组,NumPy 都可以帮你完成。
Pandas
这是用来处理 CSV 文件的。当然了,你还需要处理一些表格、查看统计数据等,那 Pandas 就是可以满足你的需求的工具。
Matplotlib
把数据存储在 Pandas 的数据框后,你可能需要做一些可视化来理解数据的更多信息。毕竟一图抵千言。
Seaborn
这是另一个可视化工具,但这个工具更侧重于统计结果的可视化,比如直方图、饼图、曲线图或相关性表等。
Scikit-Learn
这是用 Python 实现机器学习的终极工具。所谓用 Python 实现机器学习指的就是这个——Scikit-Learn。所有你需要的从算法到提升的内容都能在这里找到。
Tensorflow 和 Pytorch
针对这两个工具我不会说太多。但如果你对深度学习感兴趣的话,可以详细了解一下,它们值得你花时间去学习。

4.机器学习模型建立

在这里插入图片描述

5.监督学习和非监督学习

监督学习(英语:Supervised learning),可以由输入数据中学到或建立一个模型,并依此模式推测新的结果。输入数据是由输入特征值和目标值所组成。函数的输出可以是一个连续的值
(称为回归),或是输出是有限个离散值(称作分类)。
无监督学习(英语:Supervised learning),可以由输入数据中学到或建立一个模型,并依此模式推测新的结果。输入数据是由输入特征值所组成。

二.特征工程简介

1.什么是特征工程

大部分直接拿过来的数据都是特征不明显的、没有经过处理的或者说是存在很多无用的数据,那么需要进行一些特征处理,特征的缩放等等,满足训练数据的要求,或者提高模型的准确性。特征工程其实就是在对已有的数据进行运算达到我们目标的数据标准。基本上包含以下几个步骤

  • 特征抽取:将任意数据格式(例如文本和图像)转换为机器学习的数字特征。

  • 特征处理:通过特定的统计方法(数学方法)将数据转换成算法要求的数据

  • 特征选择:是在已有的特征中选择更好的特征。

2.数据的类型

  • 离散型数据:由记录不同类别个体的数目所得到的数据,又称计数数据,所有这些数据通常情况下是整数,而且不能再细分,也不能进一步提高他们的精确度,数据之间没有规律,没有增长量.比如掷骰子的点数,某个企业的职工人数,是否患有癌症,水仙花的种类
  • 连续性数据:变量可以在某个范围内取任一数,即变量的取值可以是连续的,这类整数通常是非整数,通常含有小数部分,增长量可以划分为固定的单位。如,长度、时间、质量值等,贷款额度等
  • 总结一点:离散型是区间内不可分,连续型是区间内可分

3.常用数据集的结构

在这里插入图片描述
结构=特征值+目标值(有些数据集可能没有目标值)

例子:下面的表表示一个数据集,每一行表示一个样本,每一列表示一种特征

4.DataFrame

​ DataFrame:一个表格型的数据结构,包含有一组有序的列,每列可以是不同的值类型(数值、字符串、布尔型等),DataFrame即有行索引也有列索引

数据集一般是通过pandas读取,返回类型就是一个DataFrame对象

import  pandas as pd
if __name__ == '__main__':
    df = pd.DataFrame({
        'name':['joe','usan','andy'],
        'sex':['men','women','men'],
        'age':[10,20,30],
        'id':[1,2,3]
    },index=['one','two','three'])
    print("数据集打印:\n",df)
    #获取列数据
    print(df[['age','id']])
    print(df[[1,2]])
    #获取行数据
    print(df.ix[[1,2]])
    #获取某一个为位置的数据
    print(df.ix[1,2])
    #行列修改
    df.ix[1]=[0,0,'ha','men']
    print(df)

在这里插入图片描述

注意踩坑

1.除了修改,选择某几行,或者某几列都是不会修改原对象的,需要用一个变量接受

2.行列索引是不算在数据集里的,且数据集数据默认下标从0开始

3.取多列或者多行注意可以用索引页可以用下标,然后必须在[]你们放列表,如df[[1,2,3]]

三.特征工程流程

1.特征抽取

将任意数据格式(例如文本和图像)转换为机器学习的数字特征

(1)字典特征抽取

原理:one-hot编码
其方法是使用N位状态寄存器来对N个状态进行编码,每个状态都由他独立的寄存器位,并且在任意时候,其中只有一位有效。独热编码恰好是一种解决上述问题的好办法。不过数据也因此变得稀疏。
简单来说就是value作为特征,用0或者1表示是否具有该特征。这样做的一个好处就是可以让特征之间的距离计算变得科学。

类: sklearn.feature_extraction.DictVectorizer (翻译助剂:特征化抽取的字典向量化器))

API:
在这里插入图片描述

import pandas
from sklearn.feature_extraction import DictVectorizer
onehot = DictVectorizer() # 如果结果不用toarray,请开启sparse=False,默认是打开的返回scipy.sparse矩阵
instances = [{'city': '郑州','temperature':100},{'city': '深圳','temperature':60}, {'city': '香港','temperature':30}]
x = onehot.fit_transform(instances)
print(x);print(x.toarray())
print(onehot.inverse_transform(x))#可以返回原来的字典序列
print(pandas.DataFrame(x.toarray()))

在这里插入图片描述
注意踩坑

  1. fit_transform()
    将映射列表转换为Numpy数组或scipy.sparse矩阵,默认是后者,后者转成前者.toarray(),后者相当于前者的稀疏矩阵的压缩表示

  2. 两种类型都是采用的one-hot编码,独热编码即 One-Hot 编码,又称一位有效编码,其方法是使用N位状态寄存器来对N个状态进行编码,每个状态都由他独立的寄存器位,并且在任意时候,其中只有一位有效。独热编码恰好是一种解决上述问题的好办法。不过数据也因此变得稀疏。
    简单来说就是value作为特征,用0或者1表示是否具有该特征。这样做的一个好处就是可以让特征之间的距离计算变得科学。

  3. 只有Numpy数组可以作为参数建立pandas的DataFrame对象

(2)文本特征抽取
统计词频

原理:
统计词频,特征取值是词频数

类:
sklearn.feature_extraction.text.CountVectorizer(翻译助记:特征抽取的计数矢量化器)
API:
在这里插入图片描述

from sklearn.feature_extraction.text import CountVectorizer
content = ["life is short,i like python","life is too long,i dislike python"]
vectorizer = CountVectorizer()
data=vectorizer.fit_transform(content)
print(vectorizer.get_feature_names())
print(data.toarray())

在这里插入图片描述
注意
1.英文中单个字母和标点不会转化为特征,出现多次的合并为一个特征值
2.中文需要将段落的词语之间分开才能提取特征

中文分词组建jieba(说话一个字一个字蹦…结巴)
import jieba
con1 = jieba.cut("今天很残酷,明天更残酷,后天很美好,但绝对大部分是死在明天晚上,所以每个人不要放弃今天。")
# 转换成列表
content1 = list(con1)
# 吧列表转换成字符串
c1 = ' '.join(content1)
print(c1)

在这里插入图片描述
缺点:
所有词语都统计了,数量庞大,不能很好表示词语跟与文章的相关度,比如我们,这样,等等

关键字提取

原理:
如果某个词或短语在一篇文章中出现的概率高,并且在其他文章中很少出现,则认为此词或者短语具有很好的类别区分能力,适合用来分类,并提取为特征值。
类:
sklearn.feature_extraction.text.TfidfVectorizer(翻译助记term frequency–inverse document frequency
词频-逆文本率指数(评估词语对于该文章的标志性)))
具体公式
API:
在这里插入图片描述
返回的矩阵是词语td*idf的值在这里插入图片描述
TF-IDF算法非常容易理解,并且很容易实现,但是其简单结构并没有考虑词语的语义信息,无法处理一词多义与一义多词的情况。

2.特征处理

定义: 通过特定的统计方法(数学方法)将数据转换成算法要求的数据
数值型数据:标准缩放:
1、归一化
2、标准化
3、缺失值
类别型数据:one-hot编码
时间类型:时间的切分
类:所有的特征处理都在sklearn. preprocessing中

(1)归一化

原理:
通过对原始数据进行变换把数据映射到(默认为[0,1])之间,这是为了,防止每个特征是数据值没有同意标准,而对结果造成影响,比如特征1是收入比如10000,特征2是年龄是20,这样两个数值在后面数据分析的时候就会造成影响,于是可以通过归一化,不看单位将数值化成同一标准
在这里插入图片描述
类:sklearn.preprocessing.MinMaxScaler
API:
在这里插入图片描述

 mm = MinMaxScaler(feature_range=(2, 3))

    data = mm.fit_transform([[90,2,10,40],[60,4,15,45],[75,3,13,46]])

    print(data)

在这里插入图片描述

缺点:如果数据中异常点较多,根据公式,将会导致最大最小值出现偏差,使特征处理效果降低,所以这种方法鲁棒性较差,只适合传统精确小数据场景。

(2)标准化

原理:通过对原始数据进行变换把数据变换到均值为0,方差为1范围内
在这里插入图片描述
对于归一化来说:如果出现异常点,影响了最大值和最小值,那么结果显然
会发生改变

对于标准化来说:如果出现异常点,由于具有一定数据量,少量的异常点对
于平均值的影响并不大,从而方差改变较小。

类:scikit-learn.preprocessing.StandardScaler(标准缩放器)
API:在这里插入图片描述

 std = StandardScaler()

    data = std.fit_transform([[ 1., -1., 3.],[ 2., 4., 2.],[ 4., 6., -1.]])

    print(data)

在这里插入图片描述
适用场景:在已有样本足够多的情况下比较稳定,适合现代嘈杂大数据场景。

(3)缺失值处理

在这里插入图片描述类:sklearn.preprocessing.Imputer
API在这里插入图片描述
注意
axis:表示这个strategy是对行还是列进行的,比如求平均值是求整行还是整列的
其中缺失值要用numpy.nan表示,如果不是,可以用DataFrame.replace(…)方法

  im = Imputer(missing_values='NaN', strategy='mean', axis=0)

    data = im.fit_transform([[1, 2], [np.nan, 3], [7, 6]])

    print(data)

在这里插入图片描述
可以看出 np.nan用1,7平均值4 替代了

3.特征选择

特征选择:

一个典型的机器学习任务,是通过样本的特征来预测样本所对应的值。如果样本的特征少,我们会考虑增加特征,比如Polynomial Regression就是典型的增加特征的算法。而现实中的情况往往是特征太多了,需要减少一些特征。

特征选择的原因:
冗余:部分特征的相关度高,容易消耗计算性能
噪声:部分特征对预测结果有负影响
主要讲一下过滤式:

(1)方差阈值

原理:删除方差小于给定阈值的特征,因为这些特征在各个样本里没有区分度
类:sklearn.feature_selection.VarianceThreshold
API:
在这里插入图片描述

var = VarianceThreshold(threshold=1)

    data = var.fit_transform([[0, 2, 0, 3], [0, 1, 4, 3], [0, 1, 1, 3]])

    print(data)

在这里插入图片描述

(2)成分分析

PCA(Principal Component Analysis),即主成分分析方法,是一种使用最广泛的数据降维算法。PCA的主要思想是将n维特征映射到k维上,这k维是全新的正交特征也被称为主成分,是在原有n维特征的基础上重新构造出来的k维特征。PCA的工作就是从原始的空间中顺序地找一组相互正交的坐标轴,新的坐标轴的选择与数据本身是密切相关的。其中,第一个新坐标轴选择是原始数据中方差最大的方向,第二个新坐标轴选取是与第一个坐标轴正交的平面中使得方差最大的,第三个轴是与第1,2个轴正交的平面中方差最大的。依次类推,可以得到n个这样的坐标轴。通过这种方式获得的新的坐标轴,我们发现,大部分方差都包含在前面k个坐标轴中,后面的坐标轴所含的方差几乎为0。于是,我们可以忽略余下的坐标轴,只保留前面k个含有绝大部分方差的坐标轴。事实上,这相当于只保留包含绝大部分方差的维度特征,而忽略包含方差几乎为0的特征维度,实现对数据特征的降维处理。

在这里插入图片描述
类: sklearn.decomposition PCA
API:
在这里插入图片描述

 pca = PCA(n_components=0.9)

    data = pca.fit_transform([[2,8,4,5],[6,3,0,8],[5,4,9,1]])

    print(data)

特征维度降低
在这里插入图片描述

Logo

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

更多推荐