天天看点

Scikit-learn特征工程之特征抽取

“ 数据,决定了机器学习的上限;而算法,只是尽可能逼近这个上限。”

                    ——这句话很好的阐述了  数据  在机器学习中的重要性。

数据的特征工程

  • 大部分直接拿过来的数据都是特征不明显的、没有经过处理的或者说是存在很多无用的数据,那么需要进行一些特征处理,特征的缩放等等,满足训练数据的要求;
  • 优质的特征往往描述了数据的固有结构;
  • 最初的原始特征数据集可能太大,或者信息冗余,因此在机器学习的应用中,一个初始步骤就是选择特征的子集,或构建一套新的特征集,减少功能来促进算法的学习,提高泛化能力和可解释性;
  • 特征工程的意义:更好的特征意味着

    鲁棒性好(稳定性,抗干扰能力)

    模型简单

    ,可以得到

    更好的结果

1、

数据来源与类型

(1)来源  大部分的数据都来自已有的数据库,如果没有的话也可以交给很多爬虫工程师去采集,来提供。也可以来自平时的记录,反正数据无处不在,大都是可用的。

(2)类型

  • 按照

    机器学习的数据分类

    我们可以将数据分成:

    标称型

    :标称型目标变量的结果只在有限目标集中取值,如真与假(标称型目标变量

    主要用于分类

    );

    数值型

    :数值型目标变量则可以从无限的数值集合中取值,如0.100,42.001等 (数值型目标变量

    主要用于回归分析

    )。
  • 按照

    数据的本身

    分布特性:

    离散型

    连续型

2、

数据的特征抽取

数据多数特征都不是连续变量,比如

分类

文字

图像

等,为了对非连续变量做特征表述,需要对这些特征做数学化表述,因此就用到了

特征抽取

sklearn.feature_extraction

提供了特征提取的很多方法

(a)

分类

特征提取
  • 方法

    fit_transform(X, y)

    应用并转化映射列表X,y为目标类型
  • 方法

    inverse_transform(X, [dict_type])

    将Numpy数组或scipy.sparse矩阵转换为映射列表
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}
           

继续阅读