机器学习中的几种数据变换形式

如何对定性和定量数据处理?处理后对算法的影响?这是在机器学习中困扰我的问ge题。参考了几位大佬的博客,加上自己的理解,总结一下,以备以后查看。
本例中的数据集全部来kaggle titanic生存预测比赛

定量数据处理

为什么要对定性数据做处理?因为sklearn的模型只能处理数值属性,所以这里先仅选取数值特征,但在实际的应用中需要将非数值特征转换为数值特征。

one-hot编码:

又称独热编码、一位有效编码。其方法是使用N位状态寄存器来对N个状态进行编码,每个状态都有它独立的寄存器位,并且在任意时候,其中只有一位有效。

机器学习库

在机器学习中常用于文本分类。缺点是只能对数据类型的特征分类,数值类型无能为力

sklearn.feature_extraction.text .CountVectorizer

代码演示:

注意:res返回的是一个数组对象,调用toarray()方法显示,这种格式也给后续处理增加了麻烦,因为不能直接拼接到原数据上。或许它只是适用于这种文本分类的处理吧,

pandas 库

pandas库也提供了one-hot 编码的API,而且比机器学习库更强大

pandas.get_dummies

注意这里返回的是DataFrame格式因此可以和原数据进行连接
看上面的代码res返回对象能够直接连接数据,这是因为返回对象是DataFrame格式的。
这种返回格式更适合我们,简化了后续处理

其他类型编码

对于分类的种类比较多,或者字段是数值型但是又不具有排序意义的数值,再用one-hot 编码就不太合适了.下面是实例。

pandas.factorize

当一个feature有10几种甚至几百种取值可能的时候,使用get_summies是一件很恐怖的事情。例如feature1取值有[“a”,“b”,…“z”]26中可能的话,那么显然用哑变量就会把这一个feature变为26列。factorize()函数就是解决这个问题的。

Cabin(船舱号)这种标称属性值,出现的变量比较多。我们使用pd.factorize

fare_factor=pd.factorize(data.Cabin)                          

fare_factor
(array([ -1,   0,  -1,   1,  -1,  -1,   2,  -1,  -1,  -1,   3,   4,  -1,
         -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,   5,  -1,   6,  -1,  -1,
         -1,   7,  -1,  -1,  -1,   8,  -1,  -1,  -1,  -1,  -1,  -1,  -1,
         -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,
          9,  -1,  10,  11,  -1,  -1,  -1,  -1,  -1,  12,  13,  -1,  -1,
         -1,  14,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  15,  -1,  -1,
         -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,   7,  -1,  -1,
         -1,  16,  -1,  -1,  -1,  17,  18,  -1,  -1,  -1,  -1,  19,  -1,
         -1,  -1,  -1,  -1,  -1,  -1,  20,  -1,  -1,  -1,  -1,  -1,  -1,
         -1,  21,  -1,  -1,  -1,  -1,  22,  19,  -1,  -1,  -1,  23,  -1,
         -1,  -1,  -1,  -1,  -1,  -1,  24,   1,  -1,  25,  -1,  -1,  -1,
         -1,  -1,  -1,  -1,  -1,  26,  -1,  -1,  27,  -1,  -1,  -1,  -1,
         -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  28,  -1,  -1,
         -1,  29,  -1,  -1,  -1,  30,  -1,  -1,  31,  -1,  -1,  -1,  -1,
         -1,  32,  -1,  33,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  26,  34,
         35,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,   3,  -1,  -1,
         -1,  36,  -1,  -1,  -1,  -1,  -1,  37,  -1,  -1,  38,  -1,  -1,
         -1,  -1,  -1,  39,  -1,  -1,  -1,  -1,  -1,  13,  -1,  -1,  -1,
         -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  40,  -1,
         -1,  41,  -1,  -1,   3,  42,  -1,  -1,  -1,  -1,  43,  -1,  -1,
         -1,  -1,  44,  45,  -1,  -1,  -1,  -1,  46,  47,  -1,  -1,  -1,
         48,  -1,  49,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  50,  -1,
         -1,  -1,  -1,  -1,  -1,  51,  52,  -1,  -1,  -1,  -1,  53,  54,
         21,  -1,  -1,  -1,  22,  -1,  53,  -1,  55,  -1,  56,  57,  58,
         -1,  -1,  -1,  -1,  -1,  -1,  59,  60,  -1,  -1,  -1,  -1,  -1,
         61,  -1,  52,  -1,  62,  -1,  63,  64,  -1,  -1,  -1,  27,  65,
         -1,  66,  26,   7,  -1,  -1,  -1,  14,  -1,  -1,  -1,  -1,  -1,
         67,  -1,  -1,  -1,  -1,  28,  -1,  -1,  -1,  -1,  -1,  -1,  -1,
         -1,  -1,  68,  -1,  -1,  69,  70,  -1,  -1,  -1,  -1,  -1,  -1,
         71,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,
         72,  -1,  -1,  37,   3,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,
         -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  40,  -1,  -1,  -1,
         -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,
         73,  11,  -1,  -1,  -1,  74,  72,  -1,  -1,   7,  -1,  -1,  -1,
         -1,  -1,  -1,  75,  -1,  -1,  -1,  76,  -1,  -1,  77,  78,  -1,
         -1,  79,  80,  -1,  -1,  81,  -1,  82,  -1,  -1,  -1,  -1,  -1,
         -1,  -1,  -1,  -1,  -1,  52,  -1,  83,  -1,  -1,  -1,  -1,  -1,
         -1,  -1,  -1,  51,  -1,  39,  84,  -1,  -1,  -1,  -1,  85,  -1,
         -1,  -1,  86,  -1,  53,  -1,  -1,  -1,  -1,  -1,  87,  55,  -1,
         -1,  -1,  -1,  -1,  -1,  88,  -1,  -1,  89,  14,  -1,  -1,  -1,
         90,  -1,  -1,  62,  -1,  -1,  -1,  91,  -1,  -1,  -1,  -1,  -1,
         -1,  -1,  -1,  92,  -1,  -1,  93,  94,  -1,  -1,  -1,  95,  -1,
         -1,  -1,  -1,  -1,  96,  -1,  -1,  -1,  -1,  -1,  97,  -1,  44,
         -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  98,
         88,  -1,  -1,  -1,  -1,  74,  -1,  -1,  -1,  99,  -1, 100,  -1,
        101,  -1, 102,  -1,  -1,  -1,  86,  -1,  -1,  -1,  -1,  -1,  -1,
         -1, 103,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  46,  -1,
         -1,  -1,  -1,  -1,  -1,  -1,  -1,  32,  -1,  -1, 104,  -1,  -1,
         -1, 105,  -1, 106,  -1,  -1, 107,  -1, 108,  -1,  -1,  -1,  -1,
         -1,  -1,  -1,  -1,  69,  -1,  -1,  -1,   9,  -1, 109,  -1,  -1,
         -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1, 110,  -1,  -1, 111,
         -1,  -1,  -1,  -1,  -1,  -1, 112,  -1, 113,  -1,  -1,  -1,  -1,
         -1,  -1,  -1, 114,  -1, 115,  -1,  -1,  -1,  -1,  -1,  -1,  -1,
        116, 117,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  99, 118, 119, 120,
         -1,  -1,  -1,  -1,  -1, 120,  -1,  -1, 121,  63, 112,  -1,  -1,
         15, 122,  22,  -1,  -1,  -1,  -1,  -1,  -1, 123,  -1,  -1,  -1,
         -1,  -1, 116,  -1,  -1,  -1,  -1,  -1,  -1, 124,  -1,  -1, 125,
        126,  58,  -1,  -1,  94,  -1,  -1, 127,  -1,  -1, 128,  -1,  -1,
         -1,  -1,  -1,  -1,  -1,  43,  -1,  -1,  -1,  72,  -1, 129,  -1,
         -1,  -1,  -1,  -1,  -1, 130,  -1,  -1,  -1, 131,  -1,  -1, 132,
         -1, 117, 133,  -1,  -1,  -1,  -1,  -1,  -1, 134,  -1,  -1,  -1,
         -1,  -1,  -1, 135,  -1,  -1,  -1,  -1,  -1,  72,  -1,  -1,  -1,
        136,  -1,  -1, 123,  -1,  -1,  -1,  -1,  -1, 137,  -1,  -1,  -1,
         -1, 138,  -1,  -1, 128,  -1,  -1,  -1,  -1,  -1,  12,  -1,  -1,
         -1,  -1,  -1, 139,  -1,  -1,  -1, 140,  -1,  -1,  -1,  -1,  -1,
         -1,  -1,  -1,  -1,  78,  -1,  -1,  -1, 141,  -1,  -1,  -1, 142,
         -1,  -1,  -1,  -1, 135,  -1,  -1,  -1,  -1, 143,  -1,  -1,  -1,
         41, 114,  -1,  -1,  -1,  -1,  -1,  -1, 144,  -1,  -1,  -1,  -1,
         -1,  -1,  -1, 145,  -1, 146,  -1], dtype=int64),
 Index(['C85', 'C123', 'E46', 'G6', 'C103', 'D56', 'A6', 'C23 C25 C27', 'B78',
        'D33',
        ...
        'B102', 'B69', 'E49', 'C47', 'D28', 'E17', 'A24', 'C50', 'B42', 'C148'],
       dtype='object', length=147))

结果以元组形式返回了两列数据,第一列是值,第二列是对应的索引,每个索引可以有n个值,每个值只有一个对应的索引。我们只要获取到值就可以了。取元组的第一个值获得数据列表并从新命名。

data['fare_facotr']=fare_factor[0]

定量数据处理

定量数据可理解为有实际意义的数值型数据

规范化

数据规范化通过将数据压缩到一个范围内(通常是0-1或者-1-1)赋予所有属性相等的权重。对于涉及神经网络的分类算法或者基于距离度量的分类和聚类,规范化特别有用。规范化方法有多种,如rescaling logarithmic normalize等,可以在这里找到各种规范化方法的具体实现。但是有些时候并不需要规范化,比如算法使用相似度函数而不是距离函数的时候,比如随机森林,它从不比较一个特征与另一个特征,不许要规范化。由此可见,是否规范化要依据算法而定。

机器学习裤

sklearn.preprocessing.StandardScaler

代码:

	sklearn.preprocessing import StandardScaler
	scaler = StandardScaler()
	data['Age_scaler']=scaler.fit_transform(data['Age']).reshape(-1,1)

由于scaler.fit_transform()后返回的是一个一维数组因此我们用reshape再转换
看一下效果

data['Age_scaler'].head()
0   -0.530377
1    0.571831
2   -0.254825
3    0.365167
4    0.365167
Name: Age_scaler, dtype: float64

“箱”化

通过观察“邻居”(即周围的值)将连续数据离散化。存储的值被分布到一些“桶”或“箱“”中,就像直方图的bin将数据划分成几块一样。下面的代码对Fare进行Binning。

pandas 库

pandas.qcut
data['Fare_bin'] = pd.qcut(data['Fare'], 5)

参数5代表分为5组数据,返回一个‘’范畴‘’类型数据,这种数据将原来的每行数值分别转化为一个范围。对于分组得到的数据我们可以再次对其进行定性数据处理。

data['Fare_bin_id'] = pd.factorize(data['Fare_bin'])[0]
fare_bin_dummies_df = pd.get_dummies(data['Fare_bin']).rename(columns=lambda x: 'Fare_' + str(x))

将新生成的DataFrame连接到data中

data = pd.concat([data, fare_bin_dummies_df], axis=1)

以上是我个人的理解,欢迎批评指正

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值