目录

Scikit-learn与特征工程

数据的特征工程

特征工程的意义

特征工程之特征处理

特征工程之特征抽取与特征选择

数据的来源与类型

数据的类型

数据的特征抽取

分类特征变量提取

方法

文本特征提取(只限于英文)

方法

方法

数据的特征预处理

单个特征

数据的特征选择

sklearn.feature_selection


Scikit-learn与特征工程

“数据决定了机器学习的上限,而算法只是尽可能逼近这个上限”,这句话很好的阐述了数据在机器学习中的重要性。大部分直接拿过来的数据都是特征不明显的、没有经过处理的或者说是存在很多无用的数据,那么需要进行一些特征处理,特征的缩放等等,满足训练数据的要求。

我们将初次接触到Scikit-learn这个机器学习库的使用

Scikit-learn

  • Python语言的机器学习工具
  • 所有人都适用,可在不同的上下文中重用
  • 基于NumPy、SciPy和matplotlib构建
  • 开源、商业可用 - BSD许可
  • 目前稳定版本0.18

自2007年发布以来,scikit-learn已经成为最给力的Python机器学习库(library)了。scikit-learn支持的机器学习算法包括分类,回归,降维和聚类。还有一些特征提取(extracting features)、数据处理(processing data)和模型评估(evaluating models)的模块。作为Scipy库的扩展,scikit-learn也是建立在Python的NumPy和matplotlib库基础之上。NumPy可以让Python支持大量多维矩阵数据的高效操作,matplotlib提供了可视化工具,SciPy带有许多科学计算的模型。     scikit-learn文档完善,容易上手,丰富的API,使其在学术界颇受欢迎。开发者用scikit-learn实验不同的算法,只要几行代码就可以搞定。scikit-learn包括许多知名的机器学习算法的实现,包括LIBSVM和LIBLINEAR。还封装了其他的Python库,如自然语言处理的NLTK库。另外,scikit-learn内置了大量数据集,允许开发者集中于算法设计,节省获取和整理数据集的时间。

安装的话参考下面步骤: 创建一个基于Python3的虚拟环境:

mkvirtualenv -p /usr/local/bin/python3.6 ml3

在ubuntu的虚拟环境当中运行以下命令

pip3 install Scikit-learn

然后通过导入命令查看是否可以使用:

import sklearn

数据的特征工程

从数据中抽取出来的对预测结果有用的信息,通过专业的技巧进行数据处理,是的特征能在机器学习算法中发挥更好的作用。优质的特征往往描述了数据的固有结构。 最初的原始特征数据集可能太大,或者信息冗余,因此在机器学习的应用中,一个初始步骤就是选择特征的子集,或构建一套新的特征集,减少功能来促进算法的学习,提高泛化能力和可解释性。

例如:你要查看不同地域女性的穿衣品牌情况,预测不同地域的穿衣品牌。如果其中含有一些男性的数据,是不是要将这些数据给去除掉

特征工程的意义

  • 更好的特征意味着更强的鲁棒性
  • 更好的特征意味着只需用简单模型
  • 更好的特征意味着更好的结果

特征工程之特征处理

特征工程中最重要的一个环节就是特征处理,特征处理包含了很多具体的专业技巧

  • 特征预处理

    • 单个特征

      • 归一化
      • 标准化
      • 缺失值
    • 多个特征
      • 降维

        • PCA

特征工程之特征抽取与特征选择

如果说特征处理其实就是在对已有的数据进行运算达到我们目标的数据标准。特征抽取则是将任意数据格式(例如文本和图像)转换为机器学习的数字特征。而特征选择是在已有的特征中选择更好的特征。后面会详细介绍特征选择主要区别于降维。

数据的来源与类型

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

数据的类型

按照机器学习的数据分类我们可以将数据分成:

  • 标称型:标称型目标变量的结果只在有限目标集中取值,如真与假(标称型目标变量主要用于分类)
  • 数值型:数值型目标变量则可以从无限的数值集合中取值,如0.100,42.001等 (数值型目标变量主要用于回归分析)

按照数据的本身分布特性

  • 离散型
  • 连续型

那么什么是离散型和连续型数据呢?首先连续型数据是有规律的,离散型数据是没有规律的

  • 离散变量是指其数值只能用自然数或整数单位计算的则为离散变量.例如,班级人数、进球个数、是否是某个类别等等

  • 连续型数据是指在指定区间内可以是任意一个数值,例如,票房数据、花瓣大小分布数据

数据的特征抽取

现实世界中多数特征都不是连续变量,比如分类、文字、图像等,为了对非连续变量做特征表述,需要对这些特征做数学化表述,因此就用到了特征提取. sklearn.feature_extraction提供了特征提取的很多方法

分类特征变量提取

我们将城市和环境作为字典数据,来进行特征的提取。

sklearn.feature_extraction.DictVectorizer(sparse = True)

将映射列表转换为Numpy数组或scipy.sparse矩阵

  • sparse 是否转换为scipy.sparse矩阵表示,默认开启

方法

fit_transform(X,y)

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

inverse_transform(X[, dict_type])

将Numpy数组或scipy.sparse矩阵转换为映射列表

from sklearn.feature_extraction import DictVectorizer
onehot = DictVectorizer() # 如果结果不用toarray,请开启sparse=False
instances = [{'city': '北京','temperature':100},{'city': '上海','temperature':60}, {'city': '深圳','temperature':30}]
X = onehot.fit_transform(instances).toarray()
print(onehot.inverse_transform(X))

文本特征提取(只限于英文)

文本的特征提取应用于很多方面,比如说文档分类、垃圾邮件分类和新闻分类。那么文本分类是通过词是否存在、以及词的概率(重要性)来表示。

(1)文档的中词的出现

数值为1表示词表中的这个词出现,为0表示未出现

sklearn.feature_extraction.text.CountVectorizer()

将文本文档的集合转换为计数矩阵(scipy.sparse matrices)

方法

fit_transform(raw_documents,y)

学习词汇词典并返回词汇文档矩阵

from sklearn.feature_extraction.text import CountVectorizer
content = ["life is short,i like python","life is too long,i dislike python"]
vectorizer = CountVectorizer()
print(vectorizer.fit_transform(content).toarray())

需要toarray()方法转变为numpy的数组形式

温馨提示:每个文档中的词,只是整个语料库中所有词,的很小的一部分,这样造成特征向量的稀疏性(很多值为0)为了解决存储和运算速度的问题,使用Python的scipy.sparse矩阵结构

(2)TF-IDF表示词的重要性

TfidfVectorizer会根据指定的公式将文档中的词转换为概率表示。(朴素贝叶斯介绍详细的用法)

class sklearn.feature_extraction.text.TfidfVectorizer()

方法

fit_transform(raw_documents,y)

学习词汇和idf,返回术语文档矩阵。

from sklearn.feature_extraction.text import TfidfVectorizer
content = ["life is short,i like python","life is too long,i dislike python"]
vectorizer = TfidfVectorizer(stop_words='english')
print(vectorizer.fit_transform(content).toarray())
print(vectorizer.vocabulary_)

数据的特征预处理

单个特征

(1)归一化

归一化首先在特征(维度)非常多的时候,可以防止某一维或某几维对数据影响过大,也是为了把不同来源的数据统一到一个参考区间下,这样比较起来才有意义,其次可以程序可以运行更快。 例如:一个人的身高和体重两个特征,假如体重50kg,身高175cm,由于两个单位不一样,数值大小不一样。如果比较两个人的体型差距时,那么身高的影响结果会比较大,k-临近算法会有这个距离公式。

min-max方法

常用的方法是通过对原始数据进行线性变换把数据映射到[0,1]之间,变换的函数为:

X^{'}{=}\frac{x-min}{max-min}X​​′​​​​=​max−min​​x−min​​

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

  • min-max自定义处理

这里我们使用相亲约会对象数据在MatchData.txt,这个样本时男士的数据,三个特征,玩游戏所消耗时间的百分比、每年获得的飞行常客里程数、每周消费的冰淇淋公升数。然后有一个 所属类别,被女士评价的三个类别,不喜欢、魅力一般、极具魅力。 首先导入数据进行矩阵转换处理

import numpy as npdef data_matrix(file_name):"""将文本转化为matrix:param file_name: 文件名:return: 数据矩阵"""fr = open(file_name)array_lines = fr.readlines()number_lines = len(array_lines)return_mat = zeros((number_lines, 3))# classLabelVector = []index = 0for line in array_lines:line = line.strip()list_line = line.split('\t')return_mat[index,:] = list_line[0:3]# if(listFromLine[-1].isdigit()):#     classLabelVector.append(int(listFromLine[-1]))# else:#     classLabelVector.append(love_dictionary.get(listFromLine[-1]))# index += 1return return_mat

输出结果为

[[  4.09200000e+04   8.32697600e+00   9.53952000e-01][  1.44880000e+04   7.15346900e+00   1.67390400e+00][  2.60520000e+04   1.44187100e+00   8.05124000e-01]...,[  2.65750000e+04   1.06501020e+01   8.66627000e-01][  4.81110000e+04   9.13452800e+00   7.28045000e-01][  4.37570000e+04   7.88260100e+00   1.33244600e+00]]

我们查看数据集会发现,有的数值大到几万,有的才个位数,同样如果计算两个样本之间的距离时,其中一个影响会特别大。也就是说飞行里程数对于结算结果或者说相亲结果影响较大,但是统计的人觉得这三个特征同等重要,所以需要将数据进行这样的处理。

这样每个特征任意的范围将变成[0,1]的区间内的值,或者也可以根据需求处理到[-1,1]之间,我们再定义一个函数,进行这样的转换。

def feature_normal(data_set):"""特征归一化:param data_set::return:"""# 每列最小值min_vals = data_set.min(0)# 每列最大值max_vals = data_set.max(0)ranges = max_vals - min_valsnorm_data = np.zeros(np.shape(data_set))# 得出行数m = data_set.shape[0]# 矩阵相减norm_data = data_set - np.tile(min_vals, (m,1))# 矩阵相除norm_data = norm_data/np.tile(ranges, (m, 1)))return norm_data

输出结果为

[[ 0.44832535  0.39805139  0.56233353][ 0.15873259  0.34195467  0.98724416][ 0.28542943  0.06892523  0.47449629]...,[ 0.29115949  0.50910294  0.51079493][ 0.52711097  0.43665451  0.4290048 ][ 0.47940793  0.3768091   0.78571804]]

这样得出的结果都非常相近,这样的数据可以直接提供测试验证了

  • min-max的scikit-learn处理

scikit-learn.preprocessing中的类MinMaxScaler,将数据矩阵缩放到[0,1]之间

>>> X_train = np.array([[ 1., -1.,  2.],
...                     [ 2.,  0.,  0.],
...                     [ 0.,  1., -1.]])
...
>>> min_max_scaler = preprocessing.MinMaxScaler()
>>> X_train_minmax = min_max_scaler.fit_transform(X_train)
>>> X_train_minmax
array([[ 0.5       ,  0.        ,  1.        ],[ 1.        ,  0.5       ,  0.33333333],[ 0.        ,  1.        ,  0.        ]])

(3)标准化

常用的方法是z-score标准化,经过处理后的数据均值为0,标准差为1,处理方法是:

X^{'}{=}\frac{x-\mu}{\sigma}X​​′​​​​=​σ​​x−μ​​

其中\muμ是样本的均值,\sigmaσ是样本的标准差,它们可以通过现有的样本进行估计,在已有的样本足够多的情况下比较稳定,适合嘈杂的数据场景

sklearn中提供了StandardScalar类实现列标准化:

In [2]: import numpy as npIn [3]: X_train = np.array([[ 1., -1.,  2.],[ 2.,  0.,  0.],[ 0.,  1., -1.]])In [4]: from sklearn.preprocessing import StandardScalerIn [5]: std = StandardScaler()In [6]: X_train_std = std.fit_transform(X_train)In [7]: X_train_std
Out[7]:
array([[ 0.        , -1.22474487,  1.33630621],[ 1.22474487,  0.        , -0.26726124],[-1.22474487,  1.22474487, -1.06904497]])

(3)缺失值

由于各种原因,许多现实世界的数据集包含缺少的值,通常编码为空白,NaN或其他占位符。然而,这样的数据集与scikit的分类器不兼容,它们假设数组中的所有值都是数字,并且都具有和保持含义。使用不完整数据集的基本策略是丢弃包含缺失值的整个行和/或列。然而,这是以丢失可能是有价值的数据(即使不完整)的代价。更好的策略是估算缺失值,即从已知部分的数据中推断它们。

(1)填充缺失值 使用sklearn.preprocessing中的Imputer类进行数据的填充

class Imputer(sklearn.base.BaseEstimator, sklearn.base.TransformerMixin)"""用于完成缺失值的补充:param param missing_values: integer or "NaN", optional (default="NaN")丢失值的占位符,对于编码为np.nan的缺失值,使用字符串值“NaN”:param strategy: string, optional (default="mean")插补策略如果是“平均值”,则使用沿轴的平均值替换缺失值如果为“中位数”,则使用沿轴的中位数替换缺失值如果“most_frequent”,则使用沿轴最频繁的值替换缺失:param axis: integer, optional (default=0)插补的轴如果axis = 0,则沿列排列如果axis = 1,则沿行排列"""
>>> import numpy as np
>>> from sklearn.preprocessing import Imputer
>>> imp = Imputer(missing_values='NaN', strategy='mean', axis=0)
>>> imp.fit([[1, 2], [np.nan, 3], [7, 6]])
Imputer(axis=0, copy=True, missing_values='NaN', strategy='mean', verbose=0)
>>> X = [[np.nan, 2], [6, np.nan], [7, 6]]
>>> print(imp.transform(X))
[[ 4.          2.        ][ 6.          3.666...][ 7.          6.        ]]

多个特征

降维

PCA(Principal component analysis),主成分分析。特点是保存数据集中对方差影响最大的那些特征,PCA极其容易受到数据中特征范围影响,所以在运用PCA前一定要做特征标准化,这样才能保证每维度特征的重要性等同。

sklearn.decomposition.PCA

class PCA(sklearn.decomposition.base)"""主成成分分析:param n_components: int, float, None or string这个参数可以帮我们指定希望PCA降维后的特征维度数目。最常用的做法是直接指定降维到的维度数目,此时n_components是一个大于1的整数。我们也可以用默认值,即不输入n_components,此时n_components=min(样本数,特征数):param whiten: bool, optional (default False)判断是否进行白化。所谓白化,就是对降维后的数据的每个特征进行归一化。对于PCA降维本身来说一般不需要白化,如果你PCA降维后有后续的数据处理动作,可以考虑白化,默认值是False,即不进行白化:param svd_solver:选择一个合适的SVD算法来降维,一般来说,使用默认值就够了。"""

通过一个例子来看

>>> import numpy as np
>>> from sklearn.decomposition import PCA
>>> X = np.array([[-1, -1], [-2, -1], [-3, -2], [1, 1], [2, 1], [3, 2]])
>>> pca = PCA(n_components=2)
>>> pca.fit(X)
PCA(copy=True, iterated_power='auto', n_components=2, random_state=None,svd_solver='auto', tol=0.0, whiten=False)
>>> print(pca.explained_variance_ratio_)
[ 0.99244...  0.00755...]

数据的特征选择

降维本质上是从一个维度空间映射到另一个维度空间,特征的多少别没有减少,当然在映射的过程中特征值也会相应的变化。举个例子,现在的特征是1000维,我们想要把它降到500维。降维的过程就是找个一个从1000维映射到500维的映射关系。原始数据中的1000个特征,每一个都对应着降维后的500维空间中的一个值。假设原始特征中有个特征的值是9,那么降维后对应的值可能是3。而对于特征选择来说,有很多方法:

  • Filter(过滤式):VarianceThreshold
  • Embedded(嵌入式):正则化、决策树
  • Wrapper(包裹式)

其中过滤式的特征选择后,数据本身不变,而数据的维度减少。而嵌入式的特征选择方法也会改变数据的值,维度也改变。Embedded方式是一种自动学习的特征选择方法,后面讲到具体的方法的时候就能理解了。

特征选择主要有两个功能:

(1)减少特征数量,降维,使模型泛化能力更强,减少过拟合

(2)增强特征和特征值之间的理解

sklearn.feature_selection

去掉取值变化小的特征(删除低方差特征)

VarianceThreshold 是特征选择中的一项基本方法。它会移除所有方差不满足阈值的特征。默认设置下,它将移除所有方差为0的特征,即那些在所有样本中数值完全相同的特征。

假设我们要移除那些超过80%的数据都为1或0的特征

from sklearn.feature_selection import VarianceThreshold
X = [[0, 0, 1], [0, 1, 0], [1, 0, 0], [0, 1, 1], [0, 1, 0], [0, 1, 1]]
sel = VarianceThreshold(threshold=(.8 * (1 - .8)))
sel.fit_transform(X)
array([[0, 1],[1, 0],[0, 0],[1, 1],[1, 0],[1, 1]])

传智播客 机器学习和深度学习之 Scikit-learn与特征工程 学习笔记相关推荐

  1. 传智播客免费IT学习资源站-视频库隆重上线

    为优化学员对传智播客官网"视频下载"频道的使用体验,方便学员更及时.便捷.精准地获取高质量.更前沿的教学视频资源,加强自学效果,巩固课堂知识,传智播客将原"视频下载&qu ...

  2. 来传智播客学到的第一天

    第一天上课咱们传智播客给我的感觉很好,让我感觉到了学习的气氛是那么的好,同学之间就和兄弟姐妹一样,尤其是班主任,对我们的关怀是无微不至的 对我们非常负责任,心里是那么的暖,早上早早的就到教室了,看有没 ...

  3. html5复合选择器,传智播客解读Css基本选择器与复合选择器

    当使用css对HTML页面中的元素实现一对一,一对多或者多对一的控制时,我们经常会用到CSS选择器.为了方便初学者对选择器有所了解,传智播客将对选择器的几种类别进行详细介绍和说明. 一. Css基本选 ...

  4. 成都传智播客php培训课程介绍

    2014年7月,传智播客php学科将落户成都,即日起至7月25日,凡报名成都传智播客首期php就业班的学员,可以免费学习基础班,就业班学费在原价基础班再减2000元,没有比这个更优惠的了! Php基础 ...

  5. 传智播客强势进入php领域

    随着移动互联网的兴起,中国互联网行业进入了高速发展的势态,成熟的PHP互联网开发语言被全球知名网站(如:新浪.百度.腾讯.TOM等)广泛用于网站前端开发.当前,互联网行业正向更加智能化的Web3.0时 ...

  6. Ubuntu16.04 ROS 深度学习_传智播客 智能机器人软件开发 学习路线图出炉!首发优惠!!...

    黑马程序员 微信号:heiniu526 传智播客旗下互联网资讯,学习资源免费分享平台 智能机器人软件工程师学习计划 很多朋友对机器人软件开发和人工智能感兴趣,不知道怎么学习,传智播客武汉校区在今年3月 ...

  7. php 传智播客 学习内容

    第一阶段:(PHP+MySQL核心编程) 课程名称 阶段课程 课程内容 学习目标 PHP+MySQL核心编程(21天) PHP基本语法加强 Apache--directory配置段 一个IP和多个域名 ...

  8. java就业班学什么呀_传智播客JAVA就业班学习心得

    传智播客JAVA就业班学习心得 4月26日CVS---4月27日UML 连续两天状态很是不好,上课总是不能够集中精神.不知为什么听这两天课的时候精神很涣散,也不知道自己在想什么,一整天的课,似听非听的 ...

  9. 武汉校区南非“留学生”:来传智播客学习是“独特的机会”

    随着社会的飞速发展.进步,国家对于"高精尖"IT技术开发人才的需求也愈加旺盛. 肩负"为莘莘学子改变命运而讲课,为万千学生少走弯路而著书"使命的传智播客,在IT ...

  10. 感谢传智播客+C#.Net学习之旅

    <C#.Net基础学习视频2014版>在本月中旬左右终于学习完了,终于学完了.                 自2015年暑期7月份开始学习C#.Net基础学习视频以来,直到本月才学习完 ...

最新文章

  1. 你会利用css写下拉列表框吗?
  2. WCF常见问题及解决方案
  3. 另一种无法enable ABAP source code tool的原因
  4. vue-i18n使用及踩坑记录
  5. php sql获取字段名称,mssql获取字段名及注释,以及一系列问题
  6. JavaScript 中的函数式编程实践
  7. Java面试锦囊送给你!大厂门槛随便跨!
  8. php mysql 类型_php mysql bigint 类型
  9. Mybatis_3.基于注解的增删改查
  10. 【Mybatis架构】Mapper映射文件中的#{}与${}
  11. Mat转QImage
  12. Scrapy入门案例,抓取美剧天堂的前100最新
  13. QNX Hypervisor —— 虚拟设备
  14. 点亮显示屏的几个重要步骤
  15. 抓取2021百科知识竞赛题库和答案
  16. 【Windows】realtek声卡升级驱动后没声音
  17. 【RDMA】RDMA网卡通讯
  18. Serdes系列总结——Xilinx serdes IP使用(一)——3G serdes
  19. 致远项目管理SPM系统之项目立项审批
  20. 数据分析初回-探索性数据分析

热门文章

  1. 管理感悟:忙的真正含义是没心思
  2. vscode安卓html扩展,vscode扩展信息.html
  3. 交互式电子杂志_电子杂志形式与交互问题分析
  4. java 数字任意三个数_求Java编程个猜数字游戏!任意输入个数根据提示大了或小了直到选对...
  5. csgo降低延迟指令_ILP——指令级并行
  6. 请简要概括linux与windows在文件系统方面存在的不同点,简要回答下列与网络操作系统、网络安全和数据存储相关的问题,将解答填入答题纸对应栏内。br 【问题1】(10分)br (a)Win...
  7. c oracle案例,Oracle 19c CRS重启案例记录
  8. [转]find命令之exec
  9. ThinkPHP/---微信支付PC流程
  10. 参考官方mysql自定义一个mysql sink connector