一、机器学习

图灵测试

 

 

机器学习领域:自然语言处理、图像识别、传统预测

机器学习库和框架:Scikit-learn、TensorFlow、Caffe、Keras

定义:机器学习是从数据中自动分析获得规律(模型),并利用规律对未知数据进行预测。

目的:让机器学习程序替换手动的步骤,减少企业的成本也提高企业的效率。

 

二、数据集的构成

可用的数据集:

1、kaggle:

  • 大数据竞赛平台
  • 80万科学家提供
  • 真实数据
  • 数据量巨大

2、UCI:

  • 收录了360个数据集
  • 覆盖科学、生活、经济等领域
  • 数据量几十万

3、Scikit-learn

  • 自带数据集
  • 数据量较少
  • 方便学习

数据集的结构:特征值+目标值

  • dataFrame:列索引(特征值) --> 判断性别(目标值)
  • 数据不需要去重,对学习不影响

 

机器学习的数据:csv文件等

不使用MySQL:

  • 性能瓶颈、读取速度
  • 格式不太符合机器学习要求的格式

pandas:数据读取非常方便,计算和处理的速度快,基于numpy(numpy速度快的原因:c编写 释放了GIL锁 真正的多线程)

sklearn:对于特征的处理提供了强大的接口

特征工程:特征的处理影响预测的结果

 

三、特征工程

特征工程是将原始数据转换为更好地代表预测模型的潜在问题的特征的过程,从而提高了对未知数据的预测准确性。

特征工程直接影响预测结果。

scikit-learn库:

  • Python语言的机器学习工具
  • scikit-learn包括许多知名的机器学习算法的实现
  • scikit-learn文档完善,容易上手,丰富的API,在学术界颇受欢迎

 

安装虚拟环境

sudo apt-get install python-virtualenv

创建虚拟环境ml3

mkvirtualenv -p /usr/bin/python3.5 ml3

安装mklearn

pip3 install Scikit-learn

测试安装成功

import sklearn

 

四、数据的特征抽取

特征抽取:对文本等数据进行特征值化。

sklearn.feature_extraction

1、字典特征抽取

sklearn.feature_extraction.DictVectorizer

DictVectorizer(sparse=True,...)

DictVectorizer.fit_transform(X)

  • X:字典或包含字典的迭代器
  • 返回:sparse矩阵

DictVectorizer.inverse_transform(X)

  • X:array数组或sparse矩阵
  • 返回:转换之前数据格式

DictVectorizer.get_feature_names()

  • 返回:类别名称

DictVectorizer.transform(X)

  • 按照原先的标准转换

 

流程:

①实例化类DictVectorizer

②调用inverse_transform输入数据并转换(注意返回格式)

from sklearn.feature_extraction import DictVectorizer


def dictvec():
    data = [{'city': '北京', 'temperature': 30}, {'city': '上海', 'temperature': 36}, {'city': '广州', 'temperature': 40}]
    # 实例化
    dict = DictVectorizer()
    # 调用fit_transform
    ret = dict.fit_transform(data)
    print(ret)


if __name__ == '__main__':
    dictvec()

dict = DictVectorizer(sparse=False)

sparse矩阵 n维数组

   one-hot编码

    print(dict.get_feature_names())

print(dict.inverse_transform(ret))

 

 字典数据抽取就是把字典中一些类别的数据,分别转化成特征

 

 

 

2、文本特征抽取

sklearn.feature_extraction.text.CountVectorizer

应用:文本分类、情感分析

CountVectorizer()

  • 返回词频矩阵

CountVectorizer.fit_transform(X)

  • X表示文本或者包含文本字符串的可迭代对象
  • 返回parse矩阵

CountVectorizer.inverse_transform(X)

  • X为array数组或者sparse矩阵
  • 返回转换之前的数据格式

CountVectorizer.get_feature_names()

  • 返回单词列表

 

流程:

①实例化CountVectorizer

②调用fit_transform方法输入数据并转换

  • 注意返回格式,利用toarray()进行sparse矩阵转换array数组
from sklearn.feature_extraction.text import CountVectorizer


def countvec():
    data = ["life is short, i like python", "life is too long, i dislike python"]
    cv = CountVectorizer()
    ret = cv.fit_transform(data)
    print(ret)
    print(ret.toarray())  # 需要手动转成数组
    print(cv.get_feature_names())


if __name__ == '__main__':
    countvec()

 

cv.get_feature_names():统计所有文章中所有的词,重复的只统计1次

ret.toarray()得到的数组的含义:每一篇文章用一个与词列表对应的数组标记,值代表出现的次数

对单个英文字母不统计,如 i

不支持中文(除非先进行分词处理,词与词之间有空格)

 

jieba分词

安装:pip3 install jieba

import jieba

jieba.cut("人生苦短,我用python")

返回一个词语生成器

def hanzivec():
    data1 = "盗取荒野与星空的人不再仰望,介乎科学和白日梦,此间诗意杀人地"
    data2 = "煞费万物虚构之舟,去往意识碎片,不眠浪潮灰烬的意志,在酒的深处重逢"
    c1 = jieba.cut(data1)
    c2 = jieba.cut(data2)
    c1_list = list(c1)
    c2_list = list(c2)
    con1 = " ".join(c1_list)
    con2 = " ".join(c2_list)
    print(con1)
    print(con2)
    
    cv = CountVectorizer()
    res = cv.fit_transform([con1, con2])
    print(cv.get_feature_names())
    print(res.toarray())

 

3、tf-idf

在文本分类时,为了避免“我们”“所以”等常用词成为分类的依据,我们使用tf-idf。

TF-IDF的主要思想是:如果某个词或短语在一篇文章中出现的概率很高,并且在其他文章中很少出现,则认为此词或短语具有很好的类别区分能力,适合用来分类。

term frequency:词的频率  ---- 出现的次数

inverse document frequency:逆文档频率  ---- log(总文档数量/该词出现的文档数量)   -----  出现文档数越多,逆文档频率越小

重要性 = tf * idf  -----  衡量每个词的重要性

TF-IDF作用:用于评估一字词对于一个文件集或一个语料库中的其中一份文件的重要程度。 

 

sklearn.feature_extraction.text.TfidfVectorizer

TfidfVectorizer(stop_words=None,...) 

  • 返回词的权重矩阵

TfidfVectorizer.fit_transform(X)

  • X:文本或包含文本字符串的可迭代对象
  • 返回sparse矩阵

TfidfVectorizer.inverse_transform(X)

  • X:array数组或parse矩阵
  • 返回转换之前数据格式

TfidfVectorizer.get_feature_names()

  • 返回单词列表
from sklearn.feature_extraction.text import TfidfVectorizer
import jieba

def tfidfvec():
    data1 = "我最大的遗憾 是你的遗憾与我有关 没有句点已经很完美了 何必误会故事没说完"
    data2 = "黑白如彩色 夜夜笙歌 望梅止渴 故事已经说完"
    c1 = jieba.cut(data1)
    c2 = jieba.cut(data2)
    c1_list = list(c1)
    c2_list = list(c2)
    con1 = " ".join(c1_list)
    con2 = " ".join(c2_list)

    tv = TfidfVectorizer()
    res = tv.fit_transform([con1, con2])
    print(tv.get_feature_names())
    print(res.toarray())

 

 

五、特征的预处理

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

数值型数据:标准缩放

  • 归一化
  • 标准化
  • 缺失值(主要用pandas处理)

类别型数据:one-hot编码

时间类型:时间的切分(主要用pandas处理)

sklearn.preprocession

 

1、归一化

通过对原始数据进行变换把数据映射到 [0, 1] 之间

 

作用于每一列,max为一列的最大值,min为一列的最小值,那么x''为最终结果

mx,mi分别为指定区间值,默认mx为1,mi为0

sklearn.preprocessing.MinMaxScaler

MinMaxScaler(feature_range=(0,1))

  • 每个特征缩放到给定范围

MinMaxScaler.fit_transform(X)

  • X: numpy array格式的数据[n_samples, n_features]
  • 返回转换后的形状相同的array
from sklearn.preprocessing import MinMaxScaler

def mm():
    mm = MinMaxScaler(feature_range=[2, 3])
    data = [[90, 2, 10, 40], [60, 4, 15, 45], [75, 3, 13, 46]]
    ret = mm.fit_transform(data)
    print(ret)

 

三个特征同等重要,就要进行归一化,使得某一个特征对最终结果不会造成更大的影响。

 

如果数据中异常点较多,对最大值最小值产生影响,造成结果偏差。

归一化的缺点:鲁棒性较差,只适合传统精确小数据场景。一般不用。

 

2、标准化

通过对原始数据进行变换,把数据变换到均值为0,标准差为1范围内。

mean为平均值,σ为标准差。

 

方差可以考量数据的稳定性。

 

对于归一化来说:如果出现了异常点,影响了最大值和最小值,结果显然会发生改变。

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

sklearn.preprocessing.StandardScaler

StandardScaler()

  • 处理之后每个特征来说所有数据都聚集在均值0附近标准差为1

StandardScaler.fit_transform(X)

  • X: numpy array格式的数据[n_samples, n_features]
  • 返回转换后的形状相同的array

StandardScaler.mean_

  • 原始数据中每列特征的平均值

StandardScaler.std_

  • 原始数据每列特征的方差
from sklearn.preprocessing import StandardScaler

def stand():
    std = StandardScaler()
    data = [[1, -1, 3], [2, 4, 2], [4, 6, -1]]
    ret = std.fit_transform(data)
    print(ret)

 

3、缺失值

(缺失值主要用pandas处理)

删除:如果每列或者行数据缺失值达到一定的比例,建议放弃整行或整列。

插补:可以通过缺失值每行或每列的平均值、中位数来填充。

sklearn.preprocessing.Imputer

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

  • 完成缺失值插补,指定缺失值,指定策略,指定行或列,0是列,1是行

Imputer.fit_transform(X)

  • X: numpy array格式的数据[n_samples, n_features]
  • 返回转换后的形状相同的array
from sklearn.preprocessing import Imputer

def imp():
    im = Imputer(missing_values='NaN', strategy="mean", axis=0)
    data = [[1, 2], [numpy.nan, 3], [7, 8]]
    ret = im.fit_transform(data)
    print(ret)

 

Numpy中的数组可以使用np.nan或np.NaN来代替缺失值,属于float类型。

如果是文件中的一些缺失值,可以替换成nan,通过np.array转化成float型的数组即可。

 

六、数据降维

维度:特征的数量

1、特征选择

特征选择就是从提取到的所有特征中选择部分特征作为训练集特征。

原因:

  • 冗余:部分特征相关度高,容易消耗计算性能
  • 噪声:部分特征对预测结果有影响

主要方法:

① Filter(过滤式):Variance Threshold方差阈值

② Embedded(嵌入式):正则化、决策树

③ Wrapper(包裹式)

④ 神经网络

 

这里暂时只讲过滤式。

过滤式:从方差大小来考虑所有样本所有特征的数据情况

 sklearn.feature_selection.VarianceThreshold

 VarianceThreshold(threshold=0.0)

  • 剔除所有低方差特征

Variance.fit_transform(X)

  • X: numpy array格式的数据[n_samples, n_features]
  • 返回值:训练集差异低于threshold的特征将被删除。默认值是保留所有非零方差特征,即删除所有样本中具有相同值的特征。
from sklearn.feature_selection import VarianceThreshold

def var():
    var = VarianceThreshold(threshold=0.0)
    data = [[0, 2, 0, 3], [0, 1, 4, 3], [0, 1, 1, 3]]
    ret = var.fit_transform(data)
    print(ret)  # 第一列和第四列都被删除了

 

2、主成分分析

sklearn.decomposition 

PCA是什么?

本质:PCA是一种分析、简化数据集的技术。

目的:使数据维数压缩,尽可能降低原数据的维数,损失少量信息。

  • 特征数量达到上百的时候,考虑数据的简化。
  • 数据也会改变,特征数量也会减少。

作用:可以削减回归分析或者聚类分析中特征的数量。

 

高维度数据容易出现的问题:特征之间通常是相关的。

在简化数据集时,将损失减少到最小。

 =》 

 

 

sklearn.decomposition.PCA

PCA(n_components=None)

  • 将数据分解为较低维数空间
  • n_components为小数时,一般是0-1之间的百分比,表示信息损失量保留百分之多少,通常使用90%-95%之间
  • n_components为整数时,表示减少到的特征数量,一般不使用整数

PCA.fit_transform(X)

  • X: numpy array格式的数据[n_samples, n_features]
  • 返回转换后指定维度的array
from sklearn.decomposition import PCA

def pca():
    pca = PCA(0.9)
    data = [[2, 8, 4, 5], [6, 3, 0, 8], [5, 4, 9, 1]]
    ret = pca.fit_transform(data)
    print(ret)

 

3、数据降维案例

https://www.kaggle.com/c/instacart-market-basket-analysis

 

products.csv 商品信息

orders.csv 用户的订单信息

aisles.csv 商品所属物品类别

order_products_prior.csv 订单与商品信息

 

 用户对物品类别的喜好细分降维:

① 合并各张表到一张表当中

pandas.merge()

 

# 在jupyter notebook中执行以下代码

import pandas as pd
from sklearn.decomposition import PCA

# 读取四张表的数据
prior = pd.read_csv("./data/instacart/order_products__prior.csv")
products = pd.read_csv("./data/instacart/products.csv")
orders = pd.read_csv("./data/instacart/orders.csv")
aisles = pd.read_csv("./data/instacart/aisles.csv")

# 合并四张表到一张表单中
_mg = pd.merge(prior, products, on=['product_id', 'product_id'])
_mg = pd.merge(_mg, orders, on=['order_id', 'order_id'])
meg = pd.merge(_mg, aisles, on=['aisle_id', 'aisle_id'])

# 查看前10个
meg.head(10)

② 建立一个类似行,列数据(交叉表:一种特殊的分组工具)

cross = pd.crosstab(meg['user_id'], meg['aisle'])

cross.head(10)

 

 ③ 进行主成分分析

pca = PCA(n_components=0.9)

# 输入的数据必须是行和列的形式
data = pca.fit_transform(cross)

data

data.shape

 206209个用户,134个特征降维到了27个,保留了0.9的信息量

4、其他降维方法 

线性判别分析LDA

 

posted on 2019-11-12 17:25  三分天涯  阅读(354)  评论(0编辑  收藏  举报