如何对定性和定量数据处理?处理后对算法的影响?这是在机器学习中困扰我的问ge题。参考了几位大佬的博客,加上自己的理解,总结一下,以备以后查看。
本例中的数据集全部来kaggle titanic生存预测比赛
定量数据处理
为什么要对定性数据做处理?因为sklearn的模型只能处理数值属性,所以这里先仅选取数值特征,但在实际的应用中需要将非数值特征转换为数值特征。
one-hot编码:
又称独热编码、一位有效编码。其方法是使用N位状态寄存器来对N个状态进行编码,每个状态都有它独立的寄存器位,并且在任意时候,其中只有一位有效。
机器学习库
在机器学习中常用于文本分类。缺点是只能对数据类型的特征分类,数值类型无能为力
sklearn.feature_extraction.text .CountVectorizer
代码演示:
注意:res返回的是一个数组对象,调用toarray()方法显示,这种格式也给后续处理增加了麻烦,因为不能直接拼接到原数据上。或许它只是适用于这种文本分类的处理吧,
pandas 库
pandas库也提供了one-hot 编码的API,而且比机器学习库更强大
pandas.get_dummies
看上面的代码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)
以上是我个人的理解,欢迎批评指正