机器学习概述、特征工程、Scikit-learn

先来拜见一下祖师爷(祖师爷真帅)

机器学习概述、特征工程、Scikit-learn_第1张图片

“人工智能之父” 艾伦.图灵 图灵测试(1950)

机器学习概述、特征工程、Scikit-learn_第2张图片

马文·李·闵斯基(英语:Marvin Lee Minsky,1927年8月9日-2016年1月24日),科学家,专长于认知科学与人工智能领域,麻省理工学院人工智能实验室的创始人之一,著有几部人工智能和哲学方面的作品。1969年,因为在人工智能领域的贡献,获得图灵奖。

机器学习概述、特征工程、Scikit-learn_第3张图片

机器学习概述、特征工程、Scikit-learn_第4张图片
机器学习概述、特征工程、Scikit-learn_第5张图片
机器学习概述、特征工程、Scikit-learn_第6张图片

图片艺术化 GAN神经网络

机器学习概述、特征工程、Scikit-learn_第7张图片

这就说明了Python天下第一
开个玩笑,语言只是工具,我写Java的时候也说Java天下第一,
PHP才是世界上最好的语言

机器学习概述、特征工程、Scikit-learn_第8张图片

就这些书啊,我都没有看过,不过我还年轻,以后我也不会看的。

什么是机器学习

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

为什么需要机器学习

机器学习概述、特征工程、Scikit-learn_第9张图片

机器学习应用场景

机器学习概述、特征工程、Scikit-learn_第10张图片

数据类型

  • 离散型数据:由记录不同类别个体的数目所得到的数据,又称计数数据,所有这些数据全部都是整数,而且不能再细分,也不能进一步提高他 们的精确度。
  • 连续型数据:变量可以在某个范围内取任一数,即变量的取值可以是连续的,如,长度、时间、质量值等,这类整数通常是非整数,含有小数部分。

注:只要记住一点,离散型是区间内不可分,连续型是区间内可分

可用数据集

机器学习概述、特征工程、Scikit-learn_第11张图片

  • scikit-learn特点:数据量较小、方便学习
  • UCI特点:收录了360个数据集、覆盖科学、生活、经济等领域 、数据量几十万
  • Kaggle特点:大数据竞赛平台、80万科学家、真实数据、数据量巨大

常用数据集数据的结构组成

结构:特征值+目标值

机器学习概述、特征工程、Scikit-learn_第12张图片]注:有些数据集可以没有目标值

机器学习概述、特征工程、Scikit-learn_第13张图片
如何利用工具自己进行对原始数据(非连续型)的处理?

数据的特征工程

特征工程是什么

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

特征工程的意义

直接影响模型的预测结果

Scikit-learn库介绍

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

特征抽取

数据的特征抽取

特征抽取实例演示

from sklearn.feature_extraction.text import CountVectorizer

# 实例化CountVectorizer
vector = CountVectorizer()

# 调用fit_transform输入并转换数据
res = vector.fit_transform(["Life is short, you need python", "Life is too long, you did not need python"])

# 打印结果
print(vector.get_feature_names())
print(res.toarray())

运行结果

['did', 'is', 'life', 'long', 'need', 'not', 'python', 'short', 'too', 'you']
[[0 1 1 0 1 0 1 1 0 1]
 [1 1 1 1 1 1 1 0 1 1]]

通过演示得出结论:

  • 特征抽取针对非连续型数据
  • 特征抽取对文本等进行特征值化

注:特征值化是为了计算机更好的去理解数据

sklearn特征抽取API

sklearn.feature_extraction

字典特征抽取

作用:对字典数据进行特征值化
类:sklearn.feature_extraction.DictVectorizer

DictVectorizer语法

DictVectorizer(sparse=True,…)

DictVectorizer.fit_transform(X)

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

DictVectorizer.inverse_transform(X)

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

DictVectorizer.get_feature_names()

  • 返回类别名称

DictVectorizer.transform(X)

  • 按照原先的标准转换

流程

  1. 实例化类DictVectorizer
  2. 调用fit_transform方法输入数据并转换 注意返回格式
[{'city': '北京','temperature':100}
{'city': '上海','temperature':60}
{'city': '深圳','temperature':30}]
from sklearn.feature_extraction import DictVectorizer


def dictvec():
    """
    字典数据抽取
    :return:  None
    """
    # 实例化
    dict = DictVectorizer(sparse=False)

    # 调用fit_transform
    data = dict.fit_transform([
        {'city': '北京', 'temperature': 100},
        {'city': '上海', 'temperature': 60},
        {'city': '深圳', 'temperature': 30}
    ])
    print(dict.get_feature_names())
    print(dict.inverse_transform(data))
    print(data)


if __name__ == "__main__":
    dictvec()

运行结果

['city=上海', 'city=北京', 'city=深圳', 'temperature']
[{'city=北京': 1.0, 'temperature': 100.0}, {'city=上海': 1.0, 'temperature': 60.0}, {'city=深圳': 1.0, 'temperature': 30.0}]
[[  0.   1.   0. 100.]
 [  1.   0.   0.  60.]
 [  0.   0.   1.  30.]]

字典数据抽取:把字典中一些类别数据,分别进行转换成特征

数组形式,有类别的这些特征,先要转换成字典数据

One-hot编码

机器学习概述、特征工程、Scikit-learn_第14张图片

机器学习概述、特征工程、Scikit-learn_第15张图片

文本特征抽取

作用:对文本数据进行特征值化

类:sklearn.feature_extraction.text.CountVectorizer

CountVectorizer语法

CountVectorizer(max_df=1.0,min_df=1,…) 返回词频矩阵

CountVectorizer.fit_transform(X,y)

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

CountVectorizer.inverse_transform(X)

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

CountVectorizer.get_feature_names()

  • 返回值:单词列表

流程

  1. 实例化类CountVectorizer
  2. 调用fit_transform方法输入数据并转换
    注意返回格式,利用toarray()进行sparse矩阵转换array数组
["life is short,i like python",
"life is too long,i dislike python"]
from sklearn.feature_extraction.text import CountVectorizer

def countvex():
    """
    对文本进行特征值化
    :return: None
    """
    cv = CountVectorizer()
    data = cv.fit_transform(["人生 苦短,你 需要 Python", "人生 漫长,你 不需要 Python"])
    # 统计所有文章当中所有的词,重复的只看做一次  词的列表
    print(cv.get_feature_names())
    # 对每篇文章,在词的列表里面进行统计每个词出现的次数 单个字母不统计
    print(data.toarray())

    return None

if __name__ == "__main__":
    countvex()


['python', '不需要', '人生', '漫长', '苦短', '需要']
[[1 0 1 0 1 1]
 [1 1 1 1 0 0]]

文本特种抽取:Count

文本分类、情感分析
对于单个英文字母不统计:没有分类依据

中文需要空格才能进行抽取,所以我们需要进行分词处理

这时候就需要jieba分词,如果是Python的Web项目,jieba分词配合搜索引擎还是很常用的,跟ElasticSearch的ik分词一个效果。

案例:对三段话进行特征值化

1、今天很残酷,明天更残酷,后天很美好,
但绝对大部分是死在明天晚上,所以每个人不要放弃今天。

2、我们看到的从很远星系来的光是在几百万年之前发出的,
这样当我们看到宇宙时,我们是在看它的过去。

3、如果只用一种方式了解某样事物,你就不会真正了解它。
了解事物真正含义的秘密取决于如何将其与我们所了解的事物相联系
from sklearn.feature_extraction.text import CountVectorizer
import jieba


def cutword():
    con1 = jieba.cut("今天很残酷,明天更残酷,后天很美好,但绝对大部分是死在明天晚上,所以每个人不要放弃今天。")
    con2 = jieba.cut("我们看到的从很远星系来的光是在几百万年之前发出的,这样当我们看到宇宙时,我们是在看它的过去。")
    con3 = jieba.cut("如果只用一种方式了解某样事物,你就不会真正了解它。了解事物真正含义的秘密取决于如何将其与我们所了解的事物相联系。")

    # 转换成列表
    content1 = list(con1)
    content2 = list(con2)
    content3 = list(con3)

    # 把列表转换为字符串
    c1 = ' '.join(content1)
    c2 = ' '.join(content2)
    c3 = ' '.join(content3)

    return c1, c2, c3


def hanzivec():
    """
    中文特征值化
    :return: None
    """
    c1, c2, c3 = cutword()

    print(c1, c2, c3)

    cv = CountVectorizer()
    data = cv.fit_transform([c1, c2, c3])
    print(cv.get_feature_names())
    print(data.toarray())

    return None


if __name__ == "__main__":
    hanzivec()

运行结果

今天 很 残酷 , 明天 更 残酷 , 后天 很 美好 , 但 绝对 大部分 是 死 在 明天 晚上 , 所以 每个 人 不要 放弃 今天 。 我们 看到 的 从 很 远 星系 来 的 光是在 几百万年 之前 发出 的 , 这样 当 我们 看到 宇宙 时 , 我们 是 在 看 它 的 过去 。 如果 只用 一种 方式 了解 某样 事物 , 你 就 不会 真正 了解 它 。 了解 事物 真正 含义 的 秘密 取决于 如何 将 其 与 我们 所 了解 的 事物 相 联系 。
['一种', '不会', '不要', '之前', '了解', '事物', '今天', '光是在', '几百万年', '发出', '取决于', '只用', '后天', '含义', '大部分', '如何', '如果', '宇宙', '我们', '所以', '放弃', '方式', '明天', '星系', '晚上', '某样', '残酷', '每个', '看到', '真正', '秘密', '绝对', '美好', '联系', '过去', '这样']
[[0 0 1 0 0 0 2 0 0 0 0 0 1 0 1 0 0 0 0 1 1 0 2 0 1 0 2 1 0 0 0 1 1 0 0 0]
 [0 0 0 1 0 0 0 1 1 1 0 0 0 0 0 0 0 1 3 0 0 0 0 1 0 0 0 0 2 0 0 0 0 0 1 1]
 [1 1 0 0 4 3 0 0 0 0 1 1 0 1 0 1 1 0 1 0 0 1 0 0 0 1 0 0 0 2 1 0 0 1 0 0]]

词语占比

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-v0oi0Nv6-1597934569545)(http://124.70.66.191/wp-content/uploads/2020/08/20200819111131.jpg)]文章类型???

这些词语可以区分出文章的类别,但是 “所以” “我们” “明天” 这些词呢?基本上每篇文章都会出现这些词吧,所以我们需要一种方式解决这个问题。这种文本特征抽取的方式叫做 TF-IDF

TF-IDF

TF: term frequency 词的频率
IDF:逆文档频率inverse document frequency
T F = 某 个 词 在 文 章 中 出 现 的 次 数 TF = 某个词在文章中出现的次数 TF=

I D F = l o g ( 总 文 档 数 量 该 词 出 现 的 文 档 数 量 ) IDF = log(\frac{总文档数量}{该词出现的文档数量}) IDF=log()

T F − I D F = T F ( 词 频 ) × I D F ( 逆 文 档 频 率 ) TF-IDF = TF(词频)\times IDF(逆文档频率) TFIDF=TF()×IDF()

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

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

类:sklearn.feature_extraction.text.TfidfVectorizer

TfidfVectorizer语法

TfidfVectorizer(stop_words=None,…)

  • 返回词的权重矩阵

TfidfVectorizer.fit_transform(X, y)

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

TfidfVectorizer.inverse_transform(X)

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

TfidfVectorizer.get_feature_names()

  • 返回值:单词列表
from sklearn.feature_extraction import DictVectorizer
from sklearn.feature_extraction.text import CountVectorizer, TfidfVectorizer


def tfidfvec():
    """
    中文特征值化
    :return: None
    """
    c1, c2, c3 = cutword()

    print(c1, c2, c3)

    tf = TfidfVectorizer()
    data = tf.fit_transform([c1, c2, c3])
    print(tf.get_feature_names())
    print(data.toarray())

    return None


if __name__ == "__main__":
    tfidfvec()

运行结果

Building prefix dict from the default dictionary ...
Loading model from cache /var/folders/0x/2nv8y02908b38mngk5wxzvhc0000gn/T/jieba.cache
Loading model cost 0.715 seconds.
Prefix dict has been built successfully.
今天 很 残酷 , 明天 更 残酷 , 后天 很 美好 , 但 绝对 大部分 是 死 在 明天 晚上 , 所以 每个 人 不要 放弃 今天 。 我们 看到 的 从 很 远 星系 来 的 光是在 几百万年 之前 发出 的 , 这样 当 我们 看到 宇宙 时 , 我们 是 在 看 它 的 过去 。 如果 只用 一种 方式 了解 某样 事物 , 你 就 不会 真正 了解 它 。 了解 事物 真正 含义 的 秘密 取决于 如何 将 其 与 我们 所 了解 的 事物 相 联系 。
['一种', '不会', '不要', '之前', '了解', '事物', '今天', '光是在', '几百万年', '发出', '取决于', '只用', '后天', '含义', '大部分', '如何', '如果', '宇宙', '我们', '所以', '放弃', '方式', '明天', '星系', '晚上', '某样', '残酷', '每个', '看到', '真正', '秘密', '绝对', '美好', '联系', '过去', '这样']
[[0.         0.         0.21821789 0.         0.         0.
  0.43643578 0.         0.         0.         0.         0.
  0.21821789 0.         0.21821789 0.         0.         0.
  0.         0.21821789 0.21821789 0.         0.43643578 0.
  0.21821789 0.         0.43643578 0.21821789 0.         0.
  0.         0.21821789 0.21821789 0.         0.         0.        ]
 [0.         0.         0.         0.2410822  0.         0.
  0.         0.2410822  0.2410822  0.2410822  0.         0.
  0.         0.         0.         0.         0.         0.2410822
  0.55004769 0.         0.         0.         0.         0.2410822
  0.         0.         0.         0.         0.48216441 0.
  0.         0.         0.         0.         0.2410822  0.2410822 ]
 [0.15698297 0.15698297 0.         0.         0.62793188 0.47094891
  0.         0.         0.         0.         0.15698297 0.15698297
  0.         0.15698297 0.         0.15698297 0.15698297 0.
  0.1193896  0.         0.         0.15698297 0.         0.
  0.         0.15698297 0.         0.         0.         0.31396594
  0.15698297 0.         0.         0.15698297 0.         0.        ]]

为什么需要TfidfVectorizer

分类机器学习算法的的重要依据

其实吧TF-IDF也是一个过时的方法,在自然语言分析里会有一些新的技术,但是这个基本的也得知道啊!


最近在做一些毛用都没有的Vue项目,纯浪费生命,影响我在机器学习的世界里当一个快乐的调包侠,her tui~ 啥也不是!

后来包里总带把伞,因为下雨了没有谁来送伞,也没有谁陪着淋雨。
不带伞的话,站也不是走也不是,像个可怜的笑话……
2020年8月20日 Macsen Chu

你可能感兴趣的:(机器学习,机器学习,人工智能)