特征工程
-
特征抽取
-
数据特征的预处理
-
特征选择
-
为什么需要特征工程
- 样本数据中的特征有可能会出现缺失值、重复值、异常值等,那么我们需要对特征中的噪点数据进行处理,处理的目的就是为了得到更加纯净的样本集,让模型基于这组数据可以有更好的预测能力。
-
什么是特征工程?
- 特征工程就是将原始数据转换为更好的代表预测模型的潜在问题的特征的过程,从而提高对未知数据预测的准确性:
- 比如如果AlphaGO学习的数据中既有棋谱,又有食谱,还有歌词,那么这些干扰的数据肯定会影响AlphaGo的学习。
- 特征工程就是将原始数据转换为更好的代表预测模型的潜在问题的特征的过程,从而提高对未知数据预测的准确性:
-
特征工程的意义:
- 特征工程会直接影响模型预测的结果
-
如何实现特征工程:
- 工具:sklearn
-
sklearn介绍
- Python中机器学习工具,包含了很多机器学习算法的实现;
- 功能:
- 分类模型
- 回归模型
- 聚类模型
- 特征工程
特征抽取
-
目的:
- 我们所采集到样本的特征数据很多时候为字符串或者其他类型的数据,我们知道电脑只可以识别二进制数值型的数据。所以,如果不是数值型的数据,机器学习苏算法是识别不了的。
-
效果演示:
- 将字符串转换成数字
from sklearn.feature_extraction.text import CountVectorizer
vector= CountVectorizer()
res= vector.fit_transform(['lift is short, i love python', 'I love Python'])
print(res.toarray())
[[1 1 1 1 1]
[0 0 1 1 0]]
-
演示后的结论:
- 特征抽取对文本等数据进行特征值化,特征值化是为了让机器更好的理解数据。
-
字典特征抽取
- 对字典数据进行特征值化
- API: from sklearn.feature_extraction import DictVectorizer
- fit_transform(X): X为自带奶或者包含字典的迭代器,返回值为sparse矩阵
- inverse_transform(X): X为sparse矩阵呢个或者array数组,返回值为转换之前的数据格式
- transform(X): 按照原先的标准进行转换
- get_feature_names(): 返回转换类别名称
from sklearn.feature_extraction import DictVectorizer
alist= [
{
'city': 'Beijing', 'temp': 12},
{
'city': 'Chengdu', 'temp': 11},
{
'city': 'Chongqin', 'temp': 34}
]
# 实例化一个工具类对象
d= DictVectorizer()
# 返回的是一个sparse矩阵(存储的是特征值化之后的结果)
feature= d.fit_transform(alist)
print(feature)
(0, 0) 1.0
(0, 3) 12.0
(1, 1) 1.0
(1, 3) 11.0
(2, 2) 1.0
(2, 3) 34.0
- 什么是sparse矩阵,如何理解?
- 在DictVectorizer类构造的方法中设定
sparse=False
则返回的就不是sparse矩阵,而是一个array数组;- get_feature_names():返回类别名称
- sparse矩阵就是一个变相的数组或者李彪,目的是为了节省内存;
- 对比下面的onehot编码,(0,0) 1.0 表示 0 行 0 列 的值为 1.0 ; (1,1) 1.0表示 1行1列的值为1.0;
- 在DictVectorizer类构造的方法中设定
from sklearn.feature_extraction import DictVectorizer
alist= [
{
'city': 'Beijing', 'temp': 12},
{
'city': 'Chengdu', 'temp': 11},
{
'city': 'Chongqin', 'temp': 34}
]
# 实例化一个工具类对象
d= DictVectorizer(sparse= False) # sparse= False
# 返回的是一个sparse矩阵(存储的是特征值化之后的结果)
feature= d.fit_transform(alist)
print(d.get_feature_names())
print(feature)
['city=Beijing', 'city=Chengdu', 'city=Chongqin', 'temp']
[[ 1. 0. 0. 12.]
[ 0. 1. 0. 11.]
[ 0. 0. 1. 34.]]
-
one-hot编码
- sparse矩阵中的
0
和1
就是onehot编码
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-3W0CQxLE-1628110524140)(attachment:image.png)]
- sparse矩阵中的
-
为什么需要onehot编码呢?
- 特征抽取主要目的就是对非数值型数据进行特征值化! 如果现在需要对下图中的human和alien进行手动特征值化为4, human为1.则1和4有没有优先级或者权重大小呢?
Sample | Category | Numerical |
---|---|---|
1 | Human | 1 |
2 | Human | 1 |
3 | Penguin | 2 |
4 | Octopus | 3 |
5 | Alien | 4 |
- 则需要对其进行One-Hot编码:
Human | Panguln | Octopus | Alien |
---|---|---|---|
1 | 0 | 0 | 0 |
1 | 0 | 0 | 0 |
0 | 1 | 0 | 0 |
0 | 0 | 1 | 0 |
- 基于pandas实现one-hot编码:
- pd.get_dummies(df[‘col’])
import pandas as pd
df