ML算法基础——概述、特征工程(特征抽取)

1、机器学习概述

**什么是机器学习 **

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

为什么需要机器学习
解放生产力(智能客服)
解决专业问题(ET医疗)
提供社会便利(城市大脑)

机器学习的应用场景
自然语言处理
无人驾驶
计算机视觉
推荐系统

2、数据来源与类型

  • 来源
    企业日益积累的大量数据(互联网公司更为显著)
    政府掌握的各种数据
    科研机构的实验数据
  • 类型
    (1)离散型数据:由记录不同类别个体的数目所得到的数据,又称计数数据,所
    有这些数据全部都是整数,而且不能再细分,也不能进一步提高他
    们的精确度。
    (2)连续型数据:变量可以在某个范围内取任一数,即变量的取值可以是连续
    的,如,长度、时间、质量值等,这类整数通常是非整数,含有小数
    部分。
    :离散型是区间内不可分,连续型是区间内可分

3、数据的特征工程

3.1 特征工程概况

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

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

3.2 scikit-learn库介绍

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

  • 安装
pip3 install Scikit-learn

3.4 数据的特征抽取

3.4.1 特征抽取实例演示

# 特征抽取
#
# 导入包
from sklearn.feature_extraction.text import CountVectorizer

# 实例化CountVectorizer

vector = CountVectorizer()

# 调用fit_transform输入并转换数据

res = vector.fit_transform(["life is short,i like python","life is too long,i dislike python"])

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

print(res.toarray())
>>>
['dislike', 'is', 'life', 'like', 'long', 'python', 'short', 'too']
[[0 1 1 1 0 1 1 0]
 [1 1 1 0 1 1 0 1]]

特征抽取针对非连续型数据

特征抽取对文本等进行特征值化

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

3.4.2 sklearn特征抽取API

Application Programming Interface 应用编程接口

sklearn.feature_extraction

3.4.3 字典特征抽取(特征值化、one-hot编码)

对字典数据进行特征值化

sklearn.feature_extraction.DictVectorizer

(1)DictVectorizer语法

  • DictVectorizer.fit_transform(X)
    • X:字典或者包含字典的迭代器
    • 返回值:返回sparse矩阵
  • DictVectorizer.inverse_transform(X)
    • X:array数组或者sparse矩阵
    • 返回值:转换之前数据格式
  • DictVectorizer.get_feature_names()
    • 返回类别名称
  • DictVectorizer.transform(X)
    • 按照原先的标准转换

(2)流程

实例化类DictVectorizer

调用fit_transform方法输入数据并转换注意返回格式

# 导入包
from sklearn.feature_extraction import DictVectorizer
def dictvec():
    #实例化
    dict=DictVectorizer()
    data=dict.fit_transform([{'city': '北京','temperature':100},
{'city': '上海','temperature':60},
{'city': '深圳','temperature':30}]
)
    print(data)
    return None

if __name__ == "__main__":
    dictvec()
>>> #默认返回sparse矩阵
(0, 1)	1.0
  (0, 3)	100.0
  (1, 0)	1.0
  (1, 3)	60.0
  (2, 2)	1.0
  (2, 3)	30.0

dict=DictVectorizer(sparse=False),结果:(ndarray,数组)

[[  0.   1.   0. 100.]
 [  1.   0.   0.  60.]
 [  0.   0.   1.  30.]]

print(dict.get_feature_names())

['city=上海', 'city=北京', 'city=深圳', 'temperature']

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

(3)one-hot编码分析
将有类别的特征转化成one-hot编码形式,有利于数据的处理
image
图片引用自:https://www.cnblogs.com/shuaishuaidefeizhu/p/11269257.html

3.4.4 文本特征抽取(特征值化、jieba、TF-IDF)

对文本数据进行特征值化
sklearn.feature_extraction.text.CountVectorizer
(1)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()
    • 返回值:单词列表

实例:

from sklearn.feature_extraction.text import CountVectorizer
def countvec():
    cv=CountVectorizer()
    data=cv.fit_transform(["life is short,i like python",
"life is too long,i dislike python"]
)
    print(cv.get_feature_names()) #统计所有文章中所有词,重复的看做一次
    print(data.toarray()) #对每篇文章,在词的列表里进行统计每个词出现的次数,单个字母不统计
    return None

countvec()

>>>
['dislike', 'is', 'life', 'like', 'long', 'python', 'short', 'too']
[[0 1 1 1 0 1 1 0]
 [1 1 1 0 1 1 0 1]]

单个字母不统计,因为:没有分类依据
中文也可以进行处理,但是不会自动分词,可以调用jieba

(2)jieba分词
案例:对三段话进行特征值化

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)
    print(con1) #返回值:词语生成器
    print(content1)
    print(c1)
    return c1,c2,c3

def hanzivec():

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

    return None

if __name__ == "__main__":
    hanzivec()

>>>
<generator object Tokenizer.cut at 0x0000017B4C322CF0>
['今天', '很', '残酷', ',', '明天', '更', '残酷', ',', '后天', '很', '美好', ',', '但', '绝对', '大部分', '是', '死', '在', '明天', '晚上', ',', '所以', '每个', '人', '不要', '放弃', '今天', '。']
今天 很 残酷 , 明天 更 残酷 , 后天 很 美好 , 但 绝对 大部分 是 死 在 明天 晚上 , 所以 每个 人 不要 放弃 今天 。
['一种', '不会', '不要', '之前', '了解', '事物', '今天', '光是在', '几百万年', '发出', '取决于', '只用', '后天', '含义', '大部分', '如何', '如果', '宇宙', '我们', '所以', '放弃', '方式', '明天', '星系', '晚上', '某样', '残酷', '每个', '看到', '真正', '秘密', '绝对', '美好', '联系', '过去', '这样']
[[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]]

(3)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()
    • 返回值:单词列表

案例

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

Process finished with exit code 0

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章