机器学习(机器学习介绍、特征工程和文本特征提取)

文章目录

    • 1- 机器学习的介绍
      • 为什么要进行机器学习
    • 2- 数据集的结构
      • 常用的数据集
      • 数据中对于特征的处理
    • 3- 特征工程与文本特征提取
      • 安装
      • 可用的数据集
      • 字典特征抽取
        • DictVectorizer语法
        • 代码演示
        • 结合数据分析结果
        • one-hot 编码分析
      • 文本特征数据抽取
        • CountVectorizer语法
        • 代码演示
        • 当采取中文时,代码演示
        • 采用jieba分词
        • Jieba分词代码演示
        • TF-IDF

1- 机器学习的介绍

为什么要进行机器学习

  • 为了发展
  • 机器学习可以代替更多的人来进行工作,最重要的是进行24小时无疲劳工作
  • 可以扩展行业的更高发展

2- 数据集的结构

常用的数据集

  • 结构 : 特征性 + 目标性
  • 注 : 有些数据可以没有目标值

数据中对于特征的处理

  • Pandas : 一个数据读取非常方便的处理格式的工具
  • Sklearn : 对于特征的处理提供了非常强大的接口
  • Pandas处理数据
    • 过滤缺失值 : dropna()
    • 填充缺失值 : fillna()
    • 异常值 : replace()
    • 重复值 : drop_duplicates()

3- 特征工程与文本特征提取

安装

pip install Scikit-learn

可用的数据集

描述 特点
kaggle 大数据竞争平台,800万科学家,真实数据,数据巨大
UCI 收集了360个数据集,覆盖了科学、生活、经济等领域,数据量几十万
Scikit-learn 数据量小,方便学习

字典特征抽取

DictVectorizer语法

  • DictVectorize(sparse=True)

    • DictVectorize.fit_transform(x)
    • x : 字典或者包含字典的迭代器
    • 返回值 :返回sparse矩阵
  • Dictvectorize.inverse_transform(x)

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

    • 返回类别名称
  • Dictvectorize.transform(X)

    • 按照原先的标准转换

代码演示

  • Dictvectorize这个类中sparse默认参数时
# @Time : 2020/5/23 0:43 
# @Author : SmallJ 

from sklearn.feature_extraction import DictVectorizer

# 导入的 DictVectorizer 为一个类,当我们想使用这个类里面的方法的时候,需要进行实例化


def dict_matrix():
    """
    字典矩阵
    :return:None
    """
    # 实例化
    dict_number = DictVectorizer(sparse=True)
    data = [{
     'city': '北京', 'temperature': 100}, {
     'city': '上海', 'temperature': 60}, {
     'city': '深圳', 'temperature': 30}]
    result = dict_number.fit_transform(data)
    print(dict_number.get_feature_names())
    print(result)
    print(type(result))


if __name__ == '__main__':
    dict_matrix()
['city=上海', 'city=北京', 'city=深圳', 'temperature']
  (0, 1)	1.0
  (0, 3)	100.0
  (1, 0)	1.0
  (1, 3)	60.0
  (2, 2)	1.0
  (2, 3)	30.0
<class 'scipy.sparse.csr.csr_matrix'>

结论 :当默认参数的时候,类型为sparse矩阵的结果

  • Dictvectorizer这个类中sparse参数指定为False情况时
# @Time : 2020/5/23 0:43 
# @Author : SmallJ 

from sklearn.feature_extraction import DictVectorizer

# 导入的 DictVectorizer 为一个类,当我们想使用这个类里面的方法的时候,需要进行实例化


def dict_matrix():
    """
    字典矩阵
    :return:None
    """
    # 实例化 
    dict_number = DictVectorizer(sparse=False)
    data = [{
     'city': '北京', 'temperature': 100}, {
     'city': '上海', 'temperature': 60}, {
     'city': '深圳', 'temperature': 30}]
    
    result = dict_number.fit_transform(data)
    
    # 返回类别名称
    print(dict_number.get_feature_names())
    print(result)
    print(type(result))


if __name__ == '__main__':
    dict_matrix()
['city=上海', 'city=北京', 'city=深圳', 'temperature']
[[  0.   1.   0. 100.]
 [  1.   0.   0.  60.]
 [  0.   0.   1.  30.]]
<class 'numpy.ndarray'>

结论 : 当参数为False时候,返回的类型为numpy.array数据类型

结合数据分析结果

# 数据源
data = [{
     'city': '北京', 'temperature': 100}, {
     'city': '上海', 'temperature': 60}, {
     'city': '深圳', 'temperature': 30}]

# 为true数据
['city=上海', 'city=北京', 'city=深圳', 'temperature']
  (0, 1)	1.0
  (0, 3)	100.0
  (1, 0)	1.0
  (1, 3)	60.0
  (2, 2)	1.0
  (2, 3)	30.0
  
# 为false数据
['city=上海', 'city=北京', 'city=深圳', 'temperature']
[[  0.   1.   0. 100.]   
 [  1.   0.   0.  60.]
 [  0.   0.   1.  30.]]

分析 : 先观察为true的数据,会发现第一列为位置,第二列为数据参数。然后我们观察为false的数据会发现其实我们通过get_feature_names()返回类别名称。city="上海"指定为第一列,city="北京"为第二列以此类推。返回的数据为numpy.array()类型数据。也就是相当于第一行数据为北京的,第二行数据为上海的,第三行数据为深圳的。

当第一行数据为北京,是怎么填充数据的呢,当city数据集指向北京,就会在第一行中寻找为北京的那一列填充为1,最后一列为temperature就填充数值。以此类推。

sparse矩阵数据相当于就是相对应的numpy.array位置数据

one-hot 编码分析

什么是one-hot编码?

  • One-Hot编码,又称为一位有效编码,主要是采用N位状态寄存器来对N个状态进行编码,每个状态都由他独立的寄存器位,并且在任意时候只有一位有效。

  • One-Hot编码是分类变量作为二进制向量的表示。这首先要求将分类值映射到整数值。然后,每个整数值被表示为二进制向量,除了整数的索引之外,它都是零值,它被标记为1。

编码对象

  • 编码的对象–[“中国”, “美国”, “日本”, “美国”]

  • 确定分类变量 – 中国 美国 日本

  • 以上问题就相当于**,有3个样本,每个样本有3个特征,将其转化为二进制向量**表示,

  • one-hot 编码处理

机器学习(机器学习介绍、特征工程和文本特征提取)_第1张图片

文本特征数据抽取

作用:对文本数据进行特征值化,对单字母不进行分类

CountVectorizer语法

  • CountVectorize()

    • 返回词频矩阵
  • CountVectorize.fit_transform(x)

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

    • 返回值 :单词列表

代码演示

from sklean.feature_extraction.text import CountVectorizer

def text_extract():
    """
    对文本特征值操作
    :return: None
    """
    # 总结
    # 当我们的文本特征抽取的时候发现并没有sparse这个值的参数
    # 不过我们可用知道矩阵一定是使用了numpy中的方法
    # toarray()
    # 文本特征抽取统计的是字母出现的次数
    # 会发现单个单词并不会统计。为什么呢,原因在于单个单词分类出来并不知道使用处
    
    count = CountVectorizer()
    data = ["life is short,i like python", "life is too long,i dislike python"]
    result = count.fit_transform(data)
    print(count.get_feature_names())
    print(result.toarray())


if __name__ == '__main__':
    # dict_extract()
    text_extract()
# 运行结果说明
# CountVectorizer 统计的是单词出现的次数
# 将数据中对应出现的单词进行分本分类
# 分类完后并开始统计对应位置的出现次数
# 在对应的字母单词的列中进行对应的分类
# 有一次则填充1,有两次则填充2 以此类推,无则为零

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

当采取中文时,代码演示

# @Time : 2020/5/23 14:23 
# @Author : SmallJ

from sklearn.feature_extraction.text import CountVectorizer


def text_extract():
    """
    对文字进行特征抽取
    :return:
    """
    count = CountVectorizer()

    # 当我们对中文进行特征抽取会是一个什么样的结果
    # 我们会发现中文特征抽取是使用的是空格来进行
    # 这不是我们想使用的结果。
    data = ['人生 苦短,我用 Python', '人生 漫长,我 不同 Python']

    result = count.fit_transform(data)

    print(count.get_feature_names())
    print(result.toarray())


if __name__ == '__main__':
    text_extract()

['python', '不同', '人生', '我用', '漫长', '苦短']
[[1 0 1 1 0 1]
 [1 1 1 0 1 0]]

采用jieba分词

  • jieba是目前Python最好的分词组件。
  • 支持3种分词模式 : 精确模式、全模式、搜索引擎模式
  • 支持繁体字分词
  • 支持自定义词典

安装

pip install jieba

使用

  • import jieba
  • jieba.cut()
  • 返回值 : 生成器

Jieba分词代码演示

# @Time : 2020/5/23 14:39 
# @Author : SmallJ 

"""
案例
1.今天很残酷,明天更残酷,后天很美好
2.我们看到的从很远星系来的光是在几百万年之前发出的,这样当我们看到宇宙时,我们是在看它的过去
3.如果只用一种方式了解某样事物,你就不会真正了解它。了解事物真正含义的秘密取决于如何将其与我们所了解的事物相联系
"""

import jieba
from sklearn.feature_extraction.text import CountVectorizer


def cut_word():
    """
    进行中文分词
    :return:
    """
    c1 = jieba.cut("今天很残酷,明天更残酷,后天很美好")
    c2 = jieba.cut("我们看到的从很远星系来的光是在几百万年之前发出的,这样当我们看到宇宙时,我们是在看它的过去")
    c3 = jieba.cut("如果只用一种方式了解某样事物,你就不会真正了解它。了解事物真正含义的秘密取决于如何将其与我们所了解的事物相联系")

    count1 = list(c1)
    count2 = list(c2)
    count3 = list(c3)

    # 对数据进行处理转换为字符串格式
    count1 = "".join(count1)
    count2 = "".join(count2)
    count3 = "".join(count3)

    return count1, count2, count3


def text_extract():
    """
    中文特征值化
    :return: None
    """
    # 实例化对象
    count = CountVectorizer()

    # 进行拆包
    c1, c2, c3 = cut_word()

    # 中文特征值化操作
    data = count.fit_transform([c1, c2, c3])

    # 类别名称转换
    print(count.get_feature_names())

    # 转换为numpy.array格式
    print(data.toarray())


if __name__ == '__main__':
    text_extract()
    # cut_word()
Building prefix dict from the default dictionary ...
Loading model from cache C:\Users\ADMINI~1\AppData\Local\Temp\jieba.cache
Loading model cost 0.610 seconds.
Prefix dict has been built successfully.
['了解事物真正含义的秘密取决于如何将其与我们所了解的事物相联系', '今天很残酷', '你就不会真正了解它', '后天很美好', '如果只用一种方式了解某样事物', '我们是在看它的过去', '我们看到的从很远星系来的光是在几百万年之前发出的', '明天更残酷', '这样当我们看到宇宙时']
[[0 1 0 1 0 0 0 1 0]
 [0 0 0 0 0 1 1 0 1]
 [1 0 1 0 1 0 0 0 0]]

TF-IDF

  • TF-IDF : 是词频-逆向文件频率,是一种用于信息检索文本挖掘的常用的加权技术。

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

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

  • 为什么需要TF-IDF : 分类机器学习算法的重要依据

  • TF-IDF 的值越高代表权值越高

# @Time : 2020/5/23 23:23 
# @Author : SmallJ

# TF-IDF : 词频或者逆向文件磁盘的需要使用的机器学习
from sklearn.feature_extraction.text import TfidfVectorizer
import jieba


def cut_word():
    """
    进行中文分词
    :return:
    """
    c1 = jieba.cut("今天很残酷,明天更残酷,后天很美好")
    c2 = jieba.cut("我们看到的从很远星系来的光是在几百万年之前发出的,这样当我们看到宇宙时,我们是在看它的过去")
    c3 = jieba.cut("如果只用一种方式了解某样事物,你就不会真正了解它。了解事物真正含义的秘密取决于如何将其与我们所了解的事物相联系")

    count1 = list(c1)
    count2 = list(c2)
    count3 = list(c3)

    # 对数据进行处理转换为字符串格式
    count1 = "".join(count1)
    count2 = "".join(count2)
    count3 = "".join(count3)

    return count1, count2, count3


def tf_extract():
    """
    计算每个词语的权值
    :return:None
    """
    # 实例化对象
    tf = TfidfVectorizer()

    # 进行拆包
    c1, c2, c3 = cut_word()

    # 计算每个词的tf-idf的权值
    result = tf.fit_transform([c1, c2, c3])
    print(tf.get_feature_names())
    print(result.toarray())

    # result.toarray() 类型为numpy.array数据类型
    # result 也是为矩阵类型的数据
    print(type(result))


if __name__ == '__main__':
    tf_extract()

Building prefix dict from the default dictionary ...
Loading model from cache C:\Users\ADMINI~1\AppData\Local\Temp\jieba.cache
Loading model cost 0.589 seconds.
Prefix dict has been built successfully.
['了解事物真正含义的秘密取决于如何将其与我们所了解的事物相联系', '今天很残酷', '你就不会真正了解它', '后天很美好', '如果只用一种方式了解某样事物', '我们是在看它的过去', '我们看到的从很远星系来的光是在几百万年之前发出的', '明天更残酷', '这样当我们看到宇宙时']
[[0.         0.57735027 0.         0.57735027 0.         0.
  0.         0.57735027 0.        ]
 [0.         0.         0.         0.         0.         0.57735027
  0.57735027 0.         0.57735027]
 [0.57735027 0.         0.57735027 0.         0.57735027 0.
  0.         0.         0.        ]]
<class 'scipy.sparse.csr.csr_matrix'>

你可能感兴趣的:(机器学习,python,机器学习)