机器学习-特征工程

1、什么是特征工程

1.1 特征工程

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

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

数据集构成:特征值+目标值

1.2 特征工程包含内容

特征抽取
特征预处理
特征降维

1.3 特征工程所需工具

1) Scikit-learn

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

① Python语言的机器学习工具
② Scikit-learn包括许多知名的机器学习算法的实现
③ Scikit-learn文档完善,容易上手,丰富的API
④ 目前稳定版本0.18

对特征的处理,会影响结果

2) 安装

pip3 install Scikit-learn==0.18

安装之后,通过

import sklearn

验证是否安装成功!

注:安装scikit-learn需要Numpy,Pandas等库

机器学习: 数据需要去重, 特征抽取: 文本、字符串

3)Scikit-learn包含的内容

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

特征抽取api:sklearn.feature_extraction

对字典数据进行特征值化:sklearn.feature_extraction.DictVectorizer
作用:对字典数据进行特征值化
sklearn.feature_extraction.DictVectorizer(sparse=True,…)
DictVectorizer.fit_transform(X) X:字典或者包含字典的迭代器返回值:返回sparse矩阵
DictVectorizer.inverse_transform(X) X:array数组或者sparse矩阵 返回值:转换之前数据格式
DictVectorizer.get_feature_names() 返回类别名称

2. 特征抽取实例

2.1 对两篇文章进行特征抽取

from sklearn.feature_extraction.text import CountVectorizer, TfidfVectorizer

# 实例化conunt
count = CountVectorizer()

# 对两篇文章进行特征抽取
data = count.fit_transform(["人生 人生 苦短,我 喜 欢Python", "生 活太 长 久,我不 喜欢P ython"])

# 内容
print(count.get_feature_names())
print(data.toarray())

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

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

2.2 jieba分词处理

jieba.cut()

返回词语组成的生成器
需要安装下jieba库

pip3 install jieba
import jieba

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

# 先将着三个转换成列表
c1 = ' '.join(list(contetn1))
c2 = ' '.join(list(contetn2))
c3 = ' '.join(list(contetn3))
print(c1)
print(c2)
print(c3)

运行出现了:

AttributeError: module 'importlib._bootstrap' has no attribute 'SourceFileLoader'

执行:

pip install --upgrade --ignore-installed setuptools

即可!

import jieba
from sklearn.feature_extraction.text import CountVectorizer

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

# 将这三个结果,转换成列表,变成以空格隔开的字符串
content1 = ' '.join(list(c1))
content2 = ' '.join(list(c2))
content3 = ' '.join(list(c3))

'''
如果跳过:不会,如果两个关键词
cv = CountVectorizer(stop_words=['不会', '如果'])
'''
cv = CountVectorizer()
data = cv.fit_transform([content1, content2, content3])
print(cv.get_feature_names())
print(data.toarray())

2.3 词的频率 - Tf-idf 文本特征提取

1) TF-IDF的主要思想是

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

2) TF-IDF作用

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

2.4 公式

词频(term frequency,tf)指的是某一个给定的词语在该文件中出现的频率

逆向文档频率(inverse document frequency,idf)是一个词语普遍重要性的度量。某一特定词语的idf,可以由总文件数目除以包含该词语之文件的数目,再将得到的商取以10为底的对数得到

import jieba
from sklearn.feature_extraction.text import CountVectorizer, TfidfVectorizer

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

# 将这三个结果,转换成列表,变成以空格隔开的字符串
content1 = ' '.join(list(c1))
content2 = ' '.join(list(c2))
content3 = ' '.join(list(c3))

# 实例化conunt
tfidf = TfidfVectorizer()

data = tfidf.fit_transform([content1, content2, content3])
print(tfidf.get_feature_names())
print(data.toarray())

2.5 Tf-idf的重要性

分类机器学习算法进行文章分类中前期数据处理方式

3. 特征预处理

3.1 什么是特征预处理

通过 一些转换函数 将特征数据 转换成更加适合算法模型 的特征数据过程
或者
通过 特定统计学方法(数学方法)将 数据 转换成 算法要求的数据

3.2 特征预处理API

数值型数据的缩放包含:
归一化
标准化

sklearn.preprocessing

3.3 归一化

定义:通过对原始数据进行变换把数据映射到(默认为[0,1])之间

在这里插入图片描述

在这里插入图片描述

1)归一化 样例

from sklearn.preprocessing import MinMaxScaler

'''
   默认区间是0,1;
   可通过 feature_range 进行配置
'''
mm = MinMaxScaler(feature_range=(0,1))
data = mm.fit_transform([[90,20,30,10], [60,15,25,78], [78,22,36,90]])
print(data)

2) 归一化目的

使得某一个特征值对最终的结果不会造成更大的影响
在这里插入图片描述

3) 异常数据

注意最大值最小值是变化的,另外,最大值与最小值非常容易受异常点影响,所以这种方法鲁棒性较差,只适合传统精确小数据场景

3.4 标准化

1)标准化定义

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

2) 公式

在这里插入图片描述

对于归一化来说:
如果出现异常点,影响了最大值和最小值,那么结果显然会发生改变
对于标准化来说:
如果出现异常点,由于具有一定数据量,少量的异常点对于平均值的影响并不大,从而方差改变较小

在这里插入图片描述

3)标准化 API

sklearn.preprocessing.StandardScaler

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

StandardScaler.fit_transform(X)
X:numpy array格式的数据[n_samples,n_features]

返回值:转换后的形状相同的array

4) 标准化样例

from sklearn.preprocessing import StandardScaler

std = StandardScaler()
data = std.fit_transform([[90,20,30,10], [60,15,25,78], [78,22,36,90]])
print(data)

5)缺失值

新版本为:

from sklearn.impute import SimpleImputer

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

from sklearn.impute import SimpleImputer
import numpy as np

#缺失值处理
im = SimpleImputer(np.nan, "mean")
data = im.fit_transform([[1,2], [np.nan, 3], [7, 6]])
print(data)

6)标准化总结

在已有样本足够多的情况下比较稳定,适合现代嘈杂大数据场景。

发布了107 篇原创文章 · 获赞 20 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/beishanyingluo/article/details/104719800