“ 数据,决定了机器学习的上限;而算法,只是尽可能逼近这个上限。”
——这句话很好的阐述了 数据 在机器学习中的重要性。
数据的特征工程
- 大部分直接拿过来的数据都是特征不明显的、没有经过处理的或者说是存在很多无用的数据,那么需要进行一些特征处理,特征的缩放等等,满足训练数据的要求;
- 优质的特征往往描述了数据的固有结构;
- 最初的原始特征数据集可能太大,或者信息冗余,因此在机器学习的应用中,一个初始步骤就是选择特征的子集,或构建一套新的特征集,减少功能来促进算法的学习,提高泛化能力和可解释性;
- 特征工程的意义:更好的特征意味着
,鲁棒性好(稳定性,抗干扰能力)
,可以得到模型简单
。更好的结果
1、 数据来源与类型
数据来源与类型
(1)来源 大部分的数据都来自已有的数据库,如果没有的话也可以交给很多爬虫工程师去采集,来提供。也可以来自平时的记录,反正数据无处不在,大都是可用的。
(2)类型
- 按照
我们可以将数据分成:机器学习的数据分类
:标称型目标变量的结果只在有限目标集中取值,如真与假(标称型目标变量标称型
);主要用于分类
:数值型目标变量则可以从无限的数值集合中取值,如0.100,42.001等 (数值型目标变量数值型
)。主要用于回归分析
- 按照
分布特性:数据的本身
、离散型
。连续型
2、 数据的特征抽取
数据的特征抽取
数据多数特征都不是连续变量,比如
分类
、
文字
、
图像
等,为了对非连续变量做特征表述,需要对这些特征做数学化表述,因此就用到了
特征抽取
。
sklearn.feature_extraction
提供了特征提取的很多方法
(a) 分类
特征提取
分类
- 方法
应用并转化映射列表X,y为目标类型fit_transform(X, y)
- 方法
将Numpy数组或scipy.sparse矩阵转换为映射列表inverse_transform(X, [dict_type])
from sklearn.feature_extraction import DictVectorizer
onehot = DictVectorizer(sparse=True) # sparse = True转换为sparse矩阵,默认开启
instances = [{'city': '北京','temperature':100},
{'city': '上海','temperature':60},
{'city': '深圳','temperature':30}]
X = onehot.fit_transform(instances).toarray() # toarray()将sparse矩阵转换为Numpy数组
print(onehot.inverse_transform(X)) # 返回转换之前数据格式
print(onehot.get_feature_names()) # 返回特征名称
print(X, type(X))
# ===运行结果:================================================================
[{'city=北京': 1.0, 'temperature': 100.0}, {'city=上海': 1.0, 'temperature': 60.0}, {'temperature': 30.0, 'city=深圳': 1.0}]
['city=上海', 'city=北京', 'city=深圳', 'temperature']
[[ 0. 1. 0. 100.]
[ 1. 0. 0. 60.]
[ 0. 0. 1. 30.]] <class 'numpy.ndarray'>
onehot = DictVectorizer() # sparse=True默认开启
instances = [{'city': '北京','temperature':100},
{'city': '上海','temperature':60},
{'city': '深圳','temperature':30}]
X = onehot.fit_transform(instances)
print(onehot.get_feature_names())
print(X, type(X))
# ===运行结果:================================================================
['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'>
onehot = DictVectorizer(sparse=False)
instances = [{'city': '北京','temperature':100},
{'city': '上海','temperature':60},
{'city': '深圳','temperature':30}]
X = onehot.fit_transform(instances)
print(onehot.get_feature_names())
print(X, type(X))
# ===运行结果:================================================================
['city=上海', 'city=北京', 'city=深圳', 'temperature']
[[ 0. 1. 0. 100.]
[ 1. 0. 0. 60.]
[ 0. 0. 1. 30.]] <class 'numpy.ndarray'>
(b) 文本
特征抽取
文本
- 文本分类是通过词是否存在、以及词的概率(重要性)来表示
from sklearn.feature_extraction.text import CountVectorizer
content = ["life is short,i like python","python is such easy,i like python"]
vectorizer = CountVectorizer()
X= vectorizer.fit_transform(content).toarray()
print(vectorizer.get_feature_names())
print(X, type(X))
# ===运行结果:================================================================
['easy', 'is', 'life', 'like', 'python', 'short', 'such']
[[0 1 1 1 1 1 0]
[1 1 0 1 2 0 1]] <class 'numpy.ndarray'>
- TF-IDF表示词的重要性,TfidfVectorizer会根据指定的公式将文档中的词转换为概率表示
from sklearn.feature_extraction.text import TfidfVectorizer
content = ["life is short,i like python","python is such easy,i like python"]
vectorizer = TfidfVectorizer(stop_words='english')
X= vectorizer.fit_transform(content).toarray()
print(vectorizer.get_feature_names())
print(X, type(X))
print(vectorizer.vocabulary_)
# ===运行结果:================================================================
['easy', 'life', 'like', 'python', 'short']
[[0. 0.57615236 0.40993715 0.40993715 0.57615236]
[0.53215436 0. 0.37863221 0.75726441 0. ]] <class 'numpy.ndarray'>
{'python': 3, 'life': 1, 'short': 4, 'like': 2, 'easy': 0}