创建新特征的数据

有时候,仅仅选择已有特征是不够的。我们需要在已有特征基础上创建新的特征。

一个效果好的新创建的特征,可以很有效的降低冗余信息,提高特征之间的相关性。对于算法准确率的提高有很好的促进作用。

接下来,加载一个新的数据集,从http://archive.ics.uci.edu/ml/datasets/Internet+Advertisements下载Advertisements(广告)数据集。保存到自己主目录下的Data文件夹中。下载ad.data和ad.names

接着,用pandas加载数据集。我们还是先指定文件的路径。

import os
import pandas as pd
import numpy as np
data_folder = os.path.join(os.path.expanduser("~"), "Data")
data_filename = os.path.join(data_folder, "Ads", "ad.data")

数据集存在几个问题,加载过程需要我们做些处理。问题一,前几个特征是数值,但是pandas 会把它们当成字符串。要修复这个问题,我们需要编写将字符串转换为数字的函数,该函数能够 把只包含数字的字符串转换为数字,把其余的转化为“NaN” (“Not a Number”,不是一个数字), 表示参数值无法转换为数字。

问题二,数据集中有些值缺失,缺失的值用“?”表示。幸运的是,问号不会被转换为浮点型数据,因此,我们也可以把它们转换为“NaN”。

下面定义函数来解决这两个问题,首先使用try/except结构,捕获ValueError异常(字符串无法转换为数字时,抛出异常)。 如果转换失败,返回numpy库中的“NaN”类型。

def convert_number(x):try:return float(x)except ValueError:return np.nan

创建一个字典存储所有特征及其转换结果,想把所有的特征值转换为浮点型。 把后一列(编号为#1558)的值转化为0或1,该列表示每条数据的类别。在Adult数据集中,我们专门创建了一列表示类别。对于当前实验,导入数据时,顺便把类别这一列各个类别值由字符串转换为数值。也就是对于是广告还是不是广告,我们希望用0和1来表示。1表示是广告,0表示不是广告。

from collections import defaultdict
converters = defaultdict(convert_number)  #{i: convert_number for i in range(1558)}
converters[1558] = lambda x: 1 if x.strip() == "ad." else 0

可以用read_csv加载数据集了,在参数中指定我们刚创建的转换函数。

数据集很大,有1559列,2000多条数据。先来看下前五条数据,在笔记本的新格子中输入并 运行ads[:5]。

ads = pd.read_csv(data_filename, header=None, converters=converters)
ads[:5]

数据集所描述的是网上的图像,目标是确定图像是不是广告。

从数据集表头中无法获知每列数据的含义。你下载的另外两个文件ad.DOCUMENTATION和 ad.names有更多信息。前三 个特征分别指图像的高度、宽度和宽高比。后一列是数据的类别, 1表示是广告,0表示不是广告。

将数据集加载到pandas之后,我们再来抽取用于分类算法的x矩阵和y数组,x矩阵为数据框除去后一列的所有列,y数组包含数据框的后一列,也就是列编号为#1558的列。

#ads = ads.astype(float).dropna()
X = ads.drop(1558, axis=1).values
y = ads[1558]
print(X.shape)
print(y.shape)

主成分分析

主成分分析算法(Principal Component Analysis,PCA)的目的是找到能用较少信息描述数据集的特征组合。它意在发现彼此之间没有相关性、能够描述数据集的特征,确切说这些特征的方差跟整体方差没有多大差距,这样的特征也被称为主成分。这也就意味着,借助这种方法,就能通过更少的特征捕获到数据集的大部分信息。

PCA跟其他转换器用法类似。它只有主成分数量这一个参数。它默认会返回数据集中的所有特征。然而,PCA会对返回结果根据方差大小进行排序,返回的第一个特征方差大,第二个特征方差稍小,以此类推。因此,前几个特征往往就能够解释数据集的大部分信息。

from sklearn.decomposition import PCA
pca = PCA(n_components=5)
Xd = pca.fit_transform(X)
Xd.shape

输出:(2359, 5)

返回的结果Xd矩阵只有五个特征,但是不容小觑,我们看一下每个特征的方差。

np.set_printoptions(precision=3, suppress=True)
pca.explained_variance_ratio_

输出结果为:
array([ 0.854, 0.145, 0.001, 0. , 0. ])
表明第一个特征的方差对数据集总 体方差的贡献率为85.4%。第二个为14.5%。第四个特征方差贡献率不可能高于1‰,后面1553个 特征则更少。

用PCA算法处理数据一个不好的地方在于,得到的主成分往往是其他几个特征的复杂组合, 例如,上述第一个特征就是通过为原始数据集的1558个特征(虽然很多特征值为0)分别乘以不 同权重得到的,前三个特征的权重依次为-0.092、-0.995和-0.024。经过某种组合得到的特征, 如果没有丰富的研究经验,理解起来很困难。

clf = DecisionTreeClassifier(random_state=14)
scores_reduced = cross_val_score(clf, Xd, y, scoring='accuracy')
print("The average score from the reduced dataset is {:.4f}".format(np.mean(scores_reduced)))

输出为:The average score from the reduced dataset is 0.9356。
这是经过PCA处理之后计算出的准确率。

PCA算法的另一个优点是,你可以把抽象难懂的数据集绘制成图形。例如,把PCA返回的前 两个特征做成图形。

# 告诉IPython在当前笔记本作图
%matplotlib inline
from matplotlib import pyplot as plt# 获取数据集中类别的所有取值(只有两个:是广告和不是广告)
classes = set(y)
colors = ['red', 'green']# 用zip函数将这两个列表组合起来,同时遍历
for cur_class, color in zip(classes, colors):# 为属于当前类别的所有个体创建遮罩层mask = (y == cur_class).valuesplt.scatter(Xd[mask,0], Xd[mask,1], marker='o', color=color, label=int(cur_class))
plt.legend()plt.show()

创建自己的特征和转换器相关推荐

  1. R语言dataframe创建新的特征(变量)、行加和特征、行均值特征(基于加减乘除、指数、模数等操作符)、创建新的特征(变量)、生成编码特征(基于比较操作符、逻辑操作符)

    R语言dataframe创建新的特征(变量).行加和特征.行均值特征(基于加减乘除.指数.模数等操作符).为dataframe创建新的特征(变量).生成编码特征(基于比较操作符.逻辑操作符) 目录

  2. 如何创建复杂的机器学习项目?

    翻译 | 光城 责编 | 郭芮 转载自CSDN(CSDNnews) scikit-learn提供最先进的机器学习算法.但是,这些算法不能直接用于原始数据.原始数据需要事先进行预处理.因此,除了机器学习 ...

  3. Python 管道与特征联合

    Python 管道与特征联合 1 声明 本文的数据来自网络,部分代码也有所参照,这里做了注释和延伸,旨在技术交流,如有冒犯之处请联系博主及时处理. 2管道与特征联合简介 Pipeline可以用于把多个 ...

  4. 创建纹理化的CityGML模型

    前言 本示例根据先前示例中使用的interopolis 3DS模型创建了一个简单的纹理化CityGML模型.CityGML是用于表示3D城市和景观的OGC标准化GML应用模式,它具有非常严格的对象类型 ...

  5. 手把手教你用Python实现自动特征工程

    任何参与过机器学习比赛的人,都能深深体会特征工程在构建机器学习模型中的重要性,它决定了你在比赛排行榜中的位置. 特征工程具有强大的潜力,但是手动操作是个缓慢且艰巨的过程.Prateek Joshi,是 ...

  6. SVO: 视觉SLAM中特征点法与直接法结合

    点击上方"小白学视觉",选择加"星标"或"置顶" 重磅干货,第一时间送达 前面的话 VSLAM 是利用多视图几何理论,根据相机拍摄的图像信息 ...

  7. ECCV2020 | 即插即用,涨点明显!FPT:特征金字塔Transformer

    点击上方"3D视觉工坊",选择"星标" 干货第一时间送达 这篇文章收录于ECCV2020,将Transformer机制应用于对特征金字塔FPN的改进上,整体思路 ...

  8. SLAM | 视觉SLAM中特征点法与直接法结合:SVO

    点击上方"3D视觉工坊",选择"星标" 干货第一时间送达 前面的话 VSLAM 是利用多视图几何理论,根据相机拍摄的图像信息对相机进行定位并同时构建周围环境地图 ...

  9. 决策树算法(四)——选取最佳特征划分数据集

    写在前面的话 可怜了我这个系列的博客,写的这么好,花了很多心思去写的,却没有人知道欣赏.就像我这么好也没有人懂得欣赏,哈哈哈,我好不要脸... 如果您有任何地方看不懂的,那一定是我写的不好,请您告诉我 ...

最新文章

  1. package.json字段全解
  2. 地形纹理Splatting技术(翻译)
  3. Linux驱动开发必看详解神秘内核(完全转载)
  4. 使用NGINX作为HTTPS正向代理服务器
  5. mysql8.0与mysql7.0_MySQL 5.7 vs 8.0,哪个性能更牛?
  6. 我的Android进阶之旅------gt;Android Studio 快捷键整理分享
  7. openresty之http
  8. 转载:Python正则表达式
  9. kali安装步骤失败 选择并安装软件_7Zip v19.00 软件安装步骤
  10. 软件测试Homework03
  11. 二进制 八进制 十进制 十六进制
  12. 视频教程:小型登陆系统(完)
  13. opensips(1)——安装opensips详细流程
  14. Spring Security Oauth2 JWT、第三方登录、单点登录讲解,并使用Oauth2.0结合微服务进行单点登录
  15. 数据挖掘:实用案例分析 下载_真经阁丨萌低龄,超实用“萌系”呈现技巧及设计案例分析...
  16. 《Domain Separation Networks》文献翻译
  17. 【Redis】练习题
  18. CentOS7数据库架构之NFS+heartbeat+DRBD(亲测,详解)
  19. 简单的popupwindow提示框
  20. 小程序对火锅店的发展利好及部分可行性内容设计

热门文章

  1. oracle 连接池sql跟踪,实现SQLServer、MySQL和oracle数据库连接池
  2. Unity_UIWidgets学习笔记03_组件_Container
  3. emiya-canvas.js 解决ios下拍照倾斜与canvas高清屏下绘图模糊问题 1
  4. Equinix公司在巴西圣保罗开通了一个数据中心
  5. 复制虚拟机网卡eth0变eth1
  6. AES加密解密算法Java实现
  7. Leetcode 242. 有效的字母异位词 解题思路及C++实现
  8. 华为ax3怎么接光纤sc接口_视频监控工程中使用光纤光缆注意事项有哪些?
  9. 安全管家安卓_pc-cillin和腾讯电脑管家比较哪个更好
  10. 客服人员控制台Console,Salesforce Service Cloud的核心