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}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值