0
点赞
收藏
分享

微信扫一扫

机器学习 笔记(二)特征工程概述 | 特征提取概述 | 基于sklearn的数据集划分 | 特征工程目的、概念 | 字典特征提取 DictVerctorizer| 文本特征提取+Demo

JamFF 2022-01-08 阅读 78
机器学习

文章目录

参考资料


添加链接描述

运行环境

  • win10操作系统
  • anaconda3
  • juyper notebook
  • python3

一、数据集


1.1 数据集的选择

在这里插入图片描述

  • Kaggle 网址: https://www.kaggle.com/datasets

  • UCI 数据集网址:http://archive.ics.uci.edu/ml/

  • scikit-learn 网址:https://scikit-learn.org/stable/auto_examples/index.html#examples-based-on-real-world-datasets

  1. Scikit-learn 工具介绍

在这里插入图片描述

  • Python语言的机器学习工具
  • Scikit-learn 包含许多知名的机器学习算法的实现
  • Scikit-learn 文档完善,容易上手,提供丰富API

安装

pip3 install scikit-learn

导入:

import sklearn

Scikit-learn 包含的内容

在这里插入图片描述

  • 分类、聚类、回归
  • 特征工程
  • 模型选择、调优

1.2 sklearn 数据集

0x001 scikit-learn数据集API介绍

  • sklearn.datasets
    • 加载获取流行数据集
    • datasets.load_xxx() 获取小规模数据集,数据包含在datasets里
    • datasets.frech_xxx(data_home=None) 获取大规模数据集,需从网络上下载,函数第一个参数为data_home,表示数据集下载的目录,默认位置为~/scikit_learn_data/

0x010 sklearn 小数据集

  • sklearn.datasets.load_iris() 加载并返回鸢尾花数据集
from sklearn.datasets import load_iris
import pandas as pd    

iris = load_iris()
df = pd.DataFrame(iris.data, columns=iris.feature_names)
df.head() # 输出前五行

运行结果:

在这里插入图片描述

  • sklearn.datasets.load_boston() 加载并返回波士顿放假数据集
from sklearn.datasets import load_boston
import pandas as pd    

boston = load_boston()
df = pd.DataFrame(boston.data, columns=boston.feature_names)
df.head()

在这里插入图片描述

0x011 大数据集

  • sklearn.datasets.fetch_xxx(data_home=None, subset=‘train’)
    • subset: ‘train’ 或者 ‘test’ , ‘all’, 可选,选择要加载的数据集
    • 训练集的"训练", 测试集的"测试",两者的"全部"

0x100 sklearn数据集返回值介绍

  • loadfrech 返回的数据类型是dataset.base.Bunch (字典格式)

    参数列表

    参数描述
    data特征数据数组,是[n_samples * n_features] 的二维 numpy.ndarray数组
    target标签数组,是 n_samples 的一维numpy.ndarray数组
    DESCR数据描述
    feature_names特征名称,部分数据集没有,比如新闻数据、手写数字、回归数据集等
    target_names标签名称

Bunch对象获取值的两种方法

bunch['key']

bunch.key

1.3 数据集的划分

机器学习一般的数据会划分为两个部分:

  • 训练数据: 用于训练,构建模型
  • 测试数据:在模型检验时使用,用于评估模型是否有效

划分比例:

  • 训练集:70% 80% 75%
  • 测试集:30% 20% 30%

数据集划分API

sklearn.model_selection.train_test_split(arrays, *options)

参数列表

参数描述
x数据集的特征值
y数据集的标签值
test_size测试集的大小,一般为float,默认为0.25
random_state随机数种子,不同的种子会造成不同的随机采样结果。相同的种子采样结果相同
return训练集特征值,测试集特征值,训练集目标值,测试集目标值 x_train, x_test, y_train, y_test

范例:划分鸢尾花数据集

from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
import pandas as pd    

iris = load_iris()
x_train, x_test, y_train, y_test = train_test_split(iris.data, iris.target, test_size=0.2)

pd.DataFrame(x_train, columns=iris.feature_names)

运行结果:
在这里插入图片描述

二、特征工程 Feature Engineering介绍


目标

  • 了解特征工程在机器学习当中的重要性
  • 知道特征工程的分类

2.1 特征工程 目的

机器学习领域的大神 Andrew Ng(吴恩达)老师说过 : "Coming up with features is difficult, time-consuming, requires expert knowledge. “Applied machine learning” is basically feature engineering. "

注:业界广泛流传:数据和特征决定了机器学习的上线,而模型和算法只是逼近这个上线而已。

2.2 特征工程 概念

特征工程是使用专业背景知识和技巧处理数据,使得特征能在机器学习算法上发挥更高的作用的过程。

意义:会直接影响机器学习的效果

2.3 特征工程的位置与数据处理的比较

所用的py库描述作用
pandas读取数据方便,可处理数据格式的工具库数据清洗、数据处理等
sklearn对于特征的处理提供了强大的接口特征工程(特征提取/抽取、特征预处理、特征降维等)

三、特征抽取


目标

  • 应用 DictVectorizer 实现对类别特征进行数值化、离散化
  • 应用 CountVectorizer实现对文本特征进行数值化
  • 应用 TfidfVectorizer 实现对文本特征进行数值化
  • 了解两种文本特征提取方式的区别

0x001 文字的特征抽取需要将其转化为数值

在这里插入图片描述

0x010 类别字符串的特征抽取需将其转化为数值

在这里插入图片描述

3.1 特征提取

0x001 将任意数据(如文本或图像)转化为可用于机器学习的数字特征

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

  • 字典特征提取(特征离散化)
  • 文本特征提取
  • 图像特征提取(深度学习)

0x010 特征提取API

sklearn.feature_extraction

3.2 字典特征提取

作用: 对字典数据进行特征值化

sklearn.feature_extraction.DicVectorizer(sparse=True, ...)

常用方法:

方法描述
DictVectorizer.fit_transform(X)X为字典或者包含字典的迭代器返回值,返回sparse矩阵
DictVectorizer.inverse_transform(X)X为array数组或者sparse矩阵,返回转换之前的数据格式
DictVerctorizer.get_feature_names()返回类别名称

0x001 应用

[{'city': '北京', 'temperature': 100},
{'city': '上海', 'temperature': 60},
{'city': '深圳', 'temperature': 30}]

通过特征提取后

在这里插入图片描述

from sklearn.feature_extraction import DictVectorizer

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


def test(dv, data):
    data_new = dv.fit_transform(data)
    print('类型: ', type(data_new))
    print('数据:\n', data_new)
    print('特征名称: ', dv.get_feature_names())

print('DictVectorizer构造sparse参数默认为True时')

# 1. 实例化转换器类
dv = DictVectorizer()
# 2. 调用 fit_transform()
test(dv, data)

print('DictVectorizer构造sparse参数指定为False时')
test(DictVectorizer(sparse=False), data)

运行结果:在这里插入图片描述

观察结果可发现,在使用 DictVectorizer()进行字典特征抽取时,若 未指定sparse参数则为 True,返回结果是一个csr_matrix,即稀疏矩阵对象,而指定为False时则返回一个numpy库的ndarray数组对象。

csr_matrix 稀疏矩阵特点:1) 将非零值按位置表示出来; 2) 节省内存,提高加载效率

0x010 pandas库能通过 one-hot 编码实现类似的效果

在这里插入图片描述

为每个类别生成一个布尔列,这些列中只有一列可以为每个样本值取1, 因此,术语为一个热编码

在这里插入图片描述

0x011 应用场景

  • pclass,sex数据集当中类别特征比较多,1) 将数据集的特征转化为字典类型; 2) 使用 DictVectorizer 转换
  • 数据本身就是字典类型

0x 100 总结

对于特征中存在类别信息的,都会做 one-hot 编码处理

3.3 文本特征提取

CountVectorizer

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

sklearn.feature_extraction.text.CountVectorizer(stop_words=[])

返回词频矩阵

CountVectorizer对象的常用方法:

方法名描述
fit_transform(X)X表示为array数组或者sparse矩阵,返回sparse矩阵
inverse_transform(X)X表示为array数组或者sparse矩阵,返回转换之前的数据格式
get_feature_names()返回单词列表

0x001 应用

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

在这里插入图片描述

from sklearn.feature_extraction.text import CountVectorizer

data = ['life is short, i like python','life is too long, i dislike python']

cv = CountVectorizer()

data_new = cv.fit_transform(data)
print('类型:', type(data_new))
print('数据:\n', data_new)
print('特征名称: ', cv.get_feature_names())
print('sparse稀疏矩阵转化为矩阵:\n', data_new.toarray())
print('出现次数: \n', data_new.toarray().sum(axis=0))

运行结果:

在这里插入图片描述

CountVectorizer作用:统计每个样本特征词出现的个数,其中的 stop_words[]参数表示停用词,指定后就不会对停用词进行统计

0x010 中文文本特征提取

jieba库安装

pip3 install jieba

测试文本:

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

data = cut_word(data)
print('=======分词结果======\n', data)
# 将分词结果转化为列表
data = [x for x in data.split(' ')]
# CountVectorizer 进行文本特征提取
cv = CountVectorizer()
data_new = cv.fit_transform(data)
print('\n=======类型======\n', type(data_new))
# print('数据:\n', data_new) # 输出内容太多暂时注释掉
print('\n=======特征名称======\n ', cv.get_feature_names())
print('\n=======sparse稀疏矩阵转化为矩阵======\n', data_new.toarray())

print('\n=======出现次数=======\n', data_new.toarray().sum(axis=0))

运行结果:

在这里插入图片描述

TfidfVectorizer

关键词:在某一个类别的文章中,出现的次数很多,但是在其他类别的文章中出现很少

  • TF-IDF主要思想:如果某个词或短语在一篇文章中出现的概率高,并且在其他文章中很少出现,则认为此词或者短语具有良好的 类别区分能力,适合用来分类。
  • TF-IDF作用:用以评估一字词对于一个文件集或者一个语料库中的其中一份文件的重要程度

0x001 公式

  • 词频(tf, term frequency) 指的是某一个给定的词语在该文件中出现的频率
  • 逆向文档频率(inverse document frequency, idf) 是一个词语普遍重要性的度量,某一特定词语的idf,可以由总文件数目除以包含词语所有文件****的数目,再将获得的商取以10为底的对数得到。

公式: t f i d f i , j = t f i , j × i d f i tfidf_{i,j} = tf_{i,j} \times idf_i tfidfi,j=tfi,j×idfi

比如有两个词,“经济”, “非常”,有1000篇文章作为语料库,其中100篇文章含有 “非常”, 10篇文章含有"经济"

现有其中两篇文章的情况:

文章A (100词) : 10次"经济" TF-IDF:

tf: 10 / 100 = 0.1

idf: lg(1000 / 10) = 2

文章B (100词) : 10次"非常" TF-IDF:

tf: 10 / 100 = 0.1

idf: lg(1000 / 100) = 1

0x010 API

sklearn.feature_extraction.text.TfidVectorizer(stop_words=None, ...)

TfidVectorizer常用方法:

方法名描述
fit_tranform(X)X表示为文本或者包含文本字符串的可迭代对象,返回sparse矩阵
inverse_tranform(X)X表示为array数组或者sparse矩阵,返回转换之前的数据格式
get_feature_names()返回单词列表
from sklearn.feature_extraction.text import TfidfVectorizer
import jieba
def cut_word(text):
    """
        进行中文分词
        :param text
        :return: 
    """
    text = " ".join(jieba.cut(text))
    return text
    
data = "一种还是一种今天很残酷,明天更残酷,后天很美好,但绝对大部分是死在明天晚上,所以每个人不要放弃今天。 \
我们看到的从很远星系来的光是在几百万年之前发出的,这样当我们看到宇宙时,我们是在看它的过去。\
如果只用一种方式了解某样事物,你就不会真正了解它。了解事物真正含义的秘密取决于如何将其与我们所了解的事物相联系。"

data = cut_word(data)

# 将分词结果转化为列表
data = [x for x in data.split(' ')]
# CountVectorizer 进行文本特征提取
cv = TfidfVectorizer()
data_new = cv.fit_transform(data)
print('\n=======类型======\n', type(data_new))
# print('数据:\n', data_new) # 输出内容太多暂时注释掉
print('\n=======特征名称======\n ', cv.get_feature_names())
print('\n=======sparse稀疏矩阵转化为矩阵======\n', data_new.toarray())

print('\n=======出现次数=======\n', data_new.toarray().sum(axis=0))

在这里插入图片描述

0x011 Tf-idf的重要性:是分类机器学习算法进行文章分类中前期数据处理的方式

四、收获与总结


0x001 python有关sklearn机器学习的操作

  • 加载小数据集
sklearn.datasets.load_xxx()
  • 加载大的数据集
sklearn.datasets.fetch_xxx()

sklearn加载数据集返回的结果是一个字典格式的Bunch对象,具有data、target、DESCR、feature、target_names键

  • 划分数据集 ,返回的结果是 x_train, x_test, y_train, y_test
sklearn.model_selection.train_test_split(arrays, *options)
  • 字典特征提取,返回结果是csr_matrix 系数矩阵对象,可通过toarray()转化为numpy.narray数组
sklearn.feature_extraction.DicVectorizer(sparse=True, ...)
  • 两种文本特征提取
sklearn.feature_extraction.text.CountVectorizer(stop_words=[])

sklearn.feature_extraction.text.TfidVectorizer(stop_words=None, ...)

0x010 收获

通过本次学习,了解到了python可以通过sklearn库获取一些官方的数据集、并进行数据集的划分,可以使用里面的feature_extraction库里的一些方法进行特征提取。内容比较多,一下记不住,但只要有记录,相关的概念以及简单的Demo,笔者认为在将来需要的时候在看看还是很有用的。

另外就是了解了特征工程的特征提取,对于文本除了词频统计外,还可以赋予一个tdif值,这样就更能衡量一个词的重要程度。

根据上次学习到的机器学习流程:数据获取、处理 -> 特征工程 -> 机器学习算法训练构建模型 -> 模型评估,目前已经到了第二阶段特征工程的前两个步骤,接下来则是特征预处理阶段。

举报

相关推荐

0 条评论