数据科学流程之创建新特征

当特征和目标变量不是很相关时,可以修改输入的数据集,应用线性,非线性变换(或者其他相似方法)来提高系统的精度。

- 数据是“死”的,人的思维是“活”的。

- 数据科学家负责改变数据集和输入数据,使数据更好的符合分类模型。

基本方法:
A. 特征的线性修正

B. 特征的非线性修正

K近邻方法(K-Nearset neighbors,KNN)

K近邻算法思路:

  在特征空间中,如果一个样本附近的k个最近(即特征空间中最邻近)样本的大多数属于某一个类别,则该样本也属于这个类别。

K邻近算法步骤:

  在分类过程中仅需要在训练集中寻找最近(基于欧氏距离或其他的距离度量)的前K个样本,然后在这K个最相似样本中出现最多的目标标号就被选为分类标号。

参数:

邻近数目K;

估计相似度的度量(常用的是欧氏距离,L2距离)。

A 特征线性修正

例:加利福尼亚州的房价数据集(california_housing)分析

目标变量是房子价格(实数)——回归问题

注:

回归问题是连续型数据,分类问题是离散性数据

(1) 从sklearn工具包中加载数据——Python命令直接加载

In[1]:1 import numpy as np
2 from sklearn.datasets import fetch_california_housing
3 housing = fetch_california_housing()
4 housing
Out[1]:{‘data‘: array([[   8.3252    ,   41.        ,    6.98412698, ...,    2.55555556,
           37.88      , -122.23      ],
        [   8.3014    ,   21.        ,    6.23813708, ...,    2.10984183,
           37.86      , -122.22      ],
        [   7.2574    ,   52.        ,    8.28813559, ...,    2.80225989,
           37.85      , -122.24      ],
        ...,
        [   1.7       ,   17.        ,    5.20554273, ...,    2.3256351 ,
           39.43      , -121.22      ],
        [   1.8672    ,   18.        ,    5.32951289, ...,    2.12320917,
           39.43      , -121.32      ],
        [   2.3886    ,   16.        ,    5.25471698, ...,    2.61698113,
           39.37      , -121.24      ]]),
 ‘target‘: array([4.526, 3.585, 3.521, ..., 0.923, 0.847, 0.894]),
 ‘feature_names‘: [‘MedInc‘,
  ‘HouseAge‘,
  ‘AveRooms‘,
  ‘AveBedrms‘,
  ‘Population‘,
  ‘AveOccup‘,
  ‘Latitude‘,
  ‘Longitude‘],
 ‘DESCR‘: ‘.. _california_housing_dataset:\n\nCalifornia Housing dataset\n--------------------------\n\n**Data Set Characteristics:**\n\n    :Number of Instances: 20640\n\n    :Number of Attributes: 8 numeric, predictive attributes and the target\n\n    :Attribute Information:\n        - MedInc        median income in block\n        - HouseAge      median house age in block\n        - AveRooms      average number of rooms\n        - AveBedrms     average number of bedrooms\n        - Population    block population\n        - AveOccup      average house occupancy\n        - Latitude      house block latitude\n        - Longitude     house block longitude\n\n    :Missing Attribute Values: None\n\nThis dataset was obtained from the StatLib repository.\nhttp://lib.stat.cmu.edu/datasets/\n\nThe target variable is the median house value for California districts.\n\nThis dataset was derived from the 1990 U.S. census, using one row per census\nblock group. A block group is the smallest geographical unit for which the U.S.\nCensus Bureau publishes sample data (a block group typically has a population\nof 600 to 3,000 people).\n\nIt can be downloaded/loaded using the\n:func:`sklearn.datasets.fetch_california_housing` function.\n\n.. topic:: References\n\n    - Pace, R. Kelley and Ronald Barry, Sparse Spatial Autoregressions,\n      Statistics and Probability Letters, 33 (1997) 291-297\n‘}

这里的‘feature_name‘是特征名,有房龄,人均面积,人均房间数,人均卧室数,能容纳多少人等等信息;‘data‘是二维数组(特征数据数组),包含了每个房子的具体信息,如房甲可以容纳3人,20平,20年等;‘target‘是一维数组(目标数组或标签数组),包含了房子的价格。

1 X=housing[‘data‘]
2 Y=housing[‘target‘]
1 #将原始数据按照比例分割为“测试集”和“训练集”
2 from sklearn.model_selection import train_test_split
3 X_train, X_test, Y_train, Y_test = train_test_split(X,Y,train_size=0.8)

(2-1)计算均方误差

  均方差(Mean Squared Error,MSE)是参数估计值与真实值之差的平方的期望值。MSE的值越小,说明预测模型描述实验数据的准确度更好。

   

1 from sklearn.neighbors import KNeighborsRegressor
2 from sklearn.metrics import mean_squared_error
3 regressor = KNeighborsRegressor()#建立一个K邻近模型
4 regressor.fit(X_train,Y_train)#将训练集的两部分进行拟合(建模)
5 Y_est = regressor.predict(X_test)#对测试集预测得到Y_est
6 print("MSE=",mean_squared_error(Y_test, Y_est))#利用均方误差将观察结果和预测结果进行模型评估
MSE= 1.1570134432841734
注:每次运行可能获得的MSE值都不一样,因为将原始数据进行分割时,虽然是按照比例2:8分割;但是是随机分割,每次分到的数据值都有所不同。

注:MAE和MSE的区别

平均绝对误差(Mean Absolute Error,MAE)是所有单个观测值与算术平均值的偏差的绝对值的平均。



1 from sklearn.metrics import mean_absolute_error
2 print("MAE=",mean_absolute_error(Y_test,Y_est))
MAE= 0.8234513512596899

(2-2)计算均方误差——Z-scores标准化

  Z-scores标准化是将特征映射为均值为0,标准差为1的新特征,使原始数据转换为无量纲化值,即各指标值都处于同一数量级别(均值为0,标准差为1的级别)。也就是求每一列的均值,然后用原始数据减去均值再除以方差。

1 from sklearn.preprocessing import StandardScaler#标准化
2 scaler = StandardScaler()
3 X_train_scaled = scaler.fit_transform(X_train)#先拟合数据,再把其转换成标准形式(也就是为了得到特征值的均值和方差,即转换规则)
4 X_test_scaled = scaler.transform(X_test)#把测试数据标准化(因为上一步已经拟合过建好了模型,就不需要再次拟合了,直接标准化就行了)
5 regressor = KNeighborsRegressor()#K邻近模型
6 regressor.fit(X_train_scaled,Y_train)#把标准化之后的新特征和Y_train进行拟合
7 Y_est = regressor.predict(X_test_scaled)#对标准化的测试特征值预测
8 print("MSE",mean_squared_error(Y_test,Y_est))
MSE 0.4485372399520397

第一步:导入sklearn包;

第二步:实例化出一个scaler;

第三步:利用.fit_transform(trainData)先拟合数据,得到均值和方差,再转换为标准形式;(抽象理解为X轴上是数据,Y轴上是标准化后(均值为0方差为1)的数据)

第四步:利用.transform(testData)把测试数据标准化;

第五步:实例化K邻近模型;

第六步:利用K邻近模型里的.fit()函数拟合标准化数据和训练集的标签数据;

第七步:利用模型.predict()函数对标准化测试集进行预测;

第八步:计算观测值和预测值的均方误差。

标准化之后,均方差值减小一半。

注:Z-scores标准化属于线性变换。

(2-3)计算均方误差——鲁棒性缩放

  鲁棒性缩放(RobustScaler)采用中位数和IQR对每个特征进行单独缩放。IQR:第一个和第三个四分位数。

  由于数据读入缺失,传输错误或传感器损坏等原因,如果有一个或一些点远离中心,这些异常数据对均值和方差的影响较大,但对中位数和四分位数影响不大,因此鲁棒缩放对于异常值更



1 from sklearn.preprocessing import RobustScaler
2 scaler2 = RobustScaler()
3 X_train_scaled = scaler2.fit_transform(X_train)
4 X_test_scaled = scaler2.transform(X_test)
5 regressor = KNeighborsRegressor()
6 regressor.fit(X_train_scaled,Y_train)
7 Y_est = regressor.predict(X_test_scaled)
8 print("MSE=",mean_squared_error(Y_test,Y_est))
MSE= 0.44666046843260077

注:鲁棒缩放属于线性变换。

- 通过比较标准化的MSE和鲁棒缩放的MSE可以判断该数据集内异常数据多少。假如标准化MSE>鲁棒缩放MSE就可以得出该数据集异常数据较多的结论,反之相反。

B 特征非线性修正

  假定输出结果与房屋居住人数大致相关(但不是线性相关):

  - 事实上,房屋是1个人住还是3个人住,其价格会有很大区别。

  - 然而,同样的房子10个人居住和12个人居住,其价格差别并不是很大(尽管仍然是两个人的差别)

我们可以将房屋利用率的平方根作为新特征

平方根特点:当数据比较小的时候,变化比较大;当数据比较大的时候,变化比较小。

 1 non_linear_feat = 5 #AvgOccup平均占用率是第六个特征。索引从0开始。
 2 X_train_new_feat = np.sqrt(X_train[:,non_linear_feat])#将训练集第6列整个取出求平方根
 3 X_train_new_feat.shape = (X_train_new_feat.shape[0],1)#将行数,列数存入
 4 X_train_extended = np.hstack([X_train,X_train_new_feat])#堆栈数组水平顺序(列),将新特征列存入数据集
 5 X_test_new_feat = np.sqrt(X_test[:,non_linear_feat])
 6 X_test_new_feat.shape = (X_test_new_feat.shape[0],1)
 7 X_test_extended = np.hstack([X_test,X_test_new_feat])
 8 scaler = StandardScaler()
 9 X_train_extended_scaled = scaler.fit_transform(X_train_extended)
10 X_test_extended_scaled = scaler.transform(X_test_extended)
11 regressor = KNeighborsRegressor()
12 regressor.fit(X_train_extended_scaled,Y_train)
13 Y_est = regressor.predict(X_test_extended_scaled)
14 print("MSE=",mean_squared_error(Y_test,Y_est))
MSE= 0.3796934162768246

注:sqrt()属于非线性变换。

我们可以看到这次的MSE又小了,说明我们这次特征的非线性变换很有效。



原文地址:https://www.cnblogs.com/guojiaxue/p/12598740.html

时间: 2024-10-11 01:45:56

数据科学流程之创建新特征的相关文章

Kaggle泰坦尼克数据科学解决方案

原文地址如下: https://www.kaggle.com/startupsci/titanic-data-science-solutions 看完一遍,什么也没记住,于是干脆直接翻译一遍. 然鹅,依旧没记住什么. ---------------------------------------------------------------- p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 16.0px SimSun } p.p1 { margin:

敏捷数据科学:用Hadoop创建数据分析应用

敏捷数据科学:用Hadoop创建数据分析应用(数据分析最佳实践入门敏捷大数据首作分步骤|全流程演示思路.工具与方法) [美]Russell Jurney(拉塞尔·朱尔尼) 著   冯文中 朱洪波 译 ISBN 978-7-121-23619-8 2014年7月出版 定价:49.00元 184页 16开 编辑推荐 对大数据的挖掘需要投入大量的人力和时间.怎么才能确保构建的是一个正确的模型?通过这本实践指南,你可以学到一套灵活的工具和方法论,在Hadoop上构建数据分析应用. 使用诸如Python.

大数据科学新发展展望:不得不知的四大趋势

从2012年开始,几乎人人(至少是互联网界)言必称大数据,似乎不和大数据沾点边都不好意思和别人聊天.从2016年开始,大数据系统逐步开始在企业中进入部署阶段,大数据的炒作逐渐散去,随之而来的是应用的蓬勃发展期,一些代表成熟技术的标志性IPO在国内外资本市场也不断出现.转眼间,大数据几年前经历的泡沫正在无可争议地转移到人工智能身上.可以说,在过去的一年,AI所经历的共同意识"大爆炸"与当年的大数据相比,有过之而无不及.最近风口又转移到区块链上了,某种程度上也成为业内人士焦虑的一种诱因了.

机器学习特征表达——日期与时间特征做离散处理(数字到分类的映射),稀疏类分组(相似特征归档),创建虚拟变量(提取新特征) 本质就是要么多变少,或少变多

特征表达 接下来要谈到的特征工程类型虽然简单却影响巨大.我们将其称为特征表达. 你的数据并不一定总是理想格式.你需要考虑是否有必要通过另一种形式进行特征表达以获取有用信息. 日期与时间特征: 我们假设你拥有purchase_datetime特征.从中提取purchase_day_of_week与purchase_hour_of_day两项特征可能会更有用.你还可以进行观察聚类以创建诸如purchases_over_last_30_days这类特征. 数字到分类的映射: 假设你拥有years_in

laravel创建新model数据的两种方法

laravel中的CRUD操作中,通过对代表数据表中row的model对象操作,来更新数据库表. 对于创建新的row的操作,有两种功能上相同的方法: 1.create: $user = User::create(array('email => '[email protected]','password'=>'mypassword')); 2.new and save $user = new User; $user->email = '[email protected]'; $user-&

WordPress插件制作教程(五): 创建新的数据表

上一篇讲解了怎样将数据保存到数据库,今天为大家讲解创建新的数据表,也就是说当我们激活插件的时候,会在该数据库下面创建一个新的数据表出来.原理很简单,激活插件的时候运行创建数据库的代码.看下面代码: <?php /** * @package 创建数据表 * @version 1.0 */ /* Plugin Name: 创建数据表 Plugin URI: http://www.cnblogs.com/fxmbz/p/4060296.html Description: 这是一款简单的插件样例,激活插

.net使用SqlBulkCopy导入数据(创建新表)

原文:.net使用SqlBulkCopy导入数据(创建新表) .net2.0后ado.net提供了一个快速导入sqlserver的方法sqlbulkcopy.导入效率非常高. 包装了一个简单的sqlbulkcopy类,用于数据从datatable导入到sqlserver.代码如下: /// <summary> /// 将DataTable写入数据库的表中 /// </summary> /// <param name="source">数据源DataT

灵玖软件:大数据语言新特征发现

信息的基本单位是句子,一个句子可以较表达完整连贯的易于理解的语义.句子中起主要作用的往往是关键词.词组或短语,而句子中的其他成分只是起到进一步修饰连接的作用,它们只是对基本信息的细化和补充.一旦获取了这些有意义的关键信息,便能获取句子的基本信息.因此,新特征语言和有意义串发现对中文自然语言理解是很有意义的.发现频繁使用的新词和短语等有意义串不仅能改进分词准确率,也有着其他广泛的应用前景.其应用领域主要如下几个方面: 首先,是对信息检索索引词的分析.例如,"计算技术研究所"是一个完整的查

ios新特征 ARC详解

IOS ARC 分类: IOS ARC2013-01-17 09:16 2069人阅读 评论(0) 收藏 举报 目录(?)[+] 关闭工程的ARC(Automatic Reference Counting) 顺带附上ARC教程 本文部分实例取自iOS 5 Toturail一书中关于ARC的教程和公开内容,仅用于技术交流和讨论.请不要将本文的部分或全部内容用于商用,谢谢合作. 欢迎转载本文,但是转载请注明本文出处:http://www.onevcat.com/2012/06/arc-hand-by